You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

GNU GAS语法下如何将SI寄存器指向的存储值存入AL寄存器

问题原因

触发错误有三个核心原因:

  1. 你使用的是AT&T语法的GNU汇编器(GAS),所有寄存器名必须加%前缀,你写的al缺少前缀不符合语法要求
  2. 16位寄存器%si仅能在16位实模式下作为内存寻址的基址寄存器使用,GAS默认按32/64位模式解析指令,该寻址方式在非16位模式下不被支持
  3. 你当前使用的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), %al
    
    编译命令:
    as --32 code.asm -o assembled_code.o
    
  • 64位模式用%rsi:
    movb (%rsi), %al
    
    编译命令:
    as code.asm -o assembled_code.o
    

内容的提问来源于stack exchange,提问作者TheMystZ

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 07:36:04