gcc - mov的无效指令后缀?
问题描述
我有这段内联汇编代码应该以文本模式打印 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 或类似的东西。
解决方案
尽管错误消息中有 GCC 的行号,但这并不是它实际抱怨的行,而是movb
商店。您可以通过评论其他说明来测试它。错误实际上是由汇编程序打印的,编号基于.loc
编译器的元数据指令,这是一个多行 asm 模板,所以我猜这很容易出错。
我怀疑 GAS.intel_syntax
模式将文字0
视为立即数,以便与mov al, 0
源0
操作数保持一致。这当然不能作为目的地。
“invalid instruction suffix”错误消息没有什么意义,尽管请注意 Intel 语法不使用操作数大小的后缀。(但由于某种原因movb [0], 'A'
被接受了。)
而是使用方括号来避免歧义;推荐用于任何内存操作数,即使地址是符号而不是文字数字。
mov byte ptr [0], 'A'
mov byte ptr ds:0, 'A'
也有效,并且是语法objdump -d -Mintel
使用。
始终在内存操作数上使用方括号来消除歧义是一个好主意,尤其是对于可能习惯于英特尔语法的 NASM 风格的人来说。
推荐阅读
- nginx - NGINX 多个 SSL 证书,具有一个 ip、不同的根和域
- spring - ThreadPoolExecutor 和 Spring Async
- java - 如何在属性文件中定义对象数组并从 Java 程序中读取
- kubernetes - Pod 安全上下文和 NFS 挂载
- azure-devops - Azure DevOps 通过 Rest Api 访问控制列表设置权限
- php - How to sort values of array in Laravel
- couchdb - couchdb GET _replicator 数据库返回 500
- microsoft-graph-api - Microsoft Graph API,密码授予选项
- python - 从运行时指定的列动态构建字典
- python - 为火炬张量赋值