检测点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段中应定义哪些数据?
解析:jmp word ptr,是转移地址在内存中的作用,是段内转移,即ip变化,CS不变。那么在data段中定义3个0就可以。
(2)程序如下
assume cs:code
data segment
dd 12345678H
data ends
code segment
start:mov ax,data
mov ds,ax
mov bx,0
mov [bx],______
mov [bx+2],_____
jmp dword ptr ds:[0]
code ends
end start
补全程序,使jmp指令执行后,CS:IP指向程序的第一条指令
解析:jmp dword ptr 内存单元地址 是段间转移,从内存单元放着两个字,高地址存放的是段地址,低地址存放的是偏移地址
段地址,显然应该为CS,因为要求指向的是指令。偏移地址,显然是0,因为指向第一条指令。
答案:bx;cs
(3)用debug查看内存,结果如下
2000:1000 BE 00 06 00 00 00 ……
则此时,cpu执行指令:
mov ax,2000H
mov es,ax
jmp dword ptr es:[1000H]
后,CS=? IP=?
解析:不看debug,自己分析如下:
00 01 02 03 04
BE 00 06 00 00
jmp dword ptr,低地址放偏移地址,高地址放段地址
BE 00为偏移地址,06 00为段地址
CS=0006 IP=00BE
检测点9.2
补全编程,利用JCXZ指令,实现在内存2000H段中查找第一个值为0的字节,找到后,将它的偏移地址存储在dx中
assume cs:code
code segment
start: mov ax,2000H
mov ds,ax
mov bx,0
s:______
________
________
________
jmp short s
ok:mov dx,bx
mov ax,4c00h
int 21h
code ends
end start
解析:jcxz指令是条件转移指令,当cx=0的时候,转移。
现在段地址已经在2000H处,现在只需要改变BX,实现从2000:0开始,寻找值为0的字节。
现在的思路就是,把值放进cx,然后用jcx判断值是否为0
答案:mov cl,[bx]
mov ch,0
jcxz ok
inc bx
检测点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 bx
loop s
ok: dec bx
mov dx,bx
mov ax,4c00h
int 21h
code ends
end start
解析:当我们没找到这个值为0的数时,cx是一个大于0的数,所以这个loop可以执行,当值为0的时候,循环无法继续
所以横线上,我们需要填,inc cx