基于片机(AT89C52)8086三.从键盘输入10个无符号数字,按照从小到大的顺序打印。
时间: 2024-02-24 07:54:51 浏览: 56
好的,这个问题需要分为两个部分来实现。首先是从键盘输入10个无符号数字的部分,其次是按照从小到大的顺序打印的部分。
以下是一个简单的实现代码,供您参考:
```assembly
ORG 0H
MOV SP, #0FFH ; 初始化栈指针
; 从键盘输入10个无符号数字
MOV SI, #0 ; SI 寄存器用于存储输入数字的个数
MOV CX, #10 ; CX 寄存器用于循环计数
MOV AH, #01H ; AH 寄存器用于读取键盘输入
MOV BL, #0 ; BL 寄存器用于存储输入数字
LOOP1:
INT 21H ; 读取键盘输入
SUB AL, 30H ; 将 ASCII 码转换为数字
CMP AL, #0 ; 判断输入是否有效
JE SKIP1 ; 如果输入为 0,跳过
MOV [SI], AL ; 存储输入数字到内存中
INC SI ; 存储地址加 1
INC BL ; 输入数字个数加 1
SKIP1:
DEC CX ; 循环计数减 1
JNZ LOOP1 ; 如果循环次数不为 0,继续输入
; 冒泡排序,按照从小到大的顺序打印
MOV SI, #0 ; SI 寄存器用于存储当前比较的位置
MOV CX, #10 ; CX 寄存器用于循环计数
LOOP2:
MOV DI, SI ; DI 寄存器用于存储当前比较的位置
MOV AX, [SI] ; AX 寄存器用于存储当前比较的数字
INC SI ; 指向下一个数字
LOOP3:
CMP [SI], AX ; 比较当前数字和前一个数字的大小
JNC SKIP2 ; 如果当前数字大于等于前一个数字,跳过
MOV BX, [SI] ; 交换两个数字
MOV [SI], AX
MOV [DI], BX
DEC SI ; 指针回退
DEC DI
CMP DI, #0 ; 如果指针已经到达数组开头,跳出循环
JNE LOOP3
SKIP2:
DEC CX ; 循环计数减 1
JNZ LOOP2 ; 如果循环次数不为 0,继续排序
; 打印排序后的结果
MOV SI, #0 ; SI 寄存器用于存储当前打印的位置
MOV CX, #10 ; CX 寄存器用于循环计数
MOV AH, #02H ; AH 寄存器用于打印字符
LOOP4:
MOV AL, [SI] ; 将数字转换为 ASCII 码
ADD AL, 30H ; 加上 '0'
INT 21H ; 打印数字
INC SI ; 指向下一个数字
MOV DL, ',' ; 打印逗号
INT 21H
DEC CX ; 循环计数减 1
JNZ LOOP4 ; 如果循环次数不为 0,继续打印
MOV AH, #4CH ; 程序结束,退出
INT 21H
```
注意:以上代码是针对 8086 CPU 的汇编代码,与 AT89C52 不兼容,需要进行修改。同时,由于 AT89C52 没有内置键盘输入和显示功能,因此需要通过外部模块实现。
阅读全文