检测点 3.2
(1) 补全下面的程序,使其可以将10000H~1000FH中的8个字,逆序复制到20000H~2000FH中。逆序复制的含义如下表所示(表中内存里的数据均为假设)。
地址 数据(十六进制) 地址 数据(十六进制)
10000H 23 20000H 33
10001H 01 20001H 11
10002H 66 20002H FE
10003H 22 20003H 9A
... ...
1000CH FE 2000CH 66
1000DH 9A 2000DH 22
1000EH 33 2000EH 23
1000FH 11 2000FH 01
给定指令代码:
mov ax, 1000H
mov ds, ax
...
push [0]
push [2]
push [4]
push [6]
push [8]
push [A]
push [C]
push [E]
解题思路:将2000:0~2000:F设置为栈段空间,将1000:0~1000:F内存空间(视为数据段空间)的数据通过push指令逆序传送到栈段空间。
将以下代码补全到上述代码的省略号处:
mov ax, 2000H
mov ss, ax ; 设置栈顶段地址
mov sp, 0010H ; 设置栈顶偏移地址
将上述完整的代码通过Debug的A命令写入3000:0代码段空间,用R命令设置CS=3000H,IP=0000H,再通过T命令执行,以及用D命令来验证指令执行的结果。
注:可以将1000:0~1000:F数据段中的1000:4~1000:A部分数据设置为a1~a8或任意数据。
(2) 改动上题中给定的代码如下:
mov ax, 2000H
mov ds, ax
...
pop [E]
pop [C]
pop [A]
pop [8]
pop [6]
pop [4]
pop [2]
pop [0]
要求补全省略号中的代码以实现相同的逆序复制功能。
解题思路:将1000:0~1000F设置为栈段空间,将2000:0~2000:F视为数据段空间,通过pop指令将栈段空间存储的数据逆序传送到数据段空间。
补全的代码如下:
mov ax, 1000H
mov ss, ax ; 设置栈顶段地址
mov sp, 0 ; 设置栈顶偏移地址
将上述完整的代码通过Debug的A命令写入3000:0代码段空间,用R命令设置CS=3000H,IP=0000H,再通过T命令执行,以及用D命令来验证指令执行的结果。