mov的指令后缀无效



我有一段内联汇编代码,应该以文本模式打印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风格的人来说。

最新更新