【发布时间】:2016-03-07 01:44:19
【问题描述】:
您好,我正在使用 gcc 在 mac 上处理 ASM intel_syntax noprefix,由于某种原因,我不断收到此后端错误:64 位模式不支持 32 位绝对寻址 这是否与变量有关,目前已在 ASM 内联上使用?
这是我的代码:
#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);
}
【问题讨论】:
-
macho abi 使用可重定位代码,所以不能使用绝对寻址。如果您想进一步了解它是如何工作的,这里有另一个问题/答案,它解释了:stackoverflow.com/questions/25799551/…,苹果文档:developer.apple.com/library/mac/documentation/DeveloperTools/…
-
长话短说,使用
GOTPCREL(虽然不确定它是内联使用)...或仅编译为i386;也接受杰斯特的好建议...... -
只是添加 -m32 有效,但我不知道这是否是最好的方法。
标签: macos assembly x86-64 intel-syntax