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