编写交换偶数数组相邻元素的汇编代码出错,请求排查
汇编代码错误排查与修正
核心错误分析
元素地址引用错误
你用mov edx, arr + 1获取数组第二个元素的方式完全错误。arr是dword类型数组,每个元素占4字节,第二个元素的正确偏移是arr + 4(或arr + type arr)。arr + 1是字节偏移,指向第一个元素的第2个字节位置:- 第一个元素
1在小端存储模式下,内存字节序列为01 00 00 00 - 从
arr+1地址开始取4字节,得到的字节序列是00 00 00 01,作为dword解析后就是01000000,这就是你看到的异常结果。
另外要注意:若要读取内存中的元素值,必须用[]包裹地址,否则只是把地址本身加载到寄存器。
- 第一个元素
循环次数设置错误
lengthof arr的值是4,但你只需要交换3对相邻元素(索引0&1、1&2、2&3)。循环4次的话,第四次执行时esi会指向arr+12,此时[esi+4]已经超出数组的合法内存范围,会访问非法数据并破坏数组内容。
修正后的代码
.386 .model flat,stdcall .stack 4096 ExitProcess proto,dwExitCode:dword .data arr dword 1, 2, 3, 4 .code main proc mov esi, offset arr mov ecx, lengthof arr - 1 ; 循环次数改为数组长度减1 L1: mov eax, [esi] mov ebx, [esi + 4] mov [esi], ebx mov [esi + 4], eax add esi, type arr Loop L1 mov edx, [arr + 4] ; 正确引用第二个元素,通过[]读取内存值 invoke ExitProcess,0 main endp end main
验证说明
修正后:
- 循环执行3次,依次交换数组的0&1、1&2、2&3元素,最终数组变为
2,1,4,3 mov edx, [arr + 4]会正确取出第二个元素1,十六进制显示为00000001
内容的提问来源于stack exchange,提问作者AnonymousThankfulPerson
相关产品推荐
相关产品推荐

