本文主要是介绍(五)《汇编语言(王爽)》 | 实验 2:用机器指令和汇编指令编程,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
1. 预备知识
- 在 实验1 中提到,Debug 中的指令 d 段地址:偏移地址可查看相应内存单元的值,而其中的段地址其实是存放在 DS 寄存器中。同时,d 指令也提供了一种 CPU 机理的格式:d 段寄存器:偏移地址,其中段寄存器可以是 CS、DS、SS 等,如:
d ds:0 # 查看段地址:0开始的内存区间中的内容
d cs:0 # 查看当前代码段中的指令代码
d ss:0 # 查看当前栈段中的内容
-
同理,e、a、u 等可以带有内存单元的指令中,也可以同 d 指令一样,用段寄存器表示内存单元的段地址。
-
t 指令在修改表示栈段的寄存器 SS 的指令时,下一条指令也紧接着被执行。
2. 实验任务
(1)根据逐条执行指令,写出指令执行完成后的情况。首先,使用 Debug 指令查看相关内存的内容:
指令 | AX | BX | SP | 修改的内存单元地址 | 修改的内存单元内容 |
---|---|---|---|---|---|
mov ax,ffff | FFFF | - | - | - | - |
mov ds,ax | FFFF | - | - | - | - |
mov ax,2200 | 2200 | - | - | - | - |
mov ss,ax | 2200 | - | - | - | - |
mov sp,0100 | 2200 | - | 0100 | - | - |
mov ax,[0] | C0EA(FFFF:0000) | - | 0100 | - | - |
add ax,[2] | C0FC | - | 0100 | - | - |
mov bx,[4] | C0FC | 30F0(FFFF:0004) | 0100 | - | - |
add bx,[6] | C0FC | 6021 | 0100 | - | - |
push ax | C0FC | 6021 | 00FE | 2200:00FE 00FF | C0FC |
push bx | C0FC | 6021 | 00FC | 2200:00FC 00FD | 6021 |
pop ax | 6021 | 6021 | 00FE | - | - |
pop bx | 6021 | C0FC | 0100 | - | - |
push [4] | 6021 | C0FC | 00FE | 2200:00FE 00FF | 30F0 |
push [6] | 6021 | C0FC | 00FC | 2200:00FC 00FD | 2F31 |
说明:SS=2200、SP=0100 表示栈空状态,段寄存器 DS=FFFF:
- 第 6 行,将 FFFF:0000 内存单元的值送入寄存器 AX;
- 第 8 行,将 FFFF:0004 内存单元的值送入寄存器 BX;
- 第 10 行,元素入栈,SP=00FE(0100 - 2),2200:00FF 存放 C0、2000:00FE 存放 FC(大端,下同);
- 第 12 行,当前 SP=2200、SP=00FC,所以将 2200:00FD 的值 60 和 2200:00FC 的值 21 送入寄存器 AX 中,且 SP=00FE(00FC + 2);
- 第 14 行,将 FFFF:0004 内存单元的值入栈,2200:00FF=30、2200:00FE=F0,且 SP=00FE(0100 - 2)。
(2)在没有认为对 2000:0~2000:F 内存单元值更改的情况下,这部分值自动发生了变化。如下图,前四条指令是:
mov ax,2000
mov ss,ax
mov sp,10
只执行了两次 t 指令,程序却已完成三条语句的内容(SP 寄存器内容已更改),指令 mov sp,10 自动执行了,这和预备知识里的最后一点一致,文中提到这与中断机制有关,从而更改了相关内存单元的值。
这篇关于(五)《汇编语言(王爽)》 | 实验 2:用机器指令和汇编指令编程的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!