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

NASM中buff变量的内存存储顺序及指令取值疑问

关于x86下buff内存存储与指令执行的疑问解答

嘿,这个问题其实核心是搞清楚输入写入内存的顺序、x86架构的小端字节序,还有指令的寻址逻辑,我给你拆解开说:

首先,你在.bss段定义的buff是2字节变量,当接收用户输入时,输入的字符是按顺序写入内存的——先输入的'1'(ASCII码31H)会被存在buff的起始地址(低地址),之后按下的回车符(0DH)会存在buff+1的地址(高地址)。所以从低地址到高地址的内存布局来看,顺序是**31 0D**,不是反过来的。

接下来逐个解答你的问题:

  • 内存存放顺序:低地址位置存31H,高地址位置存0DH,也就是31 0D的顺序(从低到高读内存)。
  • mov al, byte[buff]的执行结果:byte[buff]是取buff起始位置的单个字节,也就是先写入的31H,所以al寄存器中会存入31H,不是0DH。
  • mov rsi, [buff]的执行结果:这里要注意,这个指令是把buff地址开始的内存内容加载到64位的rsi寄存器里(所以会读取连续8字节,但你只给buff预留了2字节,剩下的6字节是.bss段的未初始化内容,可能是0或者随机值)。仅看你存入的两个字节,按照x86的小端字节序,这两个字节组成的16位值是0D31H(低字节在低地址,所以整个16位值是高字节0D在前、低字节31在后),因此rsi的低16位会是这个值,高位字节则取决于buff+2到buff+7的内存内容。另外特别提醒:如果你的需求是让rsi指向buff的内存地址,应该用lea rsi, [buff],而不是mov——后者是读取内存中的值,不是获取地址。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 03:38:40