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
代码逻辑解释
- 计数器设置:数组共8个元素,分为4个双元素组,只需交换第0组与第3组、第1组与第2组,因此循环次数设为2。
- 指针初始化:
ebx从数组开头(索引0)开始,edi从倒数第一个组的开头(索引6)开始。 - 组内元素交换:每次循环完成一组两个元素的交换,先交换组内第一个元素,再交换第二个元素。
- 指针移动:交换完成后,
ebx向后移动2个字节(到下一组),edi向前移动2个字节(到上一组),loop指令自动递减ecx,直到循环结束。
内容的提问来源于stack exchange,提问作者Thy Nguyen
相关产品推荐
相关产品推荐

