用8086/8088汇编语言编程,实现十进制或十六进制向二进制的转换。
要求通过键盘输入数字,有H为16进制、无H为10进制,然后按照二进制输出。
例如:输入1、2、回车,那么第二行应该显示1100;
如果输入1、2、H、回车,那么第二行应该显示00010010。
不用考虑输入有错的情况
;================================================
满意回答:
可以用10号功能调用,输入字符串,判断最后一个字符是不是H,来确认是10进制,还是16进制。
不用考虑输入有错的情况,重点是区分10进制和16进制,这样,处理起来就很简单了。
程序如下:
;============================================
data segment
T1 DB 'Input a num : $'
K_IN DB 4 ;允许输入四个字符(含回车)
NNN DB ? ;实际输入的个数(不含回车)
IN_B DB 4 DUP(?);实际输入的字符(含回车)
N2 DW ? ;存放待处理的字符个数
N3 DB 10 ;先假定是10进制
BIN DB 0 ;二进制形式的数字
data ends
code segment
assume cs:code, DS: DATA
start:
mov ax, data
mov ds, ax
;--------------------------------------------
MOV AH, 9 ;显示:Input...
LEA DX, T1
INT 21H
;--------------------------------------------
MOV AH, 10 ;等待键入字符串
LEA DX, K_IN
INT 21H
MOV CL, NNN
AND CL, CL
JZ EXIT ;如果输入零个字符,就退出
;--------------------------------------------
MOV DL, 10 ;回车换行
MOV AH, 2
INT 21H
MOV DL, 13
MOV AH, 2
INT 21H
;--------------------------------------------
MOV CH, 0
MOV N2, CX ;这是输入字符的个数
DEC CX
LEA BX, IN_B ;这是输入字符的起始位置
ADD BX, CX ;这是输入字符的末尾位置
MOV DL, [BX] ;取出最后一个字符
AND DL, 11011111B ;变成大写
CMP DL, 'H' ; = H ?
JNZ DDDD ;否,转到10进制
MOV N3, 16 ;是则按照16进制
DEC N2 ;有效字符个数减一
;--------------------------------------------
DDDD:
LEA BX, IN_B ;从头开始取出
MOV CX, N2 ;待处理的字符个数
LOP:
MOV AL, BIN ;老数据乘以进制
MUL N3 ;乘以进制
MOV BIN, AL
MOV AL, [BX] ;取新数据的ASCII码
SUB AL, 30H ;变成二进制数
CMP AL, 10
JB N_7
SUB AL, 7
N_7:
ADD BIN, AL ;加入到老数据中
INC BX
LOOP LOP ;循环处理下一个
;--------------------------------------------
CALL OUT_BIN ;显示
EXIT:
mov ah, 4ch ;程序结束
int 21h
;--------------------------------------------
OUT_BIN: ;显示子程序
MOV AL, BIN
MOV BL, 2
MOV CX, 0
L1:
MOV AH, 0
DIV BL
PUSH AX
INC CX
AND AL, AL
JNZ L1
L2:
POP DX
MOV DL, DH
ADD DL, 48
MOV AH, 2
INT 21H
LOOP L2
RET
;--------------------------------------------
code ends
end start
;============================================
执行效果如下:
C:\MASM>H_B
Input a num : 12
1100
C:\MASM>H_B
Input a num : 12H
10010
C:\MASM>
;================================================
回答者: 做而论道 | 十六级 2012-4-10 21:24
提问者对回答的评价:非常感谢!!
原题网址:http://zhidao.baidu.com/question/407503928.html
;================================================