当前位置:网站首页>直接跳转与间接跳转
直接跳转与间接跳转
2022-08-10 05:38:00 【denglin12315】
转载自:
正常执行的情况下,指令按照它们出现的顺序一条一条地执行。跳转(jmp
)指令会导致执行切换到程序中一个全新的位置。
在汇编代码中,这些跳转的目的地通常用一个标号(label)指明。
考虑下面的汇编代码序列:
movq $0, %rax
jmp .L1
movq (%rax), %rdx
.L1:
popq %rdx
指令jmp .L1
会导致程序跳过movq
指令,而从popq指令开始继续执行。在产生目标代码文件时,汇编器会确定所有带标号指令的地址,并将跳转目标(目的指令的地址)编码为跳转指令的一部分(所以是间接跳转)。
下表列举了不同的跳转指令。jmp
指令是无条件跳转。它可以是直接跳转,即跳转目标是作为指令的一部分编码的;也可以是间接跳转,即跳转目标是从寄存器或内存位置中读出的。汇编语言中,直接跳转是给出一个标号作为跳转目标的,例如上面的例子中标号.L1
。
间接跳转的写法是*
后面跟一个操作数指示符。举个例子:
指令jmp *%rax
用寄存器%rax
中的值作为跳转目标。
指令jmp *(%rax)
以%rax
中的值作为读地址,从内存中读出跳转目标。
指令 | 同义名 | 跳转条件 | 描述 |
---|---|---|---|
jmp Label | 1 | 直接跳转 | |
jmp *Operand | 1 | 间接跳转 | |
je Label | jz | ZF | 相等/零 |
jne Label | jnz | ~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 | 低于或相等(无符号<=) |
表中所示的其他跳转指令都是有条件的——它们根据条件码的某种组合,或者跳转,或者继续执行代码序列中下一条指令。
边栏推荐
猜你喜欢
随机推荐
UnityShader入门精要-纹理动画、顶点动画
Analysis of minix_super_block.s_nzones of mkfs.minix.c
The use of pointers from the exchange of two data values (C language implementation)
Unity plug-in DOTween User Guide 2 (Brief explanation of Bezier curves)
UnityShader入门精要-阴影
Simplest character device driver
OpenGL学习笔记(LearnOpenGL)-第六部分 变换
电镀废水除六价铬
Unity血条跟随对象
Unity导航与寻路系统的基本使用
8个问题轻松掌握Unity前向渲染
MySQL笔记
Kernel performance analysis summary
动态代理-cglib
Basic use of Unity's navigation and wayfinding system
Can‘t find bundle for base name jdbc, locale zh_CN解决方法
老手也常误用!详解 Go channel 内存泄漏问题
二叉树 6/21 91-95
Unity屏幕坐标转世界坐标,鼠标点击获取三维位置
视差映射:更逼真的纹理细节表现(上):为什么要使用视差映射