我有一段内联汇编代码,应该以文本模式打印A:
void print(){
asm volatile(
"mov ax,0xb800n"
"mov ds,axn" /*<-as complains about this*/
"movb 0,'A'n"
);
}
然而,当我尝试用gcc(使用-m32和-masm=intel(编译它时:
./source/kernel.c: Assembler messages:
./source/kernel.c:4: Error: invalid instruction suffix for `mov'
顺便说一句,这段代码来自我的操作系统内核,所以我不能使用stdio.h或类似的东西。
尽管GCC在错误消息中使用了行号,但这并不是它真正抱怨的行,而是movb
存储。您可以通过注释其他说明来测试这一点。错误实际上是由汇编程序打印的,其编号基于编译器的.loc
元数据指令,而这是一个多行asm模板,所以我想这很容易出错。
我怀疑GAS.intel_syntax
模式将文字0
视为立即数,以与mov al, 0
保持一致,并将0
视为源操作数。这当然不能作为目的地。
"无效指令后缀"错误消息没有什么意义,不过请注意,英特尔语法不使用操作数大小后缀。(但由于某种原因,movb [0], 'A'
被接受。(
相反,使用方括号以避免歧义;建议用于任何内存操作数,即使地址是符号而不是文字数字。
mov byte ptr [0], 'A'
mov byte ptr ds:0, 'A'
也起作用,并且是objdump -d -Mintel
使用的语法。
总是在内存操作数上使用方括号来消除任何歧义是个好主意,尤其是对于那些可能习惯了英特尔语法的NASM风格的人来说。