汇编 - 使用rep循环遍历字符串

时间:2012-03-10 10:54:24

标签: assembly x86

我读了一本关于汇编的书,它有下一个代码:

.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中。为什么说我们继续再次扫描字符串?

2 个答案:

答案 0 :(得分:1)

这就是重复的方式:

  1. ecx = 0或Zeroflag = 0 - >出
  2. dec ecx
  3. 执行命令
  4. 增加(或减少)esi和edi。
  5. 回到1。
  6. 因此,esi和edi指向地址+ 1(或向后方向的-1)。

答案 1 :(得分:0)

如果DF寄存器中的方向标记EFLAGS已清除,则比较退出后,ESI和EDI会递增。所以dec指令正在补偿这一点。我认为。 rep字符串指令有点像8086'CISC'时期的宿醉。