本章核心
写一个程序计算2^3
代码如下:
assume cs:abc
abc segment
mov ax,2
add ax,ax
add ax,ax
mov ax,4c00H
int 21H
abc ends
end
网上下载了masm5.0工具包,解压到文件夹d:\masm\下
运行dosbox
mount c d:\masm\
c:
然后编译和链接,一路回车,生成ex1.exe
masm ex1.txt
link ex1.obj
最后debug ex1.exe即可
先看CX=000C,表示程序长度为十六进制的C,即12字节。
由于程序装入内存后,会有256字节的PSP区域。
DS=075AH,SP=0,指向PSP的开头。
而经过256字节,即075AH+10H=076AH:0,来到第一条指令的位置,恰为CS:IP的值076A:0,表示程序入口。
由于debug默认所有数据都用16进制表示,所以0002没有带H。
-u查看指令。
由于程序长度只有C,所以只需要看到076A:0000~000B即可。
发现指令内容,同我们在1.txt中写入的汇编指令完全一致。
t执行命令。
算完2^3,mov ax,4C00。
来到int 21H这一行,要用p执行。
由于本例是debug程序载入的ex1.exe,所以运行结束回到debug程序。
q退出debug,回到command。
实验3
assume cs:codesg
codesg segment
mov ax,2000H
mov ss,ax
mov sp,0
add sp,10
pop ax
pop bx
push ax
push bx
pop ax
pop bx
mov ax,4c00H
int 21H
codesg end
end
t执行
t执行
栈顶变为SS=2000,SP=0000
t执行
SP=000A
t执行
读出SS:SP=2000:000A处的值0000赋值给AX,然后SP+=2,得到SP=000C。
t执行。
读出SS:SP=2000:000C处的值0000复制给BX,然后SP+=2,得到SP=000E
t执行
SP-=2得到SP=000C
将AX中的值0000,存入SS:SP=2000:000C~000D位置
t执行
SP-=2得到SP=000A
将BX中的值0000,存入SS:SP=2000:000A~000B位置
最后两条
pop AX
pop BX
就不放了。