转移行为类型:
- 无条件转换指令(如:jmp)
- 条件转移指令
- 循环指令(如:loop)
- 过程
- 中断
操作符offset
标号有段地址和偏移地址seg去段地址,offset去偏移地址
如果直接在寄存器中使用标号,获得的是ds和offset组合得到的数据值
功能:获取标号的偏移地址
将s处的内容复制到s0处
]
根据位移进行转移的jmp
指令
短转移:jmp short 标号(转移到标号处执行指令)
这种格式的jmp
指令实现的是段内短转移,对ip
修改范围为-128-127
在一般的汇编指令中。汇编的idata(立即数)
会出现在翻译后的指令中,但是对于jmp
指令,机器码中没有转移的目的的地址,在汇编的时候会将绝对的标号地址替换成相对于当前ip
指针的偏移地址
所以这条指令的功能就是:修改ip
使得:(ip) = (ip)+8位的偏移(-128到127)
近转移:jmp near ptr 标号
和段转移一样,只不过相对ip
的偏移编程了16位位移
远转移:jmp far ptr 段寄存器:偏移地址
转移地址在内存中的jmp
指令
jmp word ptr ds:[]
段内转移,位数只够改变ip
的值
jmp dword ptr ds:[] 段间转移,
高地址放的是目的的段地址,低地址放的是ip的地址
jcxz
指令
有条件转移指令,所有的有条件转移指令都是短转移
如果cx==0
,就会实现跳转
loop指令
(cx)=(cx)-1
如果cx!=0
跳转
分析下列程序
assume cs:codesg
codesg segment
mov ax,4c00h
int 21h
start:
mov ax,0
s: nop
nop
mov di,offset s
mov si,offset s2
mov ax,cs:[si]
mov cs:[di],ax
s0:
jmp short s
s1: mov ax,0
int 21h
mov ax,0
s2: jmp short s1
nop
codesg ends
end start
这个程序最终会运行到mov ax,4c00h int 21h
然后正常退出。
原因是jmp
跳转的时候实际的机器码是相对当前pc
+或者-多少字节,在运行到s处的jmp short s1
的时候这条语句时,实际上机器码负数向上偏移-7个字节的形式进行的计算