Str_compare - 来自欧文的装配书

时间:2014-05-03 04:16:00

标签: assembly strcmp

    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字节后面的内容未知字节,因此该程序会崩溃,对吗?

1 个答案:

答案 0 :(得分:0)

  

inc esi会使esi指向string1的0字节后面的内容未知字节,因此该程序会崩溃,对吗?

指向 X只是意味着持有 X的地址。保持一个可被解释为无效地址的值是完全正确的,只要因为你不试图取消引用指针(即从地址读取)。

即使你 尝试从[esi]读取esi超过string1一个字节,也可能没有任何崩溃。您很可能在string1之后找到了属于您的程序的其他数据,并且您的程序可以访问该数据。因此,阅读string1以外的内容只会读取在那里发生的任何事情,直到超出程序数据部分或堆栈结束或恰好位于string1的任何位置。

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