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
相关产品推荐
相关产品推荐

