首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用GCC生成IP相对寻址指令

如何使用GCC生成IP相对寻址指令
EN

Stack Overflow用户
提问于 2012-04-20 21:13:55
回答 2查看 1.5K关注 0票数 1

我写了一个小程序来测试GCC的选择。

代码语言:javascript
复制
int main()
{
    int a=0;
    __asm__("movl %0,%%ecx\n"
            "jmp jmpsection\n"
            "inc %%ecx\n"
            "jmpsection: movl $1,%%eax\n"
            "movl $0,%%ebx\n"
            "int $0x80\n"::"a"(a):"ecx","ebx");
}

为了使var a等于1,请跳过inc指令。我想强制GCC使用IP相对寻址的方法来生成jmp指令。我搜索了一下GCC的手册,想找到一个解决方案,但是我失败了。感谢回放。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-04-20 21:26:17

对于x86,IP相对寻址只能在长模式(64位)下进行,并且您似乎要编写32位代码。

编辑:实际上,在32位模式下,可以相对于当前IP进行跳转,我认为编译器实际上在您的情况下生成了正确的代码。让我们来看看生成的程序集的相关部分:

代码语言:javascript
复制
00000000 <main>:
  ...
  13:   eb 01                   jmp    16 <jmpsection>
  15:   41                      inc    %ecx

00000016 <jmpsection>:
  16:   b8 01 00 00 00          mov    $0x1,%eax
  ...

因此,尽管地址13处的指令看起来直接跳转到地址16,但它实际上是IP相对跳转。看一下机器代码:

代码语言:javascript
复制
eb 01

eb是具有8位位移的短jmp的操作码。01就是这个位移。这条指令的结果是跳转到%eip + 0x01,当IP指向要执行的下一条指令时,这将跳转到地址16。

票数 3
EN

Stack Overflow用户

发布于 2012-04-21 01:00:54

在GCC中使用内联汇编时,汇编代码只是直接传递给汇编器。GCCs命令行选项不会更改汇编代码。您可以查看输出来验证这一点(使用-S选项)。编译器选项仅更改了GCC从C代码生成程序集的方式。

因此,您需要查看您的assemblers manual,而不是编译器手册。在您的情况下,GAS可能会为jmp选择简短的PC相对编码,而不需要指定任何选项。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10246974

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档