这里写自定义目录标题
什么是转移指令?
9.1操作符offset
9.2jmp指令
9.3依据位移进行转移的jmp指令
原理
jmp short jmp near ptr
9.4转移的目的地址在指令中的jmp指令
jmp far ptr 标号
9.5转移地址在寄存器中的jmp指令
比如jmp ax 只改变ip值。
9.6转移地址在内存中的jmp指令
(1)jmp word ptr内存单元地址(段内转移)
(2)jmp dword ptr内存单元地址(段间转移)
检测点9.1
1
db 0,0,0
db 3 dup(0)
2
jmp dword的功能:从内存单元处存放着两个字,
高地址处的字是目标转移【段地址】,
低地址是偏移地址。
3
经上机调试得出:CS=0006H,IP=00BEH
9.7jcxz指令
检测点9.2
cxz指令是条件转移指令,当cx=0的时候,转移。
现在段地址已经在2000H处,
现在只需要改变BX,
实现从2000:0开始,
寻找值为0的字节。
现在的思路就是,
把值放进cx,
然后用jcx判断值是否为0
assume cs:code
code segment
start: mov ax,2000H
mov ds,ax//ds=2000h
mov bx,0//bx=0h
s:
mov cl,[bx] //cl=ds:[bx]=2000h:[0]
mov ch,0 //ch=0,cx=00(2000h:[0])
jcxz ok
inc bx //bx=1
jmp short s
ok:mov dx,bx //bx从0开始递增,找到第一个为0的字节,bx正好是偏移地址。
mov ax,4c00h
int 21h
code ends
end start
答案博客
https://blog.csdn.net/syh666233/article/details/82284090?utm_source=blogxgwz4
9.8loop指令
检测点9.3
assume cs:code
code segment
start:
mov ax,2000H
mov ds,ax
mov bx,0
s:
mov cl,[bx] //cl=2000h:0
mov ch,0 //ch=0,cx=00(2000h:0)
inc cx //cx++
inc bx //bx++,bx=1
loop s
ok: dec bx
mov dx,bx
mov ax,4c00h
int 21h
code ends
end start
解析:
当我们没找到这个值为0的数时,
cx是一个大于0的数,
所以这个loop可以执行,
当值为0的时候,循环无法继续
所以横线上,我们需要填,inc cx
9.9根据位移进行转移的意义
9.10编译器对转移位移超界的检测
实验8分析一个奇怪的程序
可以返回。
实验9根据材料编程
不做。