AT&T汇编中RIP相对跳转获长操作码,如何强制短跳转?
在GNU汇编AT&T语法中强制生成短跳转(Short Jump)
你的问题核心是混淆了直接相对跳转和间接跳转的写法:
- 你写的
jmp *lbl%=(%%rip)是RIP相对的间接跳转,会生成ff 25开头的机器码——这不是far跳转,而是通过内存地址的间接跳转,自然会触发段错误(因为lbl%=处的内存并非合法跳转地址)。 - Intel语法的
jmp lbl%=是直接相对短跳转,对应AT&T语法的直接写法不需要*和(%%rip)。
要在AT&T语法中强制生成short跳转,只需做两点:
- 使用直接相对跳转的基础语法:
jmp lbl%=(去掉星号和RIP寻址部分) - 用
.s后缀明确指定short类型,即jmp.s lbl%=
修正后的代码如下:
int main() { asm volatile ( "jmp.s lbl%=\n\t" "lbl%=:\n\t" : : : ); return 0; }
补充说明
- AT&T汇编中,跳转指令的后缀用于强制指定偏移长度:
.s:强制8位偏移的short跳转(对应机器码eb xx).n:强制32位偏移的near跳转(对应机器码e9 xx xx xx xx)
- 默认情况下,GNU汇编器会自动选择最短的合法跳转长度,但如果需要明确指定类型,添加对应后缀即可。
内容的提问来源于stack exchange,提问作者unegare
相关产品推荐
相关产品推荐

