汇编语言 转移指令及其原理

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指令

  1. 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

  2. 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
  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Yuleo_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值