汇编语言-转移指令
1.操作符offset
取得标号的偏移地址
例 将s处的一条指令复制到s0处
assume cs:codesg
codesg segment
s: mov ax,bx
mov si,offset s
mov di,offset s0
mov ax,cs:[si]
mov cs:[di],ax
s0:nop
nop
codesg ends
end s
s和s0处的指令所在的内存单元的地址是多少:cs:offset s cs:offset s0
2.jmp 指令
无条件转移指令,可以只修改ip,也可以同时修改CS和IP
需要(1)转移的目的地址
(2)转移的距离(段间距离,段内短转移,段内近转移)
3.依据位移进行转移的jmp指令
段内短转移,对ip的修改范围为-128~127
jmp short 标号
例:
assume cs:codesg
codesg segment
start:mov ax,0
jmp short s
add ax,1
s:inc ax
codesg ends
end start
运算结果ax=1,add ax,1指令被跳过。执行s指令
jmp near ptr 标号
功能:(IP)=(IP)+16位位移
(1)16位位移=标号处的地址-jmp指令后的第一个字节的地址
(2)near ptr指明此处的位移为16位位移,进行的是段内近转移
(3)16位位移的范围为-32768-32767,补码表示
(4)16位位移由编译程序在编译时算出
jmp fat ptr 标号
实现段间转移,又称为远转移
(CS)标号所在的段地址,(IP)IP所在的偏移地址
assume cs:codesg
codesg segment
start:mov ax,0
mov bx,0
jmp far ptr s
db 256 dup {0}
s: add ax,1
inc ax
codesg ends
end start
5.转移地址在寄存器中的jmp指令
指令格式:jmp 16位reg
功能:(IP)=(16位reg)
6.转移地址在内存中的jmp指令
(1)jmp word ptr 内存单元地址(段内转移)
例:
mov ax,0123H
mov ds:[0],ax
jmp word ptr ds:[0]
执行后(IP)=0123H
例2:
mov ax,0123H
mov [bx],ax
jmp word ptr [bx]
(2)jmp dword ptr 内存单元地址(段间转移)
功能:从内存单元地址处开始存放着两个字,高地址处的字是转移的目的段地址,低地址处是转移的目的偏移地址
(CS)=(内存单元地址+2)
(IP)=(内存单元地址)
例:
mov ax,0123H
mov ds:[0],ax
mov word ptr ds:[2],0
jmp dword ptr ds:[0]
执行后(cs)=0 (ip)=0123H.CS:IP指向0000:0123
7.jcxz指令
jcxz指令为有条件的转移指令短转移,在对应的机器码中包含转移的位移,而不是目的地址。Ip修改范围-128~127
指令格式:jcxz标号,如果(cx)=0,转移到标号处执行。