我读了一本关于汇编的书,它有下一个代码:
.DATA
string1 db ’abcdfghi’,0
strLen EQU $ - string1
string2 db ’abcdefgh’,0
.CODE
.STARTUP
mov AX,DS ; set up ES
mov ES,AX ; to the data segment
mov ECX,strLen
mov ESI,string1
mov EDI,string2
cld ; forward direction
repe cmpsb
leaves ESI pointing to g in string1 and EDI to f in string2. Therefore, adding
dec ESI
dec EDI
leaves ESI and EDI pointing to the last character that differs. Then we can use,
ja str1Above
我们需要写的是:
dec ESI
dec EDI
因为leaves ESI pointing to g in string1 and EDI to f in string2.
但为什么呢?当我们到达ESI
中的'f'和EDI
中的'e'时,repe
条件无法满足,为此我们将退出循环,其中'f'是在ESI
中,“e”在EDI
中。为什么说我们继续再次扫描字符串?
答案 0 :(得分:1)
这就是重复的方式:
因此,esi和edi指向地址+ 1(或向后方向的-1)。
答案 1 :(得分:0)
如果DF
寄存器中的方向标记EFLAGS
已清除,则比较退出后,ESI和EDI会递增。所以dec
指令正在补偿这一点。我认为。 rep
字符串指令有点像8086'CISC'时期的宿醉。