汇编中的REPZ CMPSB

repz cmpsb 如果ds:si和es:di所指向的两个字节相等,则继续比较。

CMPSB指令,是用 DS:[SI] 所指的字节单元内容,减去 ES:[DI] 所指的字节单元的内容。
DS:[SI] 是被减数, ES:[DI] 是减数。
验证方法很简单,将这两个内存单元的内容设置成不同的数,看指令执行后CF是0还是1,就能证明了。
例如,你将DS:[SI]单元内容设成01H,将ES:[DI]单元内容设成02H,然后执行CMPSB,你会发现,CF是1,而不是0。这就证明了是前者减去后者的运算。

ZF=1表示是0,对吗?ZF=0,结果非0
是的,ZF=1,表明运算结果为0

cmpsb和rep cmpsb的区别?他们的执行过程是怎样的?
答:
repe/repz:相等则重复
32位:
rep string_op (串操作指令)
string_op : ins, movs,outs,stos
rep:一个串操作前缀,它使其后的串操作重复执行ecx次。
操作:
while (ecx!=0)
{
ecx=ecx-1;
string_op; /串操作/
}
;========================
repe/repz string_op
string_op:cmps,scas
repz:串操作前缀,重复执行ecx次或执行到ZF为0时。
操作:
while(ecx!=0)
{
ecx=ecx-1;
string_op;
if(ZF==0)
break;
}

cmpsb一次只能比较字符串里的一个字符,比较整个串需要用到循环,可以在前加上前缀(repz/repe或者rep)。
答:是的,自己有什么想法的时候,要多动手,用debug
在debug中怎么用a命令写汇编指令
,比如像这样
E:>debug
-a
18A6:0100 db “hello world!”
18A6:010C db “world hello!”
18A6:0118 db “hello world!”
18A6:0124 mov si,100
18A6:0127 mov di,10c
18A6:012A mov cx,0c
18A6:012D repz cmpsb
18A6:012F mov si,100
18A6:0132 mov di,118
18A6:0135 mov cx,0c
18A6:0138 repz cmpsb
18A6:013A
-r ip
IP 0100
:124
-t

可参考:https://blog.csdn.net/fulinus/article/details/8277442

发布了149 篇原创文章 · 获赞 22 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/deniece1/article/details/103385449
今日推荐