从汇编程序开始

1
2
3
4
5
6
7
8
9
10
11
12
assume cs:codesg

codesg segment
mov ax,0123H
mov bx,0456H
add ax,bx
add ax,ax

mov ax,4c00H
int 21H
codesg ends
end

伪指令

1
2
段名 segment
段名 ends

endends 不一样, end标记整个程序的结束
assume 将有特定用途的段和相关的段寄存器关联起来

程序返回

1
2
mov ax,4c00H
int 21H

编写代码,使用 MASM.exe 编译,然后使用 LINK.exe 进行链接

运行当然是没有结果的,我们需要使用 debug 调试

可执行文件的加载过程

程序加载的时候,找到一个段地址 SA:0000,程序从 SA+10H:0000 处开始运行,SA 存放在 ds寄存器中

刚加载进内存中时,

此时看到 ds 寄存器的内容为 075AH ,所以程序的物理地址就是 ds+10h ,正好符合
在int21 时需要使用 p命令执行

实验3 编译链接跟踪

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
assume cs:codesg
codesg segment
mov ax,2000H ; AX=2000H
mov ss,ax ; SS=2000H
mov sp,0 ; SP=0
add sp,10 ; SP=10
pop ax ; SP=000CH, AX=076AH
pop bx ; SP=000EH, BX=7206H
push ax ; SP=000CH
push bx ; SP=000AH
pop ax ; AX=7c06H
pop bx ; BX=076AH
mov ax,4c00H
int 21H
codesg ends
end

PSP 的头两个字节是CD20,用debug加载,查看PSP的内容