You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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跳转,只需做两点:

  1. 使用直接相对跳转的基础语法:jmp lbl%=(去掉星号和RIP寻址部分)
  2. 用.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 23:50:13