最近刚刚接触汇编,建议大家和我样能通过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
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都以存到相应内存!
在学习汇编过程中是有写枯燥,但希望大家不要总看书,不实战,这样你学习效果不定很好,如果你还没能力写些可以象我这样来调试下,有助于你对理解.这比你看书靠脑子琢磨要好多.就写到这.
最新评论