从键盘输入10个无符号十进制数(小于256),将其转换为二进制数并存放在NUM字节型变量中,找出其中的最大数,并在屏幕上显示出来。再写一个汇编代码
时间: 2024-02-16 18:01:13 浏览: 21
好的,以下是修改后的汇编代码:
```
COUNT EQU 10
DATA SEGMENT
NUM DB COUNT DUP(?) ; 存放输入的数值
IBUF DB 7, 0, 6 DUP(?) ; 输入缓冲区
OBUF DB 6 DUP(?) ; 输出缓冲区
INFORI DB "Please input 10 numbers:" , 0AH, 0DH, '$'
INFOR2 DB "The max found in the 10 numbers is S"
INFOR3 DB OAH, 0DH,'$'
DATA ENDS
STACK SEGMENT
DATA2 DW 40 DUP(?) ; 定义栈空间
TOP EQU LENGTH DATA2
STACK ENDS
CODE SEGMENT
ASSUME CS:CODE, DS:DATA, SS:STACK
START:
MOV AX, DATA
MOV DS, AX
MOV AX, STACK
MOV SS, AX
MOV AX, TOP
MOV SP, AX
DSTRING INFORI ; 显示提示信息
MOV BX, OFFSET NUM ; 存储输入的数值
MOV CX, COUNT
LOOPI:
CALL GET_DEC ; 获取十进制数
CALL DEX_TO_BIN ; 转换为二进制数
DSTRING INFOR3
MOV [BX], AL ; 存储二进制数
INC BX
LOOP LOOPI
MOV AX, OFFSET NUM
PUSH AX
MOV CX, COUNT
PUSH CX
CALL FMAX ; 找出最大的数
DSTRING INFOR2
CALL BTOAD ; 显示最大数的十进制值
MOV AH, 4CH
INT 21H
; 子程序:将一个无符号字节型十进制数转换为二进制数
DEX_TO_BIN PROC NEAR
PUSH AX
MOV AH, 0 ; 存储除数
MOV BL, 2 ; 除数为2
MOV CL, 7 ; 循环7次
MOV AL, DL ; 将十进制数存储在DL中
XOR DH, DH ; 存储二进制数
LOOP1:
DIV BL ; 除法运算
MOV DL, AH ; 余数存储在DL中
SHL DH, 1 ; 左移1位
OR DH, DL ; 将余数存储到二进制数中
MOV AH, 0 ; 清空余数
LOOP LOOP1
POP AX
RET
DEX_TO_BIN ENDP
; 子程序:在N个无符号字节型二进制数中找出最大数
FMAX PROC NEAR
PUSH BP
MOV BP, SP
MOV AX, [BP+6] ; 存储数组长度
MOV BL, [BP+4] ; 存储数组首地址
MOV CL, 0 ; 存储最大值
MOV CH, 0
LOOP2:
MOV DL, [BL] ; 取出当前数组元素
CMP DL, CL ; 与最大值比较
JBE CONTINUE ; 如果小于等于最大值,跳过
MOV CL, DL ; 更新最大值
MOV CH, 0
JMP CONTINUE
UPDATE:
MOV CH, DL ; 存储最大值的高位
CONTINUE:
INC BL ; 指向下一个数组元素
DEC AX
JNZ LOOP2 ; 继续比较下一个元素
MOV AL, CL ; 将最大值存储在AL中
POP BP
RET
FMAX ENDP
; 子程序:将一个无符号字节型二进制数转换为十进制数并在屏幕上显示
BTOAD PROC NEAR
PUSH AX
PUSH BX
PUSH CX
PUSH DX
XOR AX, AX ; 存储十进制数
MOV CX, 8
MOV BL, 1
MOV BX, OFFSET OBUF ; 存储输出的字符串
LOOP3:
SHL AL, 1 ; 左移1位
MOV DL, [BX] ; 取出二进制数的当前位
AND DL, 1 ; 取出最低位
ADD AL, DL ; 将最低位加入十进制数中
INC BX ; 指向下一个二进制数的位
LOOP LOOP3
CALL DTOA ; 将十进制数转换为字符串
DSTRING OBUF ; 显示字符串
POP DX
POP CX
POP BX
POP AX
RET
BTOAD ENDP
; 子程序:将键盘输入的十进制数读入并转换为数值
GET_DEC PROC NEAR
PUSH AX
PUSH BX
PUSH CX
PUSH DX
MOV CX, 0
MOV BX, OFFSET IBUF
MOV AH, 1
INT 21H ; 从键盘读入一个字符
CMP AL, 0DH ; 判断是否为回车键
JE END_INPUT
SUB AL, '0' ; 转换为数字
MOV DL, AL
MOV AH, 0
MOV AL, CL
MUL BL
ADD AL, DL
MOV CL, AL
INC BX
JMP GET_DEC
END_INPUT:
MOV AL, CL ; 存储十进制数
POP DX
POP CX
POP BX
POP AX
RET
GET_DEC ENDP
; 子程序:将一个无符号字节型十进制数转换为字符串
DTOA PROC NEAR
PUSH AX
PUSH BX
PUSH CX
MOV BL, 10 ; 除数为10
MOV CX, 0 ; 保存位数
LOOP4:
XOR DX, DX ; 清空余数
DIV BL ; 除法运算
PUSH DX ; 存储余数
INC CX ; 位数加1
TEST AX, AX ; 如果商为0,跳出
JNZ LOOP4
MOV BX, OFFSET OBUF; 存储转换后的字符串
MOV DL, '0' ; 将余数转换为字符
POP_LOOP:
POP AX ; 取出余数
ADD DL, AL ; 转换为字符
MOV [BX], DL ; 存储字符
INC BX ; 指向下一个字符位置
LOOP POP_LOOP ; 继续转换下一个余数
MOV AL, '$' ; 字符串以'$'结束
MOV [BX], AL
POP CX
POP BX
POP AX
RET
DTOA ENDP
; 定义显示字符串信息的宏指令
DSTRING MACRO MSG
MOV AH, 9
LEA DX, MSG
INT 21H
ENDM
CODE ENDS
END START
```
这个程序的基本思路是:从键盘读入10个十进制数,将其转换为二进制数并存储在NUM数组中,然后找出NUM数组中的最大值,并将其转换为十进制数并显示出来。