汇编中的REPZ CMPSB
repz cmpsb 如果ds:si和es:di所指向的兩個(gè)字節(jié)相等,則繼續(xù)比較。
CMPSB指令,是用 DS:[SI] 所指的字節(jié)單元內(nèi)容,減去 ES:[DI] 所指的字節(jié)單元的內(nèi)容。
DS:[SI] 是被減數(shù), ES:[DI] 是減數(shù)。
驗(yàn)證方法很簡(jiǎn)單,將這兩個(gè)內(nèi)存單元的內(nèi)容設(shè)置成不同的數(shù),看指令執(zhí)行后CF是0還是1,就能證明了。
例如,你將DS:[SI]單元內(nèi)容設(shè)成01H,將ES:[DI]單元內(nèi)容設(shè)成02H,然后執(zhí)行CMPSB,你會(huì)發(fā)現(xiàn),CF是1,而不是0。這就證明了是前者減去后者的運(yùn)算。
ZF=1表示是0,對(duì)嗎?ZF=0,結(jié)果非0
是的,ZF=1,表明運(yùn)算結(jié)果為0
cmpsb和rep cmpsb的區(qū)別?他們的執(zhí)行過(guò)程是怎樣的?
答:
repe/repz:相等則重復(fù)
32位:
rep string_op (串操作指令)
string_op : ins, movs,outs,stos
rep:一個(gè)串操作前綴,它使其后的串操作重復(fù)執(zhí)行ecx次。
操作:
while (ecx!=0)
{
ecx=ecx-1;
string_op; /串操作/
}
;========================
repe/repz string_op
string_op:cmps,scas
repz:串操作前綴,重復(fù)執(zhí)行ecx次或執(zhí)行到ZF為0時(shí)。
操作:
while(ecx!=0)
{
ecx=ecx-1;
string_op;
if(ZF==0)
break;
}
cmpsb一次只能比較字符串里的一個(gè)字符,比較整個(gè)串需要用到循環(huán),可以在前加上前綴(repz/repe或者rep)。
答:是的,自己有什么想法的時(shí)候,要多動(dòng)手,用debug
在debug中怎么用a命令寫(xiě)匯編指令
,比如像這樣
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
總結(jié)
以上是生活随笔為你收集整理的汇编中的REPZ CMPSB的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 什么是断点,为什么要设置断点?断点的作用
- 下一篇: 冒泡排序(O(n^2))