使用汇编语言将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
运行效果图: