代码之家  ›  专栏  ›  技术社区  ›  Jarsen

64位问题:尝试使用内联程序集将值从%rsp复制到临时变量

  •  4
  • Jarsen  · 技术社区  · 14 年前

    最大的问题似乎是一行代码,其中内联汇编用于将当前堆栈指针复制到dispatcher使用的临时变量中:

    #define SET_STACK(s) asm("movl temp,%esp");
    

    当然,编译器会向我回吐错误,因为 %esp 是32位寄存器。

    /var/folders/0A/0AVWZC-5HhOg6twWZBlDgU+++TI/-Tmp-//cckS2oq7.s:523:32-bit absolute addressing is not supported for x86-64
    /var/folders/0A/0AVWZC-5HhOg6twWZBlDgU+++TI/-Tmp-//cckS2oq7.s:523:cannot do signed 4 byte relocation
    

    所以我把它换成了 %rsp 因为它是64位堆栈指针寄存器(我认为 %sp 同样有效,我在这里的其他地方读到,GAS足够聪明,可以加上正确的前缀)。更换后 %静电除尘器 %rsp公司

    /var/folders/0A/0AVWZC-5HhOg6twWZBlDgU+++TI/-Tmp-//cc8TLdjH.s:523:Incorrect register `%sp' used with `l' suffix
    

    movl mov ,和 movq temp 尺寸不对吗?

    Temp是一个全局变量,声明如下:

    void* temp;   // temp pointer used in dispatcher
    

    我写了一个快速的程序来打印出不同数据类型的大小,看起来在x86-64中void*的大小是8字节,应该是正确的大小,对吧?

    不管怎样,显然我不指望有人能帮我解决这个问题,但是任何能为我指明正确方向的建议都将不胜感激!

    2 回复  |  直到 13 年前
        1
  •  1
  •   Hayman    14 年前

    64位移动需要使用movq。

    下面是我的一个项目(火车模拟器的一部分)中的汇编代码片段,注释行是32位的intel asm,未注释行是64位AT&T。

    asm(
            //mykda calculation
            //mov eax, dword ptr [train_traction_ptr]
            //movaps xmm0, xmmword ptr [eax] //train_traction[i] + forceFront
            "movq %0, %%rax\n\t"
            "movaps (%%rax), %%xmm0\n\t"
    
            //mov eax, dword ptr [local_fgrr_ptr]
            //movaps xmm1, xmmword ptr [rax]
            //addps xmm0, xmm1
            "movq %1, %%rax\n\t"
            "movaps (%%rax), %%xmm1\n\t"
            "addps %%xmm1, %%xmm0\n\t"
    
            ... );
    

    在注释之后,我进一步查看,发现所有64位OSX代码都必须是位置独立的。

    没有Mac要测试,但是

    asm ("movq temp(%rip),%rsp");
    

    应该有用。如果没有,您需要为您的汇编程序使用temp的适当PIC地址。

        2
  •  2
  •   caf    14 年前

    您显示的行没有从中复制值 %esp 进入之内 temp -它的作用正好相反(就像 SET_STACK 暗示)。美国电话电报公司;T语法是 src, dest

    一个简单的 asm("mov temp, %rsp"); 应该编译。