2016-03-07 68 views
3

你好我工作的ASM intel_syntax noprefix在Mac上使用gcc,由于某种原因,我一直在后台收到此错误不支持32位绝对地址是不是在64位模式下支持 这是否与变量做,此刻正一直在ASM内联用?错误在后端:32位绝对寻址64位模式

这里是我的代码:

#include <stdio.h> 

char c, b; 

int main() { 

    printf("Give me letter: "); 
    scanf(" %c", &c); 

_ 

    _asm( ".intel_syntax noprefix;" 
     "xor eax, eax;"  // clear eax 
     "mov al, byte ptr [c];" // save c in eax 
     "cmp eax, 65;"  // eax ? "A" 
     "jl Fin;"  // eax < "A" -> Fin 
     "cmp eax, 90;"  // eax ? "Z" 
     "jg UpC;"  // eax >= Z -> Up Case 
     "add eax, 32;"  // make low case 
     "jmp Fin;"  // -> Fin 
    "UpC: cmp eax, 97;"  // eax ? "a" 
     "jl Fin;"  // eax < "a" -> Fin 
     "cmp eax, 122;"  // eax ? "z" 
     "jg Fin;"  // eax > "z" -> Fin 
     "sub eax, 32;"  // make Up Case 
    "Fin: mov byte ptr [b], al;" // save res in b 
     ".att_syntax"); 

    printf("Case changed : %c\n", b); 
} 
+0

马乔ABI使用重定位代码,所以你不能使用绝对地址。如果你想获得更多关于它是如何工作的知识,这里有另外一个问题/答案解释:http://stackoverflow.com/questions/25799551/why-does-this-movq-instruction-work-on-linux-and - 不是,OSX/25804623#25804623,和苹果文档:https://developer.apple.com/library/mac/documentation/DeveloperTools/Conceptual/MachORuntime/index.html#//apple_ref/doc/uid/TP40000895 –

+0

龙故事简短,使用'GOTPCREL'(尽管不确定它是否使用内联)或者仅编译为'i386';采取杰斯特的好建议以及... –

+0

只是加入-m32的作品,但我不知道它是否是最好的方式去。 –

回答

3

是,作为错误说,在OSX不允许你使用绝对引用其byte ptr [c]组装到。作为解决方法,您可以尝试byte ptr c[rip]

请注意,这是非常不好的做法,切换语法内联汇编块,你应该使用-masm=intel编译器开关。另外,gcc内联asm不应该像那样使用,通常你使用约束机制来引用参数。

+0

当使用gcc的[基本ASM(https://gcc.gnu.org/onlinedocs/gcc/Basic-Asm.html)(相对于[延伸](https://gcc.gnu.org/onlinedocs/gcc /Extended-Asm.html)),寄存器的输出预期与输入时的输出值相同。即使从基本asm访问全局变量也是有风险的:“从基本asm安全地访问C数据和调用函数比它看起来要复杂得多。要访问C数据,最好使用扩展的asm。” –

+0

@DavidWohlferd:Clang也一样吗? –

+0

我只是做了一个简单的测试,它看起来像叮当声正确处理。 –