汇编语言转移指令(offest,jmp,jcxz,loop)学习

本文深入探讨了8086CPU的转移指令,包括无条件转移、条件转移、循环指令等,解析了jmp、jcxz、loop等指令的使用方法及功能,阐述了如何通过不同类型的转移指令控制程序流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

转移指令

转移指令定义

  • 可以修改IP,或同时修改CS和IP的指令统称为转移指令。
  • 转移指令可以控制CPU执行内存中某处代码的指令。

8086CPU的转移行为:

  • 段内转移(只修改IP)
    • 短转移 -128~127
    • 近转移 -32768~32767
  • 段间转移(修改CS和IP)

转移指令有:

  • 无条件转移指令(jmp)
  • 条件转移指令
  • 循环指令(loop)
  • 过程
  • 中断

转移指令

操作符offest

  • offset的功能是取得标号的偏移地址
assume cs:codesg
codesg segment
	start:	mov ax,offset start  ;相当于mov ax,0
		s:		mov ax,offest s      ;相当于mov ax,3
codesg ends
end start

mov ax,offset start 相当于mov ax,0。start是代码段中的标号,它所标记的指令是代码段中的第一条指令,偏移地址为0。
mov ax,offset s相当于mov ax,3。s标记的指令是代码段中第二条指令,第一条指令长度为3,所以偏移地址为3。

jmp指令

  • jmp为无条件指令,可只修改IP,也可修改CS和IP
  • jmp指令要给出两种信息:
    (1)转移的目的地址
    (2)转移的距离(段间转移、段内短转移、段内近转移)

jmp short 指令

依据位移进行转移

  • 该指令是依据位移进行转移的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。

上述程序用debug调试,观察其机器指令
上述程序的机器码
我们发现 jmp short s中的s表示为inc ax指令的偏移地址

  • jmp short指令对应的机器码中不包含转移的目的地址,包含的是转移的位移
  • jmp short s的功能就是 (IP)=(IP)+8位位移
    - 8位位移=s的地址-jmp指令后的第一个字节的地址

jmp near ptr 指令

依据位移进行转移

  • jmp near ptr 标号 实现的是段内近转移
  • 功能为: (IP)=(IP)+16位位移
  • 16位位移=标号的地址-jmp指令后的第一个字节的地址
  • 位移范围为-32768~32767,用补码表示

jmp far ptr 指令

转移的目的地址在指令中

  • jmp far ptr 标号 实现的是段间转移,又称为远转移。
    • (CS)=标号所在段的短地址
    • (IP)=标号在段中的偏移地址
  • far ptr 会指明标号的短地址和偏移地址来修改CS和IP

jmp 16位reg

转移地址在寄存器中

  • 可以用jmp 段地址:偏移地址来修改CS和IP,达到跳转的目的
  • 可以用jmp 某一合法寄存器来修改IP的值

jmp word ptr 指令

转移地址在内存中

  • jmp word ptr 内存单元地址 段内转移
  • 功能: 从内存单元地址处开始存放着一个字,是转移的目的偏移地址

mov ax,0123h
mov ds:[0],ax
jmp word ptr ds:[0]

上述指令执行后(IP)=0123h

jmp dword ptr 指令

转移地址在内存中

  • 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

jcxz指令

  • jcxz指令为有条件转移指令,所有的有条件转移指令都是短转移。对应机器码中包含的是转移的位移,而不是目的地址
  • jcxz 标号(如果(cx)=0,转移到标号处执行)
  • 操作:
    - 当(CS)=0时,(IP)=(IP)+8位位移;
    -8位位移=标号处的地址-jcxz指令后的第一个字节的地址
    - 8位位移的范围为-127~128,用补码表示
  • (CX)≠0时,程序不跳转,向下执行
  • jcxz 标号的功能相当于:
    if ((cx)==0) jmp short 标号

loop 指令

  • loop 指令为循环指令,所有的循环指令是短转移,包含的是转移的位移
  • 指令格式: loop 标号(如果(cx)≠0,转移到标号处执行)
  • 操作:
    • (cx)=(cx)-1
    • (cx)≠0,(IP)=(IP)+8位位移
    • 8位位移=标号处的地址-loop指令后的第一个字节的地址

。。。。待续

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值