检测点9.1
(1) 若要使程序中的jmp执行执行后,CS:IP指向程序的第一条指令,在data段中应该定义哪些数据?
完整源码
assume cs:code
data segment
db 'a',0,0,'k','b'
data ends
code segment
start: mov ax,data
mov ds,ax
mov bx,0
jmp word ptr [bx+1]
code ends
end start
-
CS:IP 指向程序的第一条指令,意味着要将IP值设为
0000H
-
jmp word ptr [bx+1]
表示用ds:[bx+1]
处开始的一个字单元里的数据修改IP -
mov ax,data mov ds,ax
已经将ds设置为data段的段地址了 - 只要保证data段的
第1个字节单元和第2个字节单元
的内容是00
即可,前面第0个字节单元以及后面有多少个字节单元存着什么都无所谓
解析参考
- 解析参考(见8楼回答):https://bbs.csdn.net/topics/360146995
(2) 补全程序,使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+2],cs
jmp dword ptr ds:[0]
code ends
end start
- 补全的语句是
mov [bx],bx
mov [bx+2],cs
-
jmp dword ptr ds:[0]
:用ds:[0]
处开始存放的双字型修改IP以及CS的值
data段
1| 12
2| 34
3| 56
4| 78
低地址用来修改 IP 的值
高地址用来修改 CS 的值
data段
1| 00
2| 00
3| CS
4|
(3) 用debug查看内存,结果如下:
jmp dword ptr ds:[1000h]
检测点9.2
题目:补全编程,利用jcxz指令,1、实现在内存2000H段中查找第一个值为0的字节,2、找到后将它的偏移地址存储在dx中
assume cs:code
code segment
start: mov ax,2000H
mov ds,ax
mov bx,0
s: mov ch,0
mov cl,[bx]
jcxz ok
inc bx
ok: mov dx,bx
mov ax,4c00H
int 21H
code ends
end start
- 查找第一个值为0的 字节,使用8位寄存器cl来存这个字节,
mov cl,[bx]
- 条件跳转
jcxz(jmp cx == zero)
判断的是16位的CX是否等于零,所以需要mov ch,0
-
jcxz
是依靠位移的短转移
检测点9.3
题目:补全编程,利用loop指令,实现在内存2000H段中查找第一个值为0的字节,找到后,将它的偏移地址存储在dx中
assume cs:code
code segment
start: mov ax,2000H
mov ds,ax
mov bx,0
s: mov cl,[bx]
mov ch,0
inc cx
inc bx
loop s
ok: dec bx
mov dx,bx
mov ax,4c00H
int 21H
code ends
end start
- 补全的语句
inc cx
-
loop
指令依靠位移的短转移
执行: loop 标号
第一步, (cx) = (cx)-1
第二步,如果(cx)≠ 0,则跳转到标号,否则程序向下执行
可见,如果此时已经找到了为0的字节,
补全 inc cx
在执行到 loop ok 时,会由于 第一步的自减 使得 CX 重新变回 0
-
dec bx
等价于sub bx,1