汇编语言排序作业中Swap过程的实现步骤求助
汇编语言排序作业中Swap过程的实现步骤求助
嘿,我来帮你一步步理清Swap过程的实现思路,结合你现有的代码来拆解~
首先,先明确你的Swap过程的核心需求:接收两个内存地址(列表当前起始元素的地址、最小元素的地址),交换这两个地址存储的数值,而且参数是按引用传递(也就是传递地址)。下面是具体的实现步骤和代码修改建议:
第一步:理解栈参数的布局
你用的是IDEAL模式,过程调用时参数是通过栈传递的。当你调用Swap前,需要先把两个参数按顺序压入栈(比如先压入「列表起始地址」,再压入「最小元素地址」)。进入Swap过程后,栈的布局大概是这样的:
[bp+2]:返回地址(ret要跳转的位置)[bp+4]:最后压入的参数 → 最小元素的地址[bp+6]:先压入的参数 → 列表起始元素的地址
第二步:Swap过程的具体实现步骤
- 保存栈基址和寄存器:进入过程后先把
bp压栈,再设置bp=sp来固定栈帧;同时要保存会用到的寄存器(比如ax、bx、si、di),避免破坏外部程序的寄存器值。 - 获取两个参数的地址:用
si存起始元素的地址,di存最小元素的地址。 - 读取两个地址的数值:把起始元素的值读到
ax,最小元素的值读到bx。 - 交换数值:把
bx的值写入起始元素的地址,把ax的值写入最小元素的地址。 - 恢复寄存器和栈帧:弹出之前保存的寄存器,再恢复
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
相关产品推荐
相关产品推荐

