8086汇编冒泡排序
时间: 2023-12-25 15:30:11 浏览: 54
8086汇编语言实现冒泡排序的代码如下所示:
```assembly
DATAS SEGMENT
a dw 19,15,13,14,18,62,14,42,35,68
DATAS ENDS
STACKS SEGMENT
dw 10 dup(0)
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
mov ax,DATAS
mov ds,ax
mov cx,10
dec cx ; 为了设置n-1
loop1:
push cx
mov bx,0
loop2:
mov ax,a[bx]
cmp ax,a[bx+2] ; 两数比较,小于等于的不变,大于则交换位置
jle continue
xchg ax,a[bx+2]
mov a[bx],ax
continue:
add bx,2 ; 因为是字,所以加2实现进行下一个
loop loop2
pop cx
loop loop1
MOV AH,4CH
INT 21H
CODES ENDS
END START
```
这段汇编代码实现了对数组a中的10个元素进行冒泡排序。在每一轮循环中,比较相邻的两个元素,如果前一个元素大于后一个元素,则交换它们的位置。经过多轮循环后,最大的元素会被交换到数组的末尾。最后,数组中的元素就按照从小到大的顺序排列好了。
相关问题
8086汇编语言冒泡排序
下面是8086汇编语言实现冒泡排序的示例代码:
```
; 冒泡排序
; 将数组a中的数据从小到大排序
; a:存放待排序数据的数组
; n:数组中数据的个数
.model small
.stack 100h
.data
a db 7, 2, 4, 1, 5, 3, 6 ; 待排序数组
n equ $-a ; 数组中数据的个数
.code
main proc
mov ax, @data
mov ds, ax
mov cx, n ; cx寄存器存储循环次数
dec cx ; 最后一个数不用比较,所以循环次数-1
L1: mov si, 0 ; si寄存器指向数组a的第一个元素
L2: mov di, si ; di寄存器指向数组a的第一个元素
inc di ; 比较数组a的相邻两个元素
L3: cmp di, n ; 如果已经比较到了数组最后一个元素,则结束本次循环
je L5
mov al, [a+si] ; 取出数组a中si位置的元素
mov bl, [a+di] ; 取出数组a中di位置的元素
cmp al, bl ; 比较两个元素的大小
jle L4 ; 如果a[si] <= a[di],则跳过交换操作
xchg al, bl ; 交换两个元素的值
mov [a+si], al ; 将交换后的值存回数组a
mov [a+di], bl
L4: inc si ; si和di指针分别向后移动一位
inc di
jmp L3
L5: loop L1 ; 循环次数减一
mov ah, 4ch
int 21h
main endp
end main
```
以上代码将数组a中的数据从小到大排序,可以通过修改比较大小的方式实现从大到小排序。
8086汇编写冒泡排序
下面是一个简单的 8086 汇编程序,用于实现冒泡排序:
```
DATA SEGMENT
ARRAY DB 5, 3, 8, 1, 2
N DW 5
DATA ENDS
CODE SEGMENT
START:
MOV AX, @DATA
MOV DS, AX
MOV BX, N
DEC BX
MOV CX, BX
OUTER_LOOP:
XOR SI, SI
INNER_LOOP:
MOV AL, ARRAY[SI]
CMP AL, ARRAY[SI+1]
JLE SKIP_SWAP
MOV DL, ARRAY[SI+1]
MOV ARRAY[SI+1], AL
MOV ARRAY[SI], DL
SKIP_SWAP:
INC SI
CMP SI, CX
JNZ INNER_LOOP
DEC CX
JNZ OUTER_LOOP
MOV AH, 4CH
INT 21H
CODE ENDS
END START
```
这个程序使用冒泡排序来对 `ARRAY` 中的元素进行排序。`N` 存储了数组的大小,`BX` 初值为 `N-1`,用于外层循环。内层循环使用 `SI` 来遍历数组,比较相邻的两个元素,如果前一个元素大于后一个元素,则交换它们的位置。内层循环结束后,`CX` 减 1,继续外层循环,直到 `CX` 为 0。程序最后使用 DOS 中断 `4CH` 来退出程序。