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

x86汇编:使用loop与xchg指令实现指定数组元素交换问题求助

数组分组倒序交换的汇编实现问题分析与解决方案

需求明确

需要将字节数组 inputStr(元素为 "A","B","C","D","E","F","G","H")通过 loop 和 xchg 指令转换为 "G","H","E","F","C","D","A","B"。观察规律可知,数组是按两个元素为一组进行整体倒序交换:原数组的组顺序为 AB → CD → EF → GH,交换后变为 GH → EF → CD → AB。

原代码问题诊断

你的代码存在以下核心问题:

  • 计数器逻辑错误:loop 指令会自动将 ecx 减1,你在循环内又手动执行 dec ecx,导致每次循环 ecx 减少2,循环次数完全不符合预期。
  • 地址计算混乱:通过 add ebx, ecx、sub ebx, 2 计算目标地址的方式依赖不断变化的 ecx,导致每次循环的目标位置毫无规律,无法正确定位到需要交换的元素。
  • 交换逻辑错误:需求是成对交换组内元素,而你的代码试图逐个交换单个元素,且地址跳转逻辑混乱,无法完成组级别的交换。

正确实现代码

.386
.model flat, stdcall
.stack 4096
ExitProcess PROTO, dwExitCode: DWORD

.data
    inputStr BYTE "A", "B", "C", "D", "E", "F", "G", "H"
    ; 交换后应为: "G","H","E","F","C","D","A","B"

.code
main PROC
    mov ecx, 2          ; 循环次数:共4组,只需交换前2组与后2组,所以循环2次
    mov ebx, offset inputStr  ; ebx指向数组起始位置(第1组的第一个元素)
    mov edi, ebx + 6    ; edi指向倒数第1组的第一个元素(G的位置,索引6)

swap_loop:
    ; 交换第一组第一个元素与倒数第一组第一个元素
    mov al, [ebx]
    xchg al, [edi]
    mov [ebx], al

    ; 交换第一组第二个元素与倒数第一组第二个元素
    mov al, [ebx + 1]
    xchg al, [edi + 1]
    mov [ebx + 1], al

    add ebx, 2          ; ebx移动到下一组起始位置
    sub edi, 2          ; edi移动到上一组起始位置
    loop swap_loop      ; ecx自动减1,直到为0结束循环

    INVOKE ExitProcess, 0
main ENDP
END main

代码逻辑解释

  1. 计数器设置:数组共8个元素,分为4个双元素组,只需交换第0组与第3组、第1组与第2组,因此循环次数设为2。
  2. 指针初始化:ebx 从数组开头(索引0)开始,edi 从倒数第一个组的开头(索引6)开始。
  3. 组内元素交换:每次循环完成一组两个元素的交换,先交换组内第一个元素,再交换第二个元素。
  4. 指针移动:交换完成后,ebx 向后移动2个字节(到下一组),edi 向前移动2个字节(到上一组),loop 指令自动递减 ecx,直到循环结束。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 05:50:40