這篇重度參考小木偶前輩的第12章字串,http://home.educities.edu.tw/wanker742126/asm/ch12.html
十多年前,前輩debug用很熟。
--------------------------
因為前輩的教學很早就切入程式,感覺至乎進展得太快,畢竟組語的Feeling還沒上來,雖然在下也覺得OK,但總覺得可以有更簡易的學習法,所以至少會有20(14h)篇的debug後,才來切入成篇程式,那時會更重度參考前輩的教學。
--------------------------
SI,DI是暫存器,一是來源索引(Source Index), 另一是目的地(Destination Index),
因為高階語言基本上沒有一列一列位址的概念(程式還是一列一列往下寫),
沒有明定,那一段位址從那裏開始,放進字串,到那裏結束。
這樣寫,太麻煩。可以做個對比,高階語言太高階了,電腦看不懂的。
稍做修改測試一下,
C:\>debug
-a 100
08FA:0100 mov cx,10
08FA:0103 mov si,200
08FA:0106 mov di,300
08FA:0109 rep movsb
08FA:010B
-a 200
08FA:0200 db "Tim learn assembly now"
08FA:0216
-t
SI,DI寫入了,SI=0200 DI=0300
測試幾次後,rep movsb,確實有rep(repeat)的效果,這時候,IP(指令索引,確實一直重覆指向109),這時候看一下目的區300的記憶體寫入情況。
-d cs:300
08FA:0300 54 69 6D 20 E8 A8 D0 59-0B C0 74 1E 68 33 05 8D Tim ...Y..t.h3..
確實是一個字一個字搬。
我小改了一下程式,把字串放了22個字,比計次暫存器放的次數10(16)還多,
執行後,發現,
-d 300
08FA:0300 54 69 6D 20 6C 65 61 72-6E 20 61 73 73 65 6D 62 Tim learn assemb
08FA:0310 86 5E FE 50 E8 5F 5E 59-59 0B C0 74 0D 68 36 05 .^.P._^YY..t.h6.
多出來的字,不會COPY過去。
rep的次數,確實是參考CX,CX說幾次,就rep幾次。
有趣的地方,movsb這個指令,裏面有個mov,但它的動作,不是搬家,而是複製一份過去。
所以原來位址200的地方,仍然還有字串。
摘錄一下前輩的話,
這個網頁是小木偶用 HomeSite 3.01/4.52/5.5 等版本一字一句輸入的,解說圖片則是用 Paint Shop Pro 6.02/9.01 一點一線所繪,它們都是我的心血結晶,所以如果您要引用這個網頁的任何資料,煩請附上來自小木偶的網頁並來信告訴小木偶。
HomeSite在下很遜,真得沒聽過這套網頁軟體, Paint Shop Pro好像也沒有,painter, photoshop有聽過,但這不損於這網站的歷史地位,
小弟有去信告知了。
小木偶前輩提到,
MOVSW 的作用方式都和 MOVSB 相同,所不同的是 MOVSW 每次搬移一個字組,所以每次搬運完 SI﹑DI 會增加 2,而 CX 仍然減少一。
我們來試試效果,
C:\>debug
-a
08FA:0100 mov cx,10
08FA:0103 mov si,200
08FA:0106 mov di,300
08FA:0109
-a 200
08FA:0200 dw "Tim learned again about asm"
08FA:021B
-a 109
08FA:0109 rep movsw
08FA:010B
單步執行,幾次後,觀察SI,DI值變化,
SI=0202 DI=0302
SI=0204 DI=0304
SI=0206 DI=0306
SI﹑DI 會增加 2, 這句話是對的。
-d cs:300
08FA:0300 54 69 6D 20 6C 65 D0 59-0B C0 74 1E 68 33 05 8D Tim le.Y..t.h3..
執行3次,copy了6個字元。
-g 10b 直接執行到最後一行。
看一下寫入記憶體兩倍的長度。
-d cs:300
08FA:0300 54 69 6D 20 6C 65 61 72-6E 65 64 20 61 67 61 69 Tim learned agai
08FA:0310 6E 20 61 62 6F 75 74 20-61 73 6D 7D 14 8B 46 FE n about asm}..F.
這次超過16個字元的部分,有COPY到。
前輩一章的量,我還吸收不到5分之一,連指令都還沒介紹完。沒進入主程式。
其他部分待下回,下下回,下下下回分解。
複習了之前所介紹 db, dw的型別及長度。
最近開始備戰跑步,
受了ted99tw兄 打球運動的影響,
胖老頭開始跑步了,
2012臺中市第31屆舒跑杯路跑 (101年11月18日(星期日))
http://www.vitalon.com.tw/EventNews_Content.aspx?N=193
有空來台中跑跑。
sunallen兄,每天1公里,少拔一個罐。
共勉之。
timloo提到:
有空來台中跑跑。
咦,我的卡丁車呢?哦,帳號過期囉......
“組語組語耶耶耶”.....這是無上昏睡咒語,什麼,你看了咒語還醒著?
嗯嗯,那你有慧根,三分鐘後甲種服裝,連集合場集合,準備往小木偶網站報到!