跳转指令及其编码

本文详细介绍了汇编语言中的跳转指令,包括直接跳转和间接跳转,以及各种条件跳转指令,如JE、JNE、JG等。跳转指令通过标号或从寄存器或存储器读取地址来指定目标。直接跳转使用标号,而间接跳转则涉及操作数。同时,文章还讨论了跳转指令的编码方式,包括PC相关的编码和绝对地址编码,以及如何根据条件码进行跳转决策。

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

程序按照顺序执行指令 而c语言中控制流程有顺序,分支,循环三种

汇编中跳转指令会导致执行切换到程序中一个全新的位置,也就是说跳转可以产生c语言的分支和循环两种 

一个 为跳转后一部分不在执行 或者再跳转回去再次执行

在汇编代码中,这些跳转的目的地通常用一个标号指明

movl $0,%eax

jmp .L1

movl (%eax), %edx

.L1

popl %edx

jmp L1会跳过movl指令 从popl指令处开始执行

 在产生目标代码时,汇编会确定所有带标号指令的地址,并将跳转目标(目的指令的地址)编码为跳转指令的一部分

jmp指令是无条件跳转,可以是直接跳转,即跳转目标(目的指令的地址)作为指令的一部分编码

也可以是间接跳转 即:跳转目标是从寄存器或者存储器位置中读出

跳转指令分为两类 直接跳转and间接跳转 

直接跳转将目标地址作为指令的一部分:

直接跳转通过标号确定跳转目标

例:".L1"

间接跳转将通过其他方式获取地址(寄存器或者存储器)

间接跳转写法为   *后跟一个操作数指示符

例:jmp *%eax(寄存器中获取目的地址)

jmp *(%eax)(存储器中获取地址)

跳转条件

JMP   label         1 直接跳转
JMP *operand 1 间接跳转


JE    label   JZ ZF 相等

JNE   label        JNE ~ZF 不等


JS    label    SF 负数

JNS  label ~SF 非负数

有符号

JG  label JNLE ~(SF^OF)&~ZF 大于

JGE  label      JNL ~(SF^OF) 大于等于

JL   label   JNGE SF^OF 小于

JLE  label   JNG (SF^OF)| ZF 小于等于

无符号

JA   label   JNBE                   ~CF&~ZF 大于(超过)

JAE  label   JNB                    ~CF 大于或相等

JB    label     JNAE CF 低于

JBE  label     JNA CF|ZF 低于或相等

这些指令的名字和条件与SET指令相匹配

对于有条件跳转 根据条件码的某个组合,进行跳转或者不跳转



跳转指令有几种不同的编码,但是最常用的都是PC相关的(Program  Counter程序计数器)

他们会将目标指令的地址与紧跟在跳转指令后面的那条指令的地址之间的 差作为编码

地址偏移量可以编码为1, 2, 4字节

第二种编码方法是给出“绝对地址”,用四个字节直接指定目标,汇编器和链接器会选择适当的跳转目的编码


当执行与PC相关的寻址时,程序计数器的值是跳转指令后面的那条指令的地址,而不是跳转指令本身


利用跳转指令后面指令地址和目的地址之间的差作为指令编码

可以使指令编码更简洁

而且目标代码可以不做改变就移到存储器中不同的位置



































评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值