错误在后端:32位绝对寻址64位模式
你好我工作的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);
}
是,作为错误说,在OSX不允许你使用绝对引用其byte ptr [c]
组装到。作为解决方法,您可以尝试byte ptr c[rip]
。
请注意,这是非常不好的做法,切换语法内联汇编块,你应该使用-masm=intel
编译器开关。另外,gcc内联asm不应该像那样使用,通常你使用约束机制来引用参数。
当使用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。” –
@DavidWohlferd:Clang也一样吗? –
我只是做了一个简单的测试,它看起来像叮当声正确处理。 –
马乔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 –
龙故事简短,使用'GOTPCREL'(尽管不确定它是否使用内联)或者仅编译为'i386';采取杰斯特的好建议以及... –
只是加入-m32的作品,但我不知道它是否是最好的方式去。 –