【问题标题】:Str_compare -- from Irvine's assembly bookStr_compare -- 来自 Irvine 的汇编手册
【发布时间】:2014-05-03 04:16:00
【问题描述】:
    Str_compare PROC USES eax edx esi edi,
        string1: PTR BYTE,
        string2: PTR BYTE
    ;
    ; Compare two strings.
    ; Returns nothing, but the Zero and Carry flags are affected
    ; exactly as they would be by the CMP instruction.
    ;-----------------------------------------------------------
        mov  esi, string1
        mov  edi, string2
    L1: mov  al, [esi]
        mov  dl, [edi]
        cmp  al, 0
        jne  L2
        cmp  dl, 0
        jne  L2
        jmp  L3

    L2: inc  esi
        inc  edi
        cmp  al, dl
        je   L1

    L3: ret
    Str_compare ENDP

针对上面的代码,如果string1 只是byte 0string2 是一些长度不为0 的常见字符串呢?
我想,当cpu第一次进入L1时,IP会在cmp dl, 0之后跳转到L2。 inc esi 会让 esi 指向 string1 的 0 字节之后的内容未知字节,所以这个程序会崩溃,对吧?

【问题讨论】:

  • esi 可以有任何你想要的值,只要你不尝试访问它...... Irvine 博士的代码没有......
  • @FrankKotler Dr. Irvine's code does not... 是什么意思?
  • mov al, [esi]esi 指向“坏地方”后不做。迈克尔说的。学习使用调试器或学习像 CPU 一样思考。后者可能更容易。 :)

标签: assembly strcmp


【解决方案1】:

inc esi 将使esi 指向string1 的0 字节之后的内容未知字节,所以这个程序会崩溃,对吧?

指向 X 仅仅意味着保存 X 的地址。保存一个可以被解释为无效地址的值是完全可以的,只要你不这样做' t 尝试取消引用指针(即从地址读取)。

即使您确实尝试在esi 指向超出string1 一个字节时从[esi] 读取,也可能不会发生任何崩溃。您很可能在string1 之后获得了其他数据,这些数据也属于您的程序,因此您的程序可以访问这些数据。因此,超出string1 的阅读将只阅读那里发生的任何内容,直到您超出程序数据部分或堆栈的末尾或恰好位于string1 的任何位置。

Str_compare 函数中如果一个字符串为空(仅包含 NUL 终止符)而另一个非空字符串会发生什么,cmp al, dl 会将 NUL 终止符与非 NUL- 终止符进行比较终结者。因此,条件je L1 不会跳回L1,而是将执行L3 处的ret,导致函数返回。因此,esiedi 中增加的地址不会被取消引用。

【讨论】:

  • 在string1只是"\0"的情况下,这个程序会发生什么? cpu第二次进入L1,比较0和一个未知值(即[esi]),请问这是bug吗?
  • 如果string1是一个空字符串('\0')并且string2是一个非空字符串,cmp al, dl在第一次迭代时不会设置ZF,所以@ 987654342@ 不会跳转,因此会执行ret,从而退出Str_compare 例程。
  • 但是inc esiinc edicmp al, dl之前已经被执行过了,我们怎么知道[esi]是否等于[edi]呢?假设string2[1] 是 0x1,而 string1 之后的字节也是 0x1。
  • cmp al,dl 不是从 [esi][edi] 读取的。这些读取是在您执行 mov al, [esi]mov dl, [edi] 时完成的,这发生在您增加指针之前。
猜你喜欢
  • 1970-01-01
  • 2016-09-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-03
  • 1970-01-01
  • 2015-09-14
  • 1970-01-01
相关资源
最近更新 更多