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

