程序按照顺序执行指令 而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相关的寻址时,程序计数器的值是跳转指令后面的那条指令的地址,而不是跳转指令本身
利用跳转指令后面指令地址和目的地址之间的差作为指令编码
可以使指令编码更简洁
而且目标代码可以不做改变就移到存储器中不同的位置