最近剛剛接觸彙編,建議大家和我一樣能通過DEBUG更好的理解代碼.這樣不但能調試程序,而且使你對內存以及寄存器也能夠隨時掌握他的內容,更有助於你鞏固反彙編出的指令的作用!
就不多寫了直接來個簡單點的,因爲主要是針對和我一樣的初學者,代碼量太大未必是件好事(對於理解起來)
代碼如下: X*16+Y結果存放到ZZZ
dseg segment
xxx dw 1234h
yyy dw 5678h
zzz dd ?
dseg ends
cseg segment
assume cs:cseg,ds:dseg
start: mov ax,dseg
mov ds,ax
mov ax,xxx
xor dx,dx
mov ax,xxx
mov dx,16
mul dx
add ax,yyy
adc dx,0
mov word ptr zzz,ax
mov word ptr zzz+2,dx
mov ah,4ch
int 21h
cseg ends
end start
先DEBUG加載一下程序EXE .反彙編一下看看到底彙編程序彙編出什麼樣的代碼 並-R來查看一下當前的各個寄存器的內容 如圖:
我們可以看到數據段的地址被分配爲13C5
下面開始我們-T來跟蹤一下: 如圖
單步跟蹤,通過給DS賦值 DS的內容在MOV DS,AX後變爲13C5
XXX也被彙編成DS:[0000],也就是我們在DESG中定義的 他的值爲1234H MOV後AX變爲1234H
XOR後DX的內容變爲0 主要爲擴展成32位的結果
繼續跟蹤如圖:
因爲*16 之前DX已經爲16 所以MUL後低字在AX裏 ,高字在DX裏
加上5678H 彙編後爲DS:[0002] 加如AX 爲防止進位 在跟一個ADC把結果低字存到DS:[0004],高字存到DS:[0006]
下面我門來看一下數據段的內存值:如圖
在這裏DOS調用就先不看了,所以直接來-D看一看內存低字79B8 和高字0001都以存到相應內存!
在學習彙編的過程中是有寫枯燥,但希望大家不要總看書,不實踐,這樣你的學習效果不一定很好,如果你還沒能力寫一些程序可以象我這樣來調試一下程序,有助於你對程序的理解.這比你看書靠腦子琢磨要好的多.就寫到這.
轉貼請著名出處.