BCD码就是用16进制来表示10进制的数,如压缩BCD码98H,我们认为他代表的是十进制中的98。
非压缩BCD码即1个字节存一个位数据,十进制98的非压缩BCD码为0908H。
例1:编写完整程序,从键盘上接受4位压缩BCD码,并将其放在BX中。
CODE SEGMENT
ASSUME CS:CODE
START:
MOV CX,4
INPUT:
MOV AH,01H ;按键输入,实际输入的是ASCII码
INT 21H
CMP AL,'0'
JAE NEXT ;判断是否≥0
JMP INPUT
NEXT:
CMP AL,'9'
JBE SAVEAS ;判断是否≤9
JMP INPUT
SAVEAS:
AND AL,0FH ;屏蔽十位的3
ROL BX,1 ;左移四次
ROL BX,1 ;这里用左移指令SHL或循环左移指令ROL都可以,不影响结果
ROL BX,1
ROL BX,1 ;每移动将输入的值存入对应的位
OR BL,AL ;不可用MOV,防止覆盖
LOOP INPUT
TOEND:
MOV AH,4CH
INT 21H
CODE ENDS
END START
例2:编写完整程序,将压缩BCD码VARBCD :98H变成对应的16进制值放在AL中。
十进制转十六进制:
DATA SEGMENT
VARBCD DB 98H
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:
MOV AX,DATA
MOV DS,AX
LEA SI,VARBCD
MOV BL,[SI]
MOV DL,BL
AND DL,0FH ;屏蔽高字节
MOV CL,4 ;循环四次
SHR BL,CL ;左移4次读取十位的9
MOV AL,10 ;这里的10实际代表16
MUL BL ;9*16
ADD AL,DL ;加上个位的8
MOV AH,4CH
INT 21H
CODE ENDS
END START
例3:编写完整程序,将数字变量VARD :98H变成非压缩BCD码放在VARBCD变量位置处。
DATA SEGMENT
VARD DB 98H
SPACE DB 2 DUP(?)
VARBCD DB 8 DUP(?)
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:
MOV AX,DATA
MOV DS,AX
LEA SI,VARD
LEA DI,VARBCD
XOR AX,AX ;AX先清0
MOV AL,[SI] ;AL存入98H
MOV BL,10 ;会自动转化为16进制计算
DIV BL ;152/10
MOV [DI+2],AH ;存入余数02D(02H)充当个位
XOR AH,AH ;余数清0
DIV BL ;15/2
MOV [DI+1],AH ;存入余数05D(05H)充当十位
MOV [DI],AL ;存入商01D(01H)充当百位
MOV AH,4CH
INT 21H
CODE ENDS
END START
结果为98H=152D——>非压缩BCD码 01 05 02