;汇编语言边一个程序从键盘上输入N个十进制数,(数小于等于65536,N可变),要求按排序的方式对N个数进行显示,
;用MASM5.0编译通过,以下是运行实例
;
;E:\masm1>1130
;12345
;2
;333
;44
;55
;666
;
;00002
;00044
;00055
;00333
;00666
;12345
;
E:\masm1>
;
data segment
SS_W DB 0
SS_Q DB 0
SS_B DB 0
SS_S DB 0
SS_G DB 0,'$'
CUT_0 DB 0 ;去0标志,该标志=0时,将'0'改成空格显示,否则显示'0'
DB 'HHHHHHHHHHHHH'
N1 DW 50 DUP(0) ;输入的N个数存放位置
BUF DW 0 ;每次输入的数暂存
CN DB 0 ;输入的数个数
CN1 DB 0
DB 'HHHHHHHHHHHHH'
CRLF DB 0DH,0AH,24H
DB 'HHHHHHHHHH'
data ends
code segment
assume cs:code, ds:data
main proc far
start:
push ds
xor ax,ax
push ax
mov ax,data
mov ds,ax
;-------------------------
MOV DI,OFFSET N1
MOV AX,0
MOV BUF,AX
IN_1:
MOV AH,08
INT 21H ;输入在AL中
CMP AL,'0'
JB NO_09
CMP AL,'9'
JA NO_09
MOV AH,2 ;输入的是0-9,显示之
MOV DL,AL
INT 21H
SUB AL,30H ;将输入在AL中的ASCII码转成数字
MOV AH,0
PUSH AX
MOV BX,BUF
MOV AX,10
MUL BX ;BUF * 10 结果在DX:AX中 (DX=0)
POP BX
ADD AX,BX ;AX <== BUF * 10 + 新输入的1位数字
MOV BUF,AX ;保存
MOV [DI],AX
JMP IN_1 ;输入该数字的下一位
NO_09: ;输入的非0-9
CMP AL,0DH ;是回车符吗?
JE YES_0D ;是转
JMP IN_1 ;不是则输入该数字的下一位
YES_0D: ;是回车符
MOV AX,BUF
CMP AX,0 ;是输入完了一个数还是输入完了全部N个数,若BUF=0,则是后者
JZ IN_DOWN ;全部数字输入完毕
CALL CRLF_P
ADD DI,2 ;为输入下一个数字,修改DI指针
INC CN ;输入的数计数器加1
MOV AX,0
MOV BUF,AX ;初始化BUF为0
JMP IN_1 ;继续输入下一个数字
IN_DOWN:
MOV AL,CN ;如果没有输入任何数字直接回车了,结束程序
CMP AL,0
JZ ENDD
CALL CRLF_P
CALL PX_P
MOV CX,0
MOV CL,CN
MOV BX,OFFSET N1
DISP_NEXT:
MOV DX,0 ;高位
MOV AX,[BX] ;低位
CALL HTOD
CALL CRLF_P
INC BX
INC BX
LOOP DISP_NEXT
ENDD:
ret
main endp
;==================
;排序子程序
PX_P PROC NEAR
MOV AL,CN
MOV CN1,AL ;大循环计数器
LOOP_PX1:
MOV CL,CN ;小循环计数器
MOV CH,0
DEC CX
MOV BX,OFFSET N1
LOOP_PX2:
MOV AX,[BX]
CMP AX,[BX+2]
JNA PX3 ;前数不>后数, 则不交换
PUSH AX ;前数>后数, 则交换
MOV AX,[BX+2]
MOV [BX],AX
POP AX
MOV [BX+2],AX
PX3:
ADD BX,2
LOOP LOOP_PX2
DEC CN1
JZ PX_END
JMP LOOP_PX1
PX_END:
RET
PX_P ENDP
;==================
CRLF_P PROC NEAR
PUSH AX
PUSH DX
MOV AH,09
MOV DX,OFFSET CRLF
INT 21H
POP DX
POP AX
RET
CRLF_P ENDP
;==================
HTOD PROC NEAR
;入口 DX:AX 32位数,值<99999
;出口:以10进制输出该值
PUSH CX
PUSH DS
MOV CX,10000
DIV CX
PUSH DX ;保存余数
ADD AL,30H
MOV SS_W,AL
POP AX ;取余数
MOV DX,0
MOV CX,1000
DIV CX
PUSH DX ;保存余数
ADD AL,30H
MOV SS_Q,AL
POP AX ;取余数
MOV DX,0
MOV CX,100
DIV CX
PUSH DX ;保存余数
ADD AL,30H
MOV SS_B,AL
POP AX ;取余数
MOV DX,0
MOV CX,10
DIV CX
PUSH DX ;保存余数
ADD AL,30H
MOV SS_S,AL
POP DX ;取余数
ADD DL,30H
MOV SS_G,DL
MOV DX,OFFSET SS_W
MOV AH,09
INT 21H
POP DS
POP CX
RET
HTOD ENDP
;==================
code ends
end start
DK
mark