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

MASM中使用MOV指令向寄存器复制字符串是否会逆序存储?

MASM中MOV指令加载字符串到寄存器的存储顺序问题

直接给结论:是的,用mov eax, "abc"这类指令时,字符串会以“逆序”的形式存储在寄存器中——但这本质是x86架构的小端特性,不是MASM的特殊规则。

下面逐个拆解你的假设,再分析你的代码:

你的假设验证

  • 假设1:str dd "abc"的存储方式
    没错。MASM会把"abc"自动补0凑成4字节,然后按x86的小端规则存储:从变量的起始地址(最低内存地址)开始,字节顺序是'a'、'b'、'c'、0。但如果把这个双字加载到EAX,寄存器里的数值是0x00636261——从数值的高位到低位看,就是0、'c'、'b'、'a',这就是你感觉“逆序”的原因。

  • 假设2:str db "abc"的存储方式
    完全正确。db是字节数组,MASM会严格按字符串的自然顺序存:起始地址放'a',接着是'b'、'c',和数组索引逻辑一致。

  • 假设3:SCAS/MOVS指令的地址处理
    对的。这些串操作指令直接用ESI/EDI指向的内存地址,不会搞栈的后进先出那套,就是按线性地址顺序处理数据。

  • 假设4:字符数组与字符串加载到寄存器的一致性
    没错。mov eax, "abc"和mov eax, {'a','b','c',0}生成的机器码完全一样,最终EAX里的数值都是0x00636261。

  • 假设5:MOVSD复制字节数组到双字变量的结果
    这里你搞错了。MOVSD只是按双字单位原样复制内存内容,不会主动逆序数据。比如arLetters db "abcd"在内存里是'a'、'b'、'c'、'd',MOVSD复制后,strLetters的内存内容和arLetters完全一样——数值层面这个双字是0x64636261,但内存存储顺序还是'a'、'b'、'c'、'd'(小端规则)。

你的代码分析

你的代码不会设置零标志,最终会输出"No match.",原因如下:

  1. movsd把arLetters的4字节原样复制到strLetters,所以strLetters对应的双字数值是0x64636261。
  2. mov eax, "dcba"会被MASM转成mov eax, 0x61626364——因为"dcba"的字节是'd'、'c'、'b'、'a',按小端规则转成双字数值就是0x61626364。
  3. repnz scasd对比这两个数值:0x64636261和0x61626364明显不等,所以零标志ZF不会置1,代码跳转到printer分支。

如果想让匹配成功,把mov eax, "dcba"改成mov eax, "abcd"就行——此时EAX的数值是0x64636261,和strLetters的数值一致,repnz scasd会匹配成功,ZF置1,直接跳转到close。

另外补充个小细节:你提到的“弹出字符串输出正确顺序”,其实是因为加载双字到寄存器后,你按小端的字节顺序(从AL到更高字节)读取输出,比如EAX值是0x64636261时,AL是'a'、AH是'b',依次输出就得到"abcd",这是小端架构的正常表现,不是变量存储时做了逆序处理。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 07:04:44