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

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

错误点分析

  1. 数据宽度不匹配(lengthTwo分支):
    数组元素是DWORD(32位),但你用了16位寄存器dx存取元素,会截断32位数据,赋值回去时也只写入16位,导致数据损坏,甚至看起来没变化(高位字节未被修改)。

  2. 循环逻辑完全错误(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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 03:35:25