GNU GAS语法下如何将SI寄存器指向的存储值存入AL寄存器
问题原因
触发错误有三个核心原因:
- 你使用的是AT&T语法的GNU汇编器(GAS),所有寄存器名必须加
%前缀,你写的al缺少前缀不符合语法要求 - 16位寄存器
%si仅能在16位实模式下作为内存寻址的基址寄存器使用,GAS默认按32/64位模式解析指令,该寻址方式在非16位模式下不被支持 - 你当前使用的
gnu编译命令有误,GNU汇编器的可执行命令为as
对应解决方案
场景1:编写16位实模式代码(如DOS程序、MBR引导程序)
在代码顶部添加.code16伪指令声明16位模式,修正寄存器的%前缀即可,示例代码如下:
.code16 # 其余代码逻辑 movb (%si), %al
对应编译命令:
as --32 code.asm -o assembled_code.o # 若需输出纯16位二进制可执行文件,可额外执行objcopy转换 objcopy -O binary assembled_code.o assembled_code
场景2:编写32/64位保护模式代码(如普通用户态程序、内核模块)
替换16位的%si寄存器为对应位宽的寻址寄存器即可:
- 32位模式用
%esi:
编译命令:movb (%esi), %alas --32 code.asm -o assembled_code.o - 64位模式用
%rsi:
编译命令:movb (%rsi), %alas code.asm -o assembled_code.o
内容的提问来源于stack exchange,提问作者TheMystZ
相关产品推荐
相关产品推荐

