文章目录
一:题目描述
在键盘输入任意10个数
- 按从小到大排序后,在计算机屏幕上先输出来。要有结果提示(字符串显示)。
- 将10个数做累加,结果在计算机屏幕显示累加和。
二:伪指令的定义
1.数据段
DATAS SEGMENT
string_1 DB 'Please input a numbers(0-65536):','$'
string_2 DB 'ERROR: OVERFLOW! Please input again:','$'
string_3 DB 'The array you have input is:',0ah,0dh,'$'
string_4 DB 'After Sort the num is:',0ah,0dh,'$'
string_5 DB ' ','$'
DATA DW 10 DUP(?)
massege DB 'The sum of the array is: ',0ah,0DH,'$'
DATAS ENDS
说明:
string_1 | 输入范围提示 |
---|---|
string_2 | 输入错误提示 |
string_3 | 输出原数组提示 |
string_4 | 输出排序后数组提示 |
string_5 | 空格符 |
DATA | 缓冲区数组 |
2.堆栈段
STACKS SEGMENT
DW 256 dup(?)
STACKS ENDS
3.代码段
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
三:模块分解与实现
1. DOS输入10个数字
- 输入10个无符号数存入缓冲区,并且保证 n u m < 65536 num < 65536 num<65536
为何输入范围是65536呢 一个字的最大表示范围是 F F F F FFFF FFFF 其在十进制的表示下为 65535
HEX | FFFF |
---|---|
DEC | 65535 |
BIN | 1111 1111 1111 1111 |
1.1 输入函数子程序
;---------输入函数(单数字输入)------------
Input PROC Near
push AX
push BX
push CX
push DX
;---------输入提示--------------
MOV BX, 0
CLC
MOV DX, 0
;----------输入数字--------------
Lp_0:
MOV AH, 1
INT 21H
CMP AL, 20H ;回车
JE L_CRLF
;----- x belong to [0,9] ----------
SUB AL, 30H ; ASCII -> int
JL L_ERROR
CMP AL, 9
JG L_ERROR
;------- string -> int -----------
MOV AH, 0 ;将 AL扩展成 AX
XCHG AX, BX ;保护 AX值
MOV CX, 10
MUL CX ; bx *= 10
ADD AX , BX
JC L_ERROR ; OVERFLOW处理
XCHG AX, BX
JMP Lp_0
L_ERROR:
MOV DX, 0
MOV BX, 0
CALL CRLF ; 换行
CALL ERROR ; 输出错误提示
JMP Lp_0
L_CRLF: ; 以换行作为一个数的结束标志
MOV DX, 0
MOV DATA[SI