汇编语言 转移指令及其原理
文章目录
1. 转移指令的原理
可以修改IP或者同时修改CS和IP的指令称为转移指令
只转移IP:段内转移:jmp ax
同时修改CS和IP:段间转移:jmp 1000:0
段内转移:
- 短转移:可以修改的IP范围 : -128-127
- 近转移:可以修改的IP范围 :-32768-32767
2. offset操作符
-
数据转移指令 作用:取得标号的偏移地址
-
以下操作将s处的一条数据转移到s0处
assume cs:code
code segment
s: mov ax,bx
mov si,offset s
mov di,offset s0
mov ax,cs:[si]
mov cs:[di],ax
s0: nop
nop
code ends
end s
3. jmp指令
- 无条件跳转指令
- 可以只修改IP,也可以同时修改CS和IP
3.1 根据位移进行转移的jmp指令
jmp short 标号(转到标号处执行指令)
-
short表示进行的是jmp段内短转移 对ip的修改范围 -128到127。
-
标号:要转移到的目的地
assume cs:code code segment start: mov ax,0 jmp short s add ax,1 ;jmp到s后跳过此条指令 s: inc ax code ends end start
结果: ax=1,可以得知 jmp short s跳过了add ax,1 ,到了s处
得知:jmp指令为 EB03
修改代码:
assume cs:code
code segment
start: mov ax,0
mov bx,0
jmp short s
add ax,1 ;jmp到s后跳过此条指令
s: inc ax
code ends
end start
jmp指令仍为 EB03
-
CPU在执行jmp指令的时候并不需要知道转移到目的地址
-
编译器在执行jmp指令时,会自动计算要跳转到的指令位置到jmp指令后的字节差
解释:在jmp的指令之后,下一条指令为 add ax,1,其地址为076A:0008
jmp到的指令的地址为076A:000B 000B减0008得0003,所以后两位为03,为EB03
-
jmp short 八位位移:范围 -128到127
-
jmp near ptr 十六位位移:范围 -32768到32767
3.2 转移到目的地址的jmp指令
jmp far ptr 标号
指令用标号的段地址和偏移地址来修改CS:IP
assume cs:code
code segment
start: mov ax,0
mov bx,0
jmp far ptr s
db 256 dup(0) ;开辟256个字节
s: add ax,1
inc ax
code ends
end start
EA 0B016A07 : 即是要转移到的段地址与偏移地址: 076A:010B
3.3 转移地址在寄存器中的jmp指令
jmp 16为reg(寄存器)
3.4 转移地址在内存中的jmp指令
-
jmp word ptr 内存单元地址(段内转移) 只修改ip
mov ax,0123h mov ds:[0],ax jmp word ptr ds:[0]
mov ax,0123h mov [bx],ax jmp word ptr bx
执行后:ip=0123h
-
jmp dword ptr 内存单元地址(段间转移)修改cs与ip
mov ax,0123h mov ds:[0],ax mov word ptr ds:[2],0 mov dword ptr ds:[0]
mov ax,0123h mov [bx],ax mov word ptr [bx+2],0 mov dword ptr [bx]
cs:ip = 0:0123h
4. jcxz指令
jcxz 标号 :八位位移
-
如果cx=0,转移到标号执行:
- if (cx==0) jmp short 标号
- 在2000:0 找到第一个值为0的字节,找到后偏移地址存储在dx中
assume cs:code code segment start: mov ax,2000h mov ds,ax mov bx,0 s: mov cl,[bx] mov ch,0 jcxz ok ;cx为0,则执行跳转 inc bx loop s ok: mov dx,bx mov ax,4c00h int 21h code ends end start
5. loop指令
短转移 loop 标号
- cx!=0 ,移动到标号
- if ( cx!=0) jmp 标号
- 循环指令
①cx=cx-1判断cx中的值 (先判断)
②不为0则跳转到标志号中执行,若为零则跳出循环,执行下一条指令。(再执行 )
loop指令查找第一个不为零的字节
assume cs:code
code segment
start: mov ax,2000h
mov ds,ax
mov bx,0
s: mov cl,[bx]
mov ch,0
inc cx ;确保loop能够执行
inc bx
loop s
ok: dec bx
mov dx,bx
mov ax,4c00h
int 21h
code ends
end start
本文来自博客园,作者:hugeYlh,转载请注明原文链接:https://www.cnblogs.com/helloylh/p/17209741.html