使用汇编语言将Buffer缓冲区中的10个数字进行由小到大排序,然后打印到控制台。实现代码如下:
; 定义一个数据段
datas segment
buffer db 23, 12, 45, 32, 27, 3, 9, 58, 81, 72 ; 假设的10个数据
n equ 10 ; 定义符号n为常数10
flag db 0 ; flag=0表示当前某一个内部循环中没有进行数据交换,flag=1相反
msg1 db 'sort before: $'
msg2 db 'sort after: $'
datas ends
; 定义一个代码段
codes segment
assume cs:codes, ds:datas
start:
mov ax, datas
mov ds, ax
mov dx, offset msg1 ; 显示排序前数据
call disMessage
call disBuffer
mov bx, offset buffer-1 ; 设置缓冲区开始地址
mov si, 1 ; i=1
for1:
mov di, si
inc di ; j=i+1
mov flag, 0
for2:
mov al, [bx+si]
cmp al, [bx+di] ; a[i]与a[j]比较
jbe next1 ; a[i]小于等于a[j]转
xchg al, [bx+di] ; a[i]与a[j]交换
mov [bx+si],al
mov flag, 1
next1:
inc di ; j=j+1
cmp di, n
jbe for2 ; j<=n时转
next2:
cmp flag, 0
je next3
inc si
cmp si, n-1
jbe for1 ; i<=n-1时转
next3:
mov dx, offset msg2 ; 显示排序后的数据
call disMessage
call disBuffer
mov ah, 4ch ; 程序正常退出
int 21h
; 子程序名:disBuffer
; 功 能:循环显示buffer缓冲区中的数字
; 入口参数:无
; 出口参数:无
disBuffer proc
mov bx, offset buffer
mov si, 0
for3:
xor ax, ax
mov al, [bx+si]
call disDecimal
mov dl, ' '
mov ah, 2h
int 21h
inc si
cmp si, n-1
jbe for3
call newLine
ret
disBuffer endp
; 子程序名:disDecimal
; 功 能:用十进制数的形式显示8位二进制数
; 入口参数:al=8位二进制数
; 出口参数:无
disDecimal proc
mov cx, 3
mov dl, 10
disp1:
div dl
xchg ah, al
add al, 30h
push ax
xchg ah, al
mov ah, 0h
loop disp1
mov cx, 3
disp2:
pop dx
cmp dl, '0'
jne disp3
mov dx, 0h
disp3:
mov ah, 2h
int 21h
loop disp2
ret
disDecimal endp
; 子程序名:disMessage
; 功 能:显示提示信息
; 入口参数:dx=提示信息的首地址
; 出口参数:无
disMessage proc
push ax
mov ah, 09h
int 21h
pop ax
ret
disMessage endp
; 子程序名:newLine
; 功 能:光标移动到下一行
; 入口参数:无
; 出口参数:无
newLine proc
push dx
push ax
mov dl, 0dh ;13 回车符
mov ah, 2h
int 21h
mov dl, 0ah ;10 换行符
int 21h
pop ax
pop dx
ret
newLine endp
codes ends
end start运行效果图:
