x86汇编填充1-10数组时ECX读取值异常问题咨询
问题分析与解决
嘿,我一下子就get到你问题的根源啦!
你现在看到ECX里都是04030201这种拼接出来的超大值,核心问题是数组元素的访问步长错了!
你用EBX作为数组的指针/索引,每次自增1来写入数据,但别忘了:DWORD是32位(4字节)类型的元素,数组里每个元素要占用4个连续的内存地址。你现在每次只让EBX+1,相当于把1、2、3、4这些值依次写入了同一个DWORD元素的4个字节里——而x86是小端字节序(低字节存在低地址),这四个字节拼起来的DWORD值就是0x04030201,完全不是你想要的“每个元素存单独的1、2、3...”的效果。
怎么修正?
- 调整指针步长:在
loopArray循环里,每次写完数据后,把EBX增加4而不是1,这样每次都会定位到下一个DWORD元素的起始地址。比如原来的inc ebx要改成add ebx, 4。 - 调试验证:修改后,在
PrintLoop2里加载数组元素到ECX时,每个ECX的值就会是1、2、3...10这些你预期的数值了。
给你个简单的代码片段参考(假设数组基址存在ESI):
; 初始化:ESI指向数组起始地址,EBX初始为0,ECX设为计数10 mov esi, offset dwordArray mov ebx, 0 mov ecx, 10 loopArray: mov [esi + ebx], ecx ; 写入当前数值(你可以根据自己的逻辑调整存值的寄存器) add ebx, 4 ; 关键:步长设为4,跳到下一个DWORD元素 dec ecx jnz loopArray
这样改完,每个DWORD元素都会被单独写入正确的数值,调试时就不会再出现那种奇怪的拼接值啦!
内容的提问来源于stack exchange,提问作者Some_Dude
相关产品推荐
相关产品推荐

