汇编网首页登录博客注册
unixandlinux的学习博客
博客首页博客互动【做检测题】论坛求助

我的博客

个人首页 |  我的文章 |  我的相册 |  我的好友 |  最新访客 |  文章收藏 |  论坛提问 |  友情链接 |  给我留言  
图片载入中
学习动态
最新评论
最新留言
好友圈
友情链接

[2023-06-08 23:04] 第9章 检测点 9.1

检测点 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
评论次数(0)  |  浏览次数(126)  |  类型(汇编作业) |  收藏此文  | 
 
 请输入验证码  (提示:点击验证码输入框,以获取验证码