实验二
预备知识
- D 命令后边可以接上 “段寄存器:偏移地址” 用来指定地址
- E、A、U 这些可以带有内存单元地址的命令中,也可以用段寄存器表示内存单元的段地址
- 在
mov ss,寄存器后如果紧跟mov sp,值,cpu 会在执行完mov ss,寄存器后自动执行mov sp,值
(1)
好的,现在启动 DOSBox,使用 debug,a 命令然后输入代码
在执行完 mov ax,[0] 后 ax 的值为 ds:0000 处的字 0CEAH
add ax,[2] -> ax = 0CEAH + 12H = C0FCH
mov bx,[4] -> bx = 30F0H
add bx,[6] -> bx = 30F0H + 2F31H = 6021H
push ax 后 sp - 2 = 00FEH,修改的内存单元地址是 220FEH 内容为 C0FCH
push bx 后 sp - 2 = 00FCH,修改的内存单元地址是 220FCH 内容为 6021H
pop ax -> ax = 6021H sp + 2 = 00FEH
pop bx -> bx = C0FCH sp + 2 = 0100H
push [4] sp - 2 = 00FEH,修改的内存单元的地址是 220FEH 内容为 30F0H
push [6] sp - 2 = 00FCH,修改的内存单元的地址是 220FCH 内容为 2F31H
(2)
这里是指在一开始 2000:0 ~ 2000:f 中的内容全是0,然后在给 ax bx 等寄存器赋值后,这块内存的值就发生了变化,并且与寄存器中的值相等,显然这就是寄存器当中的值。仅凭现有的知识确实很难解释,待到后续课程自然而然即明白了。
实验三
准备
拿到 MASM.exe 和 LINK.exe 用于编译汇编代码和连接目标文件
链接:pan.baidu.com/s/1zXAwAOUK… 提取码:pejf
(1)
建议将 t1.asm 直接放在 DOSBox 挂载的文件夹下。然后直接 masm t1 link t1 即可得到运行文件了
(2)
debug t1.exe
mov ax,2000 -> ax = 2000H
mov ss,ax -> ss = 2000H sp = 0
add sp, 4 -> sp = 4
pop ax -> ax = 0 ; sp + 2 = 6
pop bx -> bx = 0 ; sp + 2 = 8
push ax -> sp - 2 = 6
push bx -> sp - 2 = 4
pop ax -> ax = 0 ; sp + 2 = 6
pop bx -> bx = 0 ; sp + 2 = 8
mov ax,4c00 -> ax = 4c00H
(3)
d ds:0