iT邦幫忙

DAY 15
3

freedos bochs 16位元 組合語言…等系列 第 15

組合語言熱身:debug之E ,CMPSB 和 CMPSW ,字串的比較及ZF零旗標。

今天繼續試小木偶前輩,有講解,沒實作的例子:
http://home.educities.edu.tw/wanker742126/asm/ch12.html
前輩說:

這兩個指令使用方法和 MOVSB﹑MOVSW 相同,而它的作用是將一個字串和另一處的字串比較。如果只有單獨的一個 CMPSB 或 CMPSW 時,CPU 只比較一個位元組或一個字組;當 CMPSB 或 CMPSW 前加上 REP 時,可以比較一個字串。您也可以用 REPE ( 表示 repeat while equal,如果兩字相等則重複 ) 來代替 REP,也可以用 REPZ ( 表示 repeat while zero,如果零旗標為 ZR,則重複 ) 來代替,換句話說 REP﹑REPE 和 REPZ 是相同的。

那您可能會問,如何才知道兩個字串相等?這時您就得檢查『零旗標』了,如果零旗標被設為一 (DEBUG 顯示 ZR),表示兩字串相等,此時兩字串會比較完畢所以 CX 也會一直減少至零。如果零旗標被設為零 (DEBUG 顯示 NZ),表示兩字串不相等,cmps 指令僅僅比較到第一個不相等的字元就停止了,所以 CX 不會為零,SI﹑DI 會指到第一個不相等的位元組或字組之後的位址。

與 MOVS 指令相同的是,CMPS 指令也可以用方向旗標來指定向高位址比較或向低位址比較。

我們來試試

08FA:0100 mov si,200
08FA:0103 mov di,300
08FA:0106
-a 200
08FA:0200 db "Tim"
08FA:0203
-a 300
08FA:0300 db "Tom"
08FA:0303
-a 106
08FA:0106 cmpsb
08FA:0107

單步執行,發現執行完cmpsb時,因為兩字串第一字元都是T所以零旗標由NZ變成ZR
---------------------------
再來試一下rep cmpsb的效果。

-a
08FA:0100 mov cx,3
08FA:0103 mov si,200
08FA:0106 mov di,300
08FA:0109 rep cmpsb
08FA:010B
-a 200
08FA:0200 db "Tim"
08FA:0203
-a 300
08FA:0300 db "Tom"
08FA:0303

單步執行,
第一次比較,T和T相等,第二次比較,i和o不相等,
這時候,再執行下一步,發現不會再比較了,
所以rep cmpsb,會比較到相異時,即停止。

而單步執行時,發現執行的指令是REPE CMPSB,
亦回應,REP,在做字串比較時,等同於REPE,相同時即重覆,相異時即停止的特性。
當相異時,再單步執行,
發現INC SI,SI=0203 DI=0302,DI沒有跟著加1了。

小結:除了加減後結果為0會讓零旗標由NZ變成ZR。比較字串時,當字元相等時,也會
讓零旗標由NZ變成ZR。而不相同時,即停止比較了,IP指令指標暫存器往下指了,不再REPE了。
回頭學C語言時,發現C語言沒有字串這個型別,有字元(CHAR)型別,及字元陣列型別,
看起來,C語言這段和組語是一致的,一個byte一個byte比


上一篇
組合語言熱身:debug之D ,方向旗標(DF Direction Flag),CLD 和 STD
下一篇
組合語言熱身:debug之F,SCASB 和 SCASW , 找尋字串中含某特定字元(byte,word)
系列文
freedos bochs 16位元 組合語言…等17
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

2 則留言

0
ted99tw
iT邦高手 1 級 ‧ 2012-10-08 23:14:20

沙發

組語真是一個單純的世界,就像是另一半,對她好,她就會照三餐煮出滿桌的菜,就算颱風天也要下雨出門去買菜,雖然口裏抱怨這抱怨那,但滋味是甜蜜的。

Tim大另一半要知道有組語這回事,不知會不會掀翻醋醰子了.....

0
timloo
iT邦研究生 2 級 ‧ 2012-10-09 21:10:33

你好準,

昨天我老婆上來訓了我一頓。

她不太懂我在搞什麼。

我要留言

立即登入留言