彙編實現16位有符號二進位制數排序並輸出
data segment
BUF DW 2560,-3,4387,12,6250,-79,54,88
COUNT EQU $-BUF
OUTBUF DB 7 DUP(0),'$'
data ends
code segment
assume cs:code,ds:data
OUTPUT PROC
PUSH AX
PUSH BX
PUSH CX
PUSH DX
MOV BX,OFFSET OUTBUF+5
MOV BYTE PTR [BX],' '
MOV AX,[DI]
CMP AX,0
JGE LGE
MOV DL,'-'
PUSH AX
MOV AH,2
INT 21H
POP AX
XOR CX,CX
SUB CX,AX
MOV AX,CX
LGE:
MOV CX,10 ;做32位除以16位的除法,故將10送CX
AGAIN:
MOV DX,0 ;無符號數擴充套件將16位擴充套件為32位
DIV CX
ADD DL,30H ;將DL中的一位十進位制數轉換為ASCII碼
DEC BX ;調整指標
MOV [BX],DL
OR AX,AX ;根據商是否為0,設定ZF
JNZ AGAIN ;判商是否為0,不為0繼續除以10
MOV DX,BX ;將輸出資料區的偏移首地址送DX
MOV AH,9
INT 21H
POP DX
POP CX
POP BX
POP AX
RET
OUTPUT ENDP
start proc far
push ds
sub ax,ax
push ax
mov ax,data
mov ds,ax
MOV DI,OFFSET BUF
MOV DX,(COUNT/2)-1 ;設定外迴圈計數器
OUTSID:
MOV CX,DX ;設定內迴圈計數器
MOV SI,DI
INSIDE:
INC SI
INC SI
MOV AX,[DI]
MOV BX,[SI]
CMP AX,BX
JLE NEXCHG
MOV [DI],BX
MOV [SI],AX
NEXCHG:
LOOP INSIDE
CALL OUTPUT
INC DI
INC DI
DEC DX
JNZ OUTSID
ret
start endp
code ends
end start