我正在使用gcc在mac上运行ASM intel_syntax nofprefix,由于某种原因,我在后端不断收到这个错误: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);
}
1条答案
按热度按时间0pizxfdo1#
是的,正如错误所说,在osx上不允许使用
byte ptr [c]
汇编到的绝对引用。作为一个变通方案,您可以尝试byte ptr c[rip]
。请注意,在内联汇编块中切换语法是非常糟糕的做法,您应该使用
-masm=intel
编译器开关。另外,gcc内联asm不应该像这样使用,通常您使用约束机制来引用参数。