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

编写交换偶数数组相邻元素的汇编代码出错,请求排查

汇编代码错误排查与修正

核心错误分析

  • 元素地址引用错误
    你用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

验证说明

修正后:

  1. 循环执行3次,依次交换数组的0&1、1&2、2&3元素,最终数组变为2,1,4,3
  2. mov edx, [arr + 4]会正确取出第二个元素1,十六进制显示为00000001

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 00:46:31