x86汇编MASM中数组未修改问题排查求助
汇编数组操作问题排查
刚接触汇编语言,有C开发背景,C里用指针、引用操作数组很轻松,但汇编里写的数组处理程序运行后,监视列表显示数组没变化,求排查错误。
原代码
.386 .model flat,stdcall .stack 4096 ExitProcess PROTO,dwExitCode:dword .data arrayA DWORD 1001d,1002d,1003d,1004d,1005d len DWORD 5 .code main proc mov ebx, OFFSET arrayA mov edx,len cmp edx,1 je lengthOne cmp edx,2 je lengthTwo cmp edx,3 jge lengthGreater lengthOne: invoke ExitProcess,0 lengthTwo: mov eax, [ebx + 4] mov dx, [ebx] mov [ebx + 4], dx mov [ebx], eax invoke ExitProcess,0 lengthGreater: mov edx, [ebx + 16] push edx mov ecx, 16 start: mov eax, [ebx + ecx] cmp eax, [ebx] je firstIndex mov edx, [ebx + ecx - 4] mov [arrayA + ecx], edx sub ecx, 3 loop start invoke ExitProcess,0 firstIndex: pop edx mov [arrayA + ecx],edx invoke ExitProcess,0 main endp end main
错误点分析
数据宽度不匹配(lengthTwo分支):
数组元素是DWORD(32位),但你用了16位寄存器dx存取元素,会截断32位数据,赋值回去时也只写入16位,导致数据损坏,甚至看起来没变化(高位字节未被修改)。循环逻辑完全错误(lengthGreater分支):
loop指令会自动将ecx减1并判断是否为0,但你手动执行sub ecx,3,导致ecx每次递减4,循环次数和偏移计算完全混乱。- 偏移计算错误:
DWORD元素的地址偏移应每次增减4,sub ecx,3会导致偏移错位,无法正确访问数组元素。 - 元素移动逻辑错误:
mov [arrayA + ecx], edx的操作方向搞反,无法实现元素向前移动的效果。
修正后的代码示例
假设你想实现的逻辑是:数组长度为1时直接退出;长度为2时交换两个元素;长度≥3时把第一个元素移到数组末尾,其余元素向前移动一位。修正后的代码如下:
.386 .model flat,stdcall .stack 4096 ExitProcess PROTO,dwExitCode:dword .data arrayA DWORD 1001d,1002d,1003d,1004d,1005d len DWORD 5 .code main proc mov ebx, OFFSET arrayA mov edx,len cmp edx,1 je lengthOne cmp edx,2 je lengthTwo cmp edx,3 jge lengthGreater lengthOne: invoke ExitProcess,0 lengthTwo: ; 交换两个DWORD元素,使用32位寄存器 mov eax, [ebx] ; 取第一个元素 mov edx, [ebx + 4] ; 取第二个元素 mov [ebx], edx ; 交换赋值 mov [ebx + 4], eax invoke ExitProcess,0 lengthGreater: mov eax, [ebx] ; 保存数组第一个元素 mov ecx, len sub ecx, 1 ; 循环次数:元素总数-1 mov esi, ebx + 4 ; 从第二个元素开始 start: mov edx, [esi] ; 取当前元素 mov [esi - 4], edx ; 将当前元素前移一个位置 add esi, 4 ; 移动到下一个元素 loop start ; ecx自动减1,直到为0 mov [ebx + (len-1)*4], eax ; 把第一个元素放到数组最后 invoke ExitProcess,0 main endp end main
内容的提问来源于stack exchange,提问作者cptalpdeniz
相关产品推荐
相关产品推荐

