如何解决如何在汇编中使用堆栈对数组进行排序
我想在使用堆栈时对数组进行排序:
所以首先我把它全部压入堆栈。
然后我找到堆栈中的最小元素,将其与弹出的顶部元素交换并将其移回数组。
但是有些不对劲,大约在一半的时候就搞砸了(DI 比实际值低一个索引)
data segment
a db 5h,12h,6h,4h,9h
len equ $-a
loop_counter db len
min_index dw 0
min db ?
ends
stack segment
dw 128 dup(0)
ends
code segment ;Todo: Locate min in stack xchg it with top element copy to array and pop it :|
start:
mov ax,data
mov ds,ax
mov bx,0
mov cx,0
mov cl,loop_counter
push_arr_to_stack:
mov al,a[bx]
push ax
inc bx
loop push_arr_to_stack
mov bx,len-1
mov ax,loop_counter
mov bp,sp
mov ax,[bp]
mov bx,[bp]
mov di,0
mov dx,0
mov si,2
mov di_check,len-loop_counter
find_min_to_arr:
cmp bx,ax
jb new_min
mov bx,[bp+si]
add si,2
loop find_min_to_arr
mov min,al
xchg a[di],al
jmp pop_min
new_min:
mov ax,bx
mov bx,[bp+si]
mov min_index,si
sub min_index,2
add si,2
dec cx
jmp find_min_to_arr
pop_min:
mov dx,[bp]
xchg di,min_index
mov [bp+di],dx
xchg di,min_index
pop dx
mov dx,0
inc di
mov si,0
cmp di,len
je b
dec loop_counter
mov cl,loop_counter
jmp find_min_to_arr
b:
mov ax,4c00h ; exit to operating system.
int 21h
ends
end start
解决方法
首先我把它全部压入堆栈。
这部分很好,但出于速度原因,您应该忘记 loop ..
并将其替换为 dec cx
后跟 jnz ..
然后我找到堆栈中的最小元素,将其与弹出的顶部元素交换并将其移回数组。
这里你的代码变得非常复杂并且包含很多错误。此外,代码不会在定位的最小值和堆栈顶部的元素之间执行真正的交换。
我尝试修改您的代码,但通常情况下,它无法修复。下面是我的重写,你应该学习,不要只是复制!
我将 loop_counter 定义为 word 变量,因为这样更容易。此外,我将它保存在 DX
寄存器中,它坐在那里什么也不做......
将其全部压入堆栈
mov bx,dx
push_arr_to_stack:
mov al,a[bx-1]
push ax
dec bx
jnz push_arr_to_stack
我反向推入数组,因此堆栈中的元素与原始数组的顺序相同。这对于任务来说不是必需的,但它更简单,并且将 BX
寄存器保留为零以供下面使用。
定位栈中的最小值
Again:
mov bp,sp
xor si,si
mov al,[bp+si] ; Chosen minimum
mov di,si ; Remember its position
mov cx,dx
dec cx ; N elements = N-1 compares
jz .c
.a: add si,2
cmp al,[bp+si]
jbe .b
mov al,[bp+si] ; New minimum
mov di,si ; Remember its position
.b: dec cx
jnz .a
与顶部元素交换
.c: xchg al,[bp]
mov [bp+di],al
弹出并移回数组
pop ax
mov a[bx],al
inc bx
dec dx
jnz Again
这里重要的是,上面的内容完全符合任务描述的要求。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。