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

Rust内联汇编mov指令复制错误地址问题排查

问题排查:Rust内联汇编中mov si, message未正确加载字符串地址

核心原因

你的问题本质是Rust内联汇编与NASM的寻址语义差异:

  • NASM的Intel语法中,mov si, message默认将message符号对应的内存地址加载到si;
  • 但Rust内联汇编(即便启用Intel语法)中,直接写mov si, message会被解析为读取message地址处的内存内容——你看到的0x6548正是字符串开头的两个字节(小端序下,0x48是'H'、0x65是'e'),而非地址本身。

解决方法

1. 明确加载符号地址(Intel语法)

用两种方式可以强制获取地址而非内容:

  • 方式一:使用OFFSET关键字
    在汇编指令中添加OFFSET,明确指定取符号的地址:
    mov si, OFFSET message
    
  • 方式二:使用lea指令(推荐)
    lea(加载有效地址)指令专门用于计算内存地址并加载到寄存器,完全避免寻址歧义:
    lea si, [message]
    

2. 正确配置Rust内联汇编参数

确保你在asm!宏中正确暴露符号并启用Intel语法,示例代码如下:

static MESSAGE: &[u8] = b"Hello, World!\0";

unsafe {
    asm!(
        "mov ah, 0x0e",          ; BIOS teletype输出功能
        "lea si, [message]",     ; 加载字符串地址到si
        "loop_start:",
        "lodsb",                 ; 从si指向的地址取字节到al,si自增
        "or al, al",             ; 判断是否到字符串结尾(0字节)
        "jz loop_end",
        "int 0x10",              ; 调用BIOS中断打印字符
        "jmp loop_start",
        "loop_end:",
        message = sym MESSAGE,   ; 将Rust符号暴露给汇编
        options(att_syntax(false), nostack), ; 启用Intel语法,不使用栈
    );
}

3. 确认链接与内存布局

保证你的程序按实模式引导扇区编译:

  • 链接脚本指定起始地址为0x7c00;
  • 确保字符串被包含在引导扇区的512字节范围内(注意末尾要添加0xaa55引导标志)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 09:10:14