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 0
而string2
是一些长度不为0的常见字符串,那该怎么办?
我想,当cpu第一次进入L1时,IP将在cmp dl, 0
之后跳转到L2。 inc esi
将使esi指向string1的0字节后面的内容未知字节,因此该程序会崩溃,对吗?
答案 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
,导致函数返回。因此,esi
和edi
中递增的地址不会被解除引用。