;从键盘输入一个3位的十进制无符号整数,请分别用二进制、八进制和十六进制形式输出。
这个程序为什么输不出16进制的形式?请大家帮忙看看哪出了问题。。。;从键盘输入一个3位的十进制无符号整数,请分别用二进制、八进制和十六进制形式输出。
TITLE INT I/O
DATA SEGMENT
X DB 'X=','$'
CRLF DB 0AH,0DH,'$'
STR10 DB 4 DUP('$')
STR2 DB 17 DUP('$')
STR8 DB 7 DUP ('$')
STR16 DB 5 DUP('$')
DATA ENDS
STACK SEGMENT PARA STACK 'STACK'
DB 100 DUP(?)
STACK ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,SS:STACK
begin: MOV AX,DATA
MOV DS,AX
LEA BX,STR10
CALL READNUM ;读入 X值到指定的单元STR10
LEA BX,STR10 ;把X转换为二进制数
CALL BCDTOB
MOV AX,WORD PTR STR10
LEA BX,STR2 ;把二进制数转换为二进制ASC码串
CALL BTOSTR2
lea dx,str2
call outstr
LEA DX, CRLF
CALL OUTSTR ;输出字符串:"回车、换行"
MOV AX,WORD PTR STR10
LEA BX,STR8 ;把二进制数转换为八进制ASC码串
CALL BTOSTR8
lea dx,str8
call outstr
LEA DX, CRLF
CALL OUTSTR ;输出字符串:"回车、换行"
MOV AH,4CH
INT 21H
MOV AX,WORD PTR STR10
LEA BX,STR16 ;把二进制数转换为十六进制ASC码串
CALL BTOSTR16
lea dx,str16
call outstr
MOV AH,4CH
INT 21H
;子程序名:READNUM
;功能:从键盘输入一个三位的无符号数到指定的存储单元
;入口参数:BX为存放二进制数的起始地址。
;使用的寄存器:AX,DX
READNUM PROC
PUSH AX
PUSH DX
LEA DX,X
CALL OUTSTR
INC BX ;保证高位在高地址
INC BX
MOV AH,1
INT 21H
MOV [BX],AL
DEC BX
MOV AH,1
INT 21H
MOV [BX],AL
DEC BX
MOV AH,1
INT 21H
MOV [BX],AL
LEA DX,CRLF
CALL OUTSTR
POP DX
POP AX
RET
READNUM ENDP
;子程序名:BCDTOB
;功能:把三位的BCD码转换为二进制数
;入口参数:BX=BCD码的起始地址
;使用的寄存器:AX,CX,DX
BCDTOB PROC
PUSH CX
PUSH AX
PUSH DX
MOV CL,100
MOV AL,[BX+2]
AND AL,0FH
MUL CL
MOV DX,AX
MOV CL,10
MOV AL,[BX+1]
AND AL,0FH
MUL CL
ADD DX,AX
MOV AH,0
MOV AL,[BX]
AND AL,0FH
ADD AX,DX
MOV [BX],AX
POP DX
POP AX
POP CX
RET
BCDTOB ENDP
;子程序名:BTOSTR2
;功能:把二进制数转换成二进制BCD码串
;入口参数:AX=二进制数
;出口参数:BX=二进制BCD码串的起始地址
;使用的寄存器:CX
BTOSTR2 PROC
PUSH CX
MOV CX,16
AGAIN: ROL AX,1
JC BOT
MOV [BX],BYTE PTR 30H
JMP LOP
BOT: MOV [BX],BYTE PTR 31H
LOP: INC BX
LOOP AGAIN
POP CX
RET
BTOSTR2 ENDP
;子程序名:BTOSTR8
;功能:把二进制数转换成八进制BCD码串
;入口参数:AX=二进制数
;出口参数:BX=八进制BCD码串的起始地址
;使用的寄存器:CX,DX
BTOSTR8 PROC
PUSH CX
PUSH DX
MOV CL,3
MOV DX,AX ;预先保存AX的值,方便后用
AND AX,0007H
ADD AL,30H
MOV [BX+5],AL
MOV AX,DX
SHR AX,CL
MOV DX,AX
AND AX,0007H
ADD AL,30H
MOV [BX+4],AL
MOV AX,DX
SHR AX,CL
MOV DX,AX
AND AX,0007H
ADD AL,30H
MOV [BX+3],AL
MOV AX,DX
SHR AX,CL
MOV DX,AX
AND AX,0007H
ADD AL,30H
MOV [BX+2],AL
MOV AX,DX
SHR AX,CL
MOV DX,AX
AND AX,0007H
ADD AL,30H
MOV [BX+1],AL
MOV AX,DX
SHR AX,CL
MOV DX,AX
AND AX,0007H
ADD AL,30H
MOV [BX],AL
POP DX
POP CX
RET
BTOSTR8 ENDP
;子程序名:BTOSTR16
;功能:把二进制数转换成十六进制BCD码串
;入口参数:AX=二进制数
;出口参数:BX=十六进制BCD码串的起始地址
;使用的寄存器:CX,DX
BTOSTR16 PROC
PUSH CX
PUSH DX
MOV CL,4
MOV DX,AX
AND AX,000FH
CALL CHANGE
MOV [BX+3],AL
MOV AX,DX
SHR AX,CL
AND AX,000FH
CALL CHANGE
MOV [BX+2],AL
MOV AX,DX
SHR AX,CL
AND AX,000FH
CALL CHANGE
MOV [BX+1],AL
MOV AX,DX
SHR AX,CL
AND AX,000FH
CALL CHANGE
MOV [BX],AL
RET
BTOSTR16 ENDP
CHANGE PROC
CMP AL,10
JL ADD_0
ADD AL,'A'-'0'-10
ADD_0: ADD AL,'0'
RET
CHANGE ENDP
;子程序名:OUTSTR
;功能:输出缓冲区中的字符串
;入口参数:DS:DX=字符串的起始地址
;使用的寄存器:AX
OUTSTR PROC
MOV AH,9
INT 21H
RET
OUTSTR ENDP
CODE ENDS
END begin