实例:将Buffer缓冲区中的10个数字进行由小到大排序

使用汇编语言将Buffer缓冲区中的10个数字进行由小到大排序,然后打印到控制台。

使用汇编语言将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

运行效果图:

实例:将Buffer缓冲区中的10个数字进行由小到大排序

锲而舍之,朽木不折;锲而不舍,金石可镂。——《荀子·劝学》
0 不喜欢
说说我的看法 -
全部评论(
没有评论
关于
本网站属于个人的非赢利性网站,转载的文章遵循原作者的版权声明,如果原文没有版权声明,请来信告知:hxstrive@outlook.com
公众号