关于汇编语言冒泡排序问题

来源:百度知道 编辑:UC知道 时间:2024/06/01 14:17:49
汇编书上一道例题:在附加段中有一个字数组,其首地址已存放在di寄存器中,在数组中第一个字存放该数组长度。要求编制一个程序使该数组中的数从小到大的次序排列整齐。书上是这么做的:
data segment
save_cnt dw ?
start_addr dw ?
data ends
prognam segment
bubule proc far
assume cs:prognam,ds:data
push ds
push cx
push ax
push bx
mov ax,data
mov ds,ax

mov start_addr,di
mov cx,es:[di]
mov save_cnt,cx
init: mov bx,1
dec save_cnt
jz sorted

mov cx,save_cnt
mov di,start_addr 问题就出在这里,上边不是已经把di跟cx传送过一次了么,为什么这里又传送一样,这不是多此一举么?

楼主 前面是将di传到start_addr,等于是用di作为指针进行变址寻址。然后将cx传到save_cnt 后面是反过来传。程序不存在什么问题,我贴一下完整的程序吧。这是经典例题。
例:在附加段中有一个字数组,其首地址已存放在DI寄存器中,在数组的第一个字中存放着该数组的长度.要求编制一个程序是该数组中的数按照从小到大的次序排列整齐.
根据标志位起泡排序算法的程序实现:
data segment
save_cnt dw
start_addr dw
data ends
Extra segment
A dw 5, 8,5,16,84,32
Extra ends
prognam segment
bubble proc far
assume cs:prognam, ds:data, es:extra
push ds
push cx
push ax
push bx
mov ax, data
mov ds, ax
mov ax, extra
mov es, ax
lea di, a
mov start_addr, di
mov cx, es:[di]
mov save_cnt, cx
init: mov bx, 1
dec save_cnt
jz sorted
mov di, start_addr
next: add di, 2
mov ax, es:[di]
cmp es:[di+2], ax
jae cont
xchg es:[di+2], ax
mov es:[di], ax
sub bx, bx
cont: loop next
cmp bx, 0
je init
sorted: mov di, tart_addr
pop bx
pop ax
pop cx
pop ds
bubble endp
prognam en