3-1
1. AX=0048H,AX=0702H
2. AX=0059H, AX=0411H, AX=0107H,DL=04H
3. AX=0011H, AX=0107H
4.AX=005AH, AX=0900H, AX=0908H
5. AL=62H
6. AX=0248H
3-2
stack segment stack 'stack'
dw 32 dup(0)
stack ends
data segment
BVAR DB 99H
data ends
code segment
begin proc far
assume ss: stack , cs: code, ds: data
push ds
sub ax, ax
push ax
mov ax, data
mov ds, ax
MOV AL, BVAR
MOV CL, 4
SHR AL, CL
MOV AH, 10
MUL AH
AND BVAR, 0FH
ADD BVAR, AL
ret
begin endp
code ends
end begin
先将2位压缩BCD数转换为非压缩BCD数,再用AAD指令将非压缩BCD数转换为二进制数:MOV AL, BVAR
MOV AH, AL
MOV CL, 4
SHR AH, CL
AND AL, 0FH
AAD
MOV BVAR, AL
3-3
stack segment stack 'stack'
dw 32 dup(0)
stack ends
data segment
W1 DW 0807H
W2 DW 0609H
B3 DB 2 DUP(0)
data ends
code segment
begin proc far
assume ss:stack,cs:code,ds:data
push ds
sub ax,ax
push ax
mov ax,data
mov ds,ax
MOV AX, W1 ;AX=0807H
SUB AL,BYTE PTR W2 ;AL=FEH, CF=1
AAS ;AL=08H, AH=07H
MOV B3, AL
MOV AL,AH
SUB AL,W2+1
MOV B3+1,AL
ret
begin endp
code ends
end begin
还可以用AAD指令将两个非压缩BCD数转换为二进制数,相减后再用AAM将差转换为非压缩BCD数:MOV AX, W2
AAD
MOV DX,AX
MOV AX,W1
AAD
SUB AX,DX
AAM
MOV BYTE PTR B3,AX
3-4
stack segment stack 'stack'
dw 32 dup(0)
stack ends
data segment
D1 DD 06070809H
D2 DD 04050607H
OBF DB 6 DUP(0)
data ends
code segment
begin proc far
assume ss:stack,cs:code,ds:data
push ds
sub ax,ax
push ax
mov ax,data
mov ds,ax
MOV SI,0
MOV DI,OFFSET OBF+5
MOV BYTE PTR[DI],'$'
MOV CX,4
XOR AH,AH
AGAIN: MOV AL, BYTE PTR D1[SI]
ADD AL, BYTE PTR D2[SI]
ADD AL,AH
MOV AH,0
AAA
ADD AL,30H
DEC DI
MOV [DI],AL
INC SI
LOOP AGAIN
AND AH,AH
JZ N5
DEC DI
MOV BYTE PTR[DI],'1'
N5: MOV DX,DI
MOV AH,9
INT 21H
ret
begin endp
code ends
end begin
3-5
stack segment stack 'stack'
dw 32 dup(0)
stack ends
data segment
W1 DW 8931H
W2 DW 5678H
OBF DB 6 DUP(0)
data ends
code segment
begin proc far
assume ss:stack,cs:code,ds:data
push ds
sub ax,ax
push ax
mov ax,data
mov ds,ax
MOV DI,0
MOV AL, BYTE PTR W1 ;AL=31H
ADD AL, BYTE PTR W2 ;AL=A9H, CF=0, AF=0
DAA ;AL=09H, CF=1
MOV AH, AL
MOV AL, BYTE PTR W1+1 ;AL=89H
ADC AL, BYTE PTR W2+1 ;AL=E0H, CF=0, AF=1
DAA ;AL=46H, CF=1
PUSHF
MOV DI OFFSET OBF+5
MOV BYTE PTR[DI], '$'
MOV CL,4
XCHG AH,AL
AGAIN: MOV DL,0FH
AND DL,AL
ADD DL,30H
DEC DI
MOV [DI],DL
SHR AX,CL
AND AX,AX
JNZ AGAIN
POPF
JNC OUTPUT
DEC DI
MOV BYTE PTR[DI], '1'
OUTPUT: MOV DX,DI
MOV AH,9
INT 21H
begin endp
code ends
end begin
3-6
stack segment stack 'stack'
dw 32 dup(0)
stack ends
data segment
BVAR DB 99H
OBUF DB 4 DUP(0)
data ends
code segment
begin proc far
assume ss: stack, cs: code, ds: data
push ds
sub ax, ax
push ax
mov ax, data
mov ds, ax
MOV AL ,BVAR ;二进制数送AL
MOV AH, 0 ;二进制数扩展为16位(无符号数扩展)
MOV DL, 100
DIV DL
ADD AL, 30H ;将百位变为ASCII码
MOV OBUF, AL ;存百位
MOV AL,AH ;将十位和个位的二进制数即余数送AL
AAM ;将AL中的二进制数转换为ASCII BCD数
ADD AX,3030H ;将AX中的ASCII BCD数变为ASCII码
MOV OBUF+1,AH
MOV OBUF+2,AL
MOV OBUF+3,'$'
MOV DX,OFFSET OBUF
MOV AH,9
INT 21H
ret
begin endp
code ends
end begin
将8位二进制数转换为十进制数也可以用除10取余法实现。转换程序段如下:MOV AL,BVAR
XOR AH,AH ;将8位二进制数扩展为16位(无符号数扩展)
MOV DL,10
DIV DL
ADD AH,30H ;将第一个余数即个位变为ASCII码
MOV OBUF+2,AH
XOR AH,AH ;将AL中的二进制数扩展为16位
DIV DL
ADD AX,3030H ;AH为十位,AL为百位
MOV WORD PTR OBUF,AX
MOV OBUF+3,'$'
还可以用左移二进制数的方法将二进制数转换为十进制数:
XOR AX,AX ;清0AX
MOV CX,8 ;左移二进制数8次
AGAIN: SHL BVAR, 1
ADC AL, AL
DAA
ADC AH, 0 ; AH的值小于等于2不需校正
LOOP AGAIN
ADD AH, 30H ;百位转换为ASCII码
MOV OBUF, AH
MOV AH, AL ;保存十位和个位
MOV CL, 4
SHR AL, CL ;BCD数十位移至AL低4位
AND AH, OFH ;BCD数个位在AH低4位
ADD AX, 3030H ;个位和十位转换为ASCII码
MOV WORD PTR OBUF+1, AX
MOV OBUF+3, '$'
以二进制数11111101B转换为BCD数0253H为例,说明转换的过程,全过程如下图所示。
3-7
stack segment stack 'stack'
dw 32 dup(0)
stack ends
data segment
TAB DW 0
DB '0 $'
DW 1
DB '1 $'
DW 8
DB '8 $'
┇
DW 64000
DB '64000$'
LFZ DW 0
IBUF DB 3,0,3 DUBP(0)
data ends
code segment
begin proc far
assume ss: stack, cs: code, ds: data
push ds
sub ax, ax
push ax
mov ax, data
mov ds, ax
MOV DX, OFFSET IBUF
MOV AH, 10
INT 21H
MOV AH, 2
MOV DL, 0AH
INT 21H
MOV AX, WORD PTR IBUF+2 ;个位送AH,十位送AL
XCHG AH,AL ;个位与十位交换
CMP IBUF+1,2 ;判别N是一位数还是二位数
JE COM
MOV AL,AH
XOR AH,AH;;若N为一位数,则要清AH
COM: AND AX, 0F0FH ;将AX中的ASCII码变为ASCII BCD数AAD ;将AX中的ASCII BCD数变为二进制数
MOV CL,3
SHL AX,CL ;将AX中的二进制数乘以8
MOV BX,AX
MOV AX,TAB [BX]
MOV LFZ,AX
MOV DX,OFFSET TAB+2 ;DX指向立方值的ASCII码
ADD DX,BX ;将DX下移8N,指向N的ASCII码
MOV AH,9
INT 21H
ret
begin endp
code ends
end begin
3-8
stack segment stack 'stack'
dw 32 dup(0)
stack ends
data segment
WA DW 0ABCDH
BA DB 0
data ends
code segment
begin proc far
assume ss: stack, cs: code, ds: data
push ds
sub ax, ax
push ax
mov ax, data
mov ds, ax
MOV AH, 1 ;1号功能调用,键入i(i=0~3)
INT 21H
MOV DX,WA
TEST AL,1 ;判别键入数i是奇数还是偶数,D0位为0则为偶数
JZ NRS
MOV CL, 4 ;i为奇数将a3、a1移至各自字节的低4位
SHR DX, CL
NRS: TEST AL,2 ;判别键入数i的D1位是0还是1?
JZ HNSL
MOV DL, DH ;i的D1位为1则是取a3或a2,将其送DL HNSL: AND DL, 0FH ;取低4位
MOV BA, DL