键盘输入任意位十进制数,分别转换成十六进制数、BCD码,并显示对应结果
输出如下
代码如下:
STACK1 SEGMENT STACK
DW 256 DUP(?)
STACK1 ENDS
DDATA SEGMENT
MES1 DB 0ah,0dh,'The BCD code of decimal are:$'
two db 2;定义two=2
ten dw 10;
sixt dw 16;
BUF db 10
DB ?
DB 10 DUP(?)
emt dw ?
emp db 4 dup(?);在这里倒腾那单位的bcd码,
;1在这里面就是1000,也就是31h,30h,30h,30h这四个ascll码,再给它倒着输出来
sixteen db 8 dup(?)
shu db ?
MES2 DB 0ah,0dh,'The 16 code of decimal are:$'
DDATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DDATA,ss:stack1
START: MOV AX,DDATA
MOV DS,AX
MOV AX,stack1
MOV ss,Ax
mov dx,offset buf
mov ah,10
int 21h; 输入任意位的十进制数,保存到buf中,
;可以查一查中断10 的用法,从第三个字节开始记入输入的数
;;;;; ------------------- ; bcd码这一部分
MOV DX,OFFSET MES1
MOV AH,09H
INT 21H
mov si,offset buf
inc si
mov cl,[si]; buf里面第二个数为实际键入的个数,把它给cl控制循环
inc si;指针移动到第三个内存空间,这里面之后是存的数,
;输入12,这个内存里面依次就是31h.32h,cl这时等于2,
a1:
push cx; 保护cx
CALL show1;把之前的31h给到那个子例程中,
;子例程会求出31h的bcd 并显示。第二次循环开始对32h进行操作
pop cx
MOV DL,20H;输出空格
MOV AH,02H
INT 21H
INC SI
LOOP A1
;;;;; -------------------
;;;;;-----------------以下是十六进制的这一部分
mov si,offset buf
inc si
mov ch,0
mov cl,ds:[si]
inc si
mov bx,0
a2: mov ah,0
mov al,ds:[si]
sub al,30h
mov emt,ax
mov ax,bx
mul ten
mov bx,ax
add bx,emt
inc si
loop a2
MOV DX,OFFSET MES2
MOV AH,09H
INT 21H
call show0
;;;;;-----------------
WAIT1: MOV AH,1 ;判断是否有按键按下
INT 16H
JZ WAIT1 ;无按键则跳回继续等待,有则退出
MOV AX,4C00H
INT 21H
show0 proc ; 展示十六进制
mov di,offset sixteen
mov cx,bx
w: mov dx,0
mov ax,cx
div sixt
cmp dl,09h
jna w3
add dl,07h
w3: add dl,30h
mov ds:[di],dl
inc di
mov cx,ax
cmp cx,0
jnz w
dec di
w2 : mov dl,ds:[di]
mov ah,2
int 21h
dec di
cmp di,0036h
jnb w2
ret
show0 endp
show1 proc; 展示二进制的bcd,输入一个数的ascll码,30~39h,输出bcd码
MOV AL,DS:[SI];
mov shu,al; 保护al,
sub al,30h
mov di,offset emp
mov cx,4; 循环四次,除以四次2
d1: mov ah,0
mov al,shu
div two; 余数在ah,商在al
mov shu,al
add ah,30h
mov ds:[di],ah; 余数加30h放到emp里面
inc di
loop d1
mov cx,4; 单个数的bcd码就是四位
d2: dec di ; 倒着把emp里面的数输出
mov dl,ds:[di]
MOV AH,02H
INT 21H
loop d2
ret
show1 endp
CODE ENDS
END START