检测点 9.1
(1) 程序如下:
assume cs:code
data segment
data ends
code segment
start: mov ax,data
mov ds,ax
mov bx,0
jmp word ptr [bx+1]
code ends
end start
若要使程序中的 jmp 指令执行后,CS:IP 指向程序的第一条指令,在 data 段中应该定义哪些数据?
答:应该定义至少 3 个字节型数据,并且后两个字节型数据组合成的字数据必须为 0000H,即 data:[1] 字型数据必须为 0000H,才能使得 (IP)=0000H,从而令 CS:IP 指向程序的第一条指令“mov ax,data”。
完整程序代码如下:
assume cs:code
data segment
db 0F3h,0,0,0ACh ; 注意,data:[0] 内存单元存储的 1 个字节数据,如果用包含字母的十六进制数据表示时,必须添加数字 0 作为前缀,否则无法通过编译
data ends
code segment
start: mov ax,data
mov ds,ax
mov bx,0
jmp word ptr [bx+1]
mov ax,4c00h
int 21h
code ends
end start
(2) 程序如下:
assume cs:code
data segment
dd 12345678H
data ends
code segment
start: mov ax,data
mov ds,ax
mov bx,0
mov [bx],__bx____ ; 如果是“mov word ptr [bx],___”,则可以为“mov word ptr [bx],0”。如果写成“mov [bx],0”,则无法通过编译,因为没有显式指明目标内存单元的长度
mov [bx+2],__code____ ; 或 cs
jmp dword ptr ds:[0] ; 存储在 data:0 内存单元的字数据为 0,即 (IP)=0000H;存储在 data:2 内存单元的字数据为 code 段的段地址,即 (CS)=code
code ends
end start
补全程序,使 jmp 指令执行后,CS:IP 指向程序的第一条指令。
完整程序代码如下:
assume cs:code
data segment
dd 12345678h
data ends
code segment
start: mov ax,data
mov ds,ax
mov bx,0
mov [bx],bx ; 不能是“mov [bx],0”,即不能将 idata 赋给 [bx],因为没有显式指明 ds:[bx] 内存单元的长度,所以无法通过编译;除非是“mov word ptr [bx],0”,但题目没有提供 word ptr 伪指令,所以只能将 BX 寄存器中存储的 16 位数据 0000H 传送给 ds:[bx] 内存单元(字型)
mov [bx+2],code ; 或 cs
jmp dword ptr ds:[0] ; 存储在 data:0 内存单元的字数据为 0,即 (IP)=0000H;存储在 data:2 内存单元的字数据为 code 段的段地址,即 (CS)=code
mov ax,4c00h
int 21h
code ends
end start
(3) 用 Debug 查看内存,结果如下:
2000:1000 BE 00 06 00 00 00 ...
则此时,CPU 执行指令:
mov ax,2000H
mov es,ax
jmp dword ptr es:[1000H]
后,(CS)=?,(IP)=?
答:(CS)=(21002H)=0006H,(IP)=(21000H)=00BEH
完整的程序代码如下:
; 为了让程序执行时符合题目要求,特别添加了以下代码:
; (1) 添加代码:
; mov word ptr es:[bx],00BEh
; mov word ptr es:[bx+2],0006h
; 使得内存状态如下所示:
; 2000:1000 BE 00 06 00 00 00 ...
; (2) 添加标号 s,以便题目中的 jmp 指令执行后能够让 CS:IP 重回到本程序中
; (3) 添加代码:
; mov ss,es:[bx+2]
; mov bp,es:[bx]
; mov byte ptr [bp],0EAh
; mov word ptr [bp+1],offset s
; mov word ptr [bp+3],cs
; 使得内存状态如下所示,以便能让 CS:IP 重回到本程序的 s 标号处执行指令:
; 0006:00BE EA(offset s)(cs) jmp far ptr <本程序的 s 标号>
; 其中 (offset s) 的意思是,读取本程序标号 s 的偏移地址,传送到 0006:00BF 内存单元(字型数据)中;
; (cs) 的意思是,读取本程序的 CS 段寄存器所存储的数据,传送到 0006:00C1 内存单元(字型数据)中
; 第 (2)、(3) 项添加的内容,可参考 9.4 节程序 9.3 中“jmp far ptr s”指令对应的机器码
assume cs:code
code segment
start: mov ax,2000h
mov es,ax
mov bx,1000h
mov word ptr es:[bx],00BEh
mov word ptr es:[bx+2],0006h
mov ss,es:[bx+2]
mov bp,es:[bx]
mov byte ptr [bp],0EAh
mov word ptr [bp+1],offset s
mov word ptr [bp+3],cs
jmp dword ptr es:[1000h]
s: mov ax,4c00h
int 21h
code ends
end start