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

汇编语言排序作业中Swap过程的实现步骤求助

汇编语言排序作业中Swap过程的实现步骤求助

嘿,我来帮你一步步理清Swap过程的实现思路,结合你现有的代码来拆解~

首先,先明确你的Swap过程的核心需求:接收两个内存地址(列表当前起始元素的地址、最小元素的地址),交换这两个地址存储的数值,而且参数是按引用传递(也就是传递地址)。下面是具体的实现步骤和代码修改建议:

第一步:理解栈参数的布局

你用的是IDEAL模式,过程调用时参数是通过栈传递的。当你调用Swap前,需要先把两个参数按顺序压入栈(比如先压入「列表起始地址」,再压入「最小元素地址」)。进入Swap过程后,栈的布局大概是这样的:

  • [bp+2]:返回地址(ret要跳转的位置)
  • [bp+4]:最后压入的参数 → 最小元素的地址
  • [bp+6]:先压入的参数 → 列表起始元素的地址

第二步:Swap过程的具体实现步骤

  1. 保存栈基址和寄存器:进入过程后先把bp压栈,再设置bp=sp来固定栈帧;同时要保存会用到的寄存器(比如ax、bx、si、di),避免破坏外部程序的寄存器值。
  2. 获取两个参数的地址:用si存起始元素的地址,di存最小元素的地址。
  3. 读取两个地址的数值:把起始元素的值读到ax,最小元素的值读到bx。
  4. 交换数值:把bx的值写入起始元素的地址,把ax的值写入最小元素的地址。
  5. 恢复寄存器和栈帧:弹出之前保存的寄存器,再恢复bp,最后用ret 4平衡栈(因为压入了两个2字节的参数,总共4字节)。

修改后的Swap过程代码

proc swap
push bp          ; 保存旧的栈基址
mov bp, sp       ; 建立新的栈帧
push ax          ; 保存会用到的寄存器,避免外部值被破坏
push bx
push si
push di

; 获取参数:[bp+6]是起始元素地址,[bp+4]是最小元素地址
mov si, [bp+6]
mov di, [bp+4]

; 读取两个地址的数值
mov ax, [word ptr si]  ; 因为数组是dw类型,用word ptr明确宽度
mov bx, [word ptr di]

; 交换数值
mov [word ptr si], bx
mov [word ptr di], ax

; 恢复寄存器
pop di
pop si
pop bx
pop ax
pop bp           ; 恢复旧的栈基址
ret 4            ; 平衡栈:弹出两个参数(每个2字节,共4字节)
endp swap

第三步:调整调用Swap的流程

你现在的代码只调用了一次min和swap,但选择排序需要循环处理每个未排序的起始位置,而且要正确传递Swap的参数。比如,假设你的min过程最后把最小元素的地址存在ax里(建议修改min用ax返回结果,这是汇编里的常规做法),调用Swap的代码可以改成这样:

; 先获取数组长度到cx,循环次数是长度-1(最后一个元素不用处理)
mov cx, [amount]
dec cx
mov si, offset arr  ; si指向当前要交换的起始元素

sort_loop:
push si            ; 把起始地址传给min
call min           ; 假设min返回ax=最小元素的地址,并且用ret 2平衡栈
push si            ; 给Swap传第一个参数:起始地址
push ax            ; 给Swap传第二个参数:最小元素地址
call swap
add si, 2          ; 下一个起始元素的地址(dw类型,每次+2)
loop sort_loop     ; 循环处理所有元素

小提醒

  • 你的min过程目前是修改栈里的参数来返回结果,这不是常规做法,建议改成用ax返回最小元素的地址,这样代码更易读也更符合汇编规范。
  • 注意数组是dw(双字节)类型,所以操作内存时要明确用word ptr,避免宽度错误。

这样你的Swap过程就能正常完成数值交换,配合循环就能实现整个数组的从小到大排序啦~

备注:内容来源于stack exchange,提问作者yarden

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.20 07:23:02