0

我有这段内联汇编代码应该以文本模式打印 A:

    void print(){
        asm volatile(
            "mov ax,0xb800\n"
            "mov ds,ax\n" /*<-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 或类似的东西。

4

1 回答 1

2

尽管错误消息中有 GCC 的行号,但这并不是它实际抱怨的行,而是movb商店。您可以通过评论其他说明来测试它。错误实际上是由汇编程序打印的,编号基于.loc编译器的元数据指令,这是一个多行 asm 模板,所以我猜这很容易出错。

我怀疑 GAS.intel_syntax模式将文字0视为立即数,以便与mov al, 00操作数保持一致。这当然不能作为目的地。

“invalid instruction suffix”错误消息没有什么意义,尽管请注意 Intel 语法不使用操作数大小的后缀。(但由于某种原因movb [0], 'A'被接受了。)

而是使用方括号来避免歧义;推荐用于任何内存操作数,即使地址是符号而不是文字数字。

    mov  byte ptr [0], 'A'

mov byte ptr ds:0, 'A'也有效,并且是语法objdump -d -Mintel使用。

始终在内存操作数上使用方括号来消除歧义是一个好主意,尤其是对于可能习惯于英特尔语法的 NASM 风格的人来说。

于 2020-05-09T04:40:41.460 回答