CODE SEGMENT
ASSUME CS:CODE
X DB 12H,34H,56H
Y DB 65H,98H,98H
N EQU $-Y
Z DB N+1 DUP(0)
START: PUSH CS
POP DS
PUSH CS
POP ES ; 使数据段、附加段与代码在同一段中
MOV CX,N ; 字节数置入cx
MOV BX,0 ; 基址寄存器置0
CLC ; 清进位借位标志
@0:
MOV AL,X[BX] ; 将被加数的低字节移入al
ADC AL,Y[BX] ; 带进未的加,加加数的低字节
DAA
MOV Z[BX],AL ; 将结果移入和的低字节
INC BX ; 基址寄存器加1
LOOP @0 ; 循环
MOV BYTE PTR Z[BX],0 ; 处理最高位
JNC @01
MOV BYTE PTR Z[BX], 1
@01:
LEA SI,Z ; 将和的首地址置入 si
MOV CX,N+1 ; 字节数置入 cx
CLD
@1:
LODSB ; 装入和的低字节到 al
CALL DSPAL ; 调用子程序以16进制形式显示(其实是显示bcd数)
LOOP @1 ; 循环
MOV AH,4CH
INT 21H
;=============================
DSPAL PROC NEAR
PUSH AX
PUSH BX
PUSH CX
PUSH DX
PUSHF
MOV CX,2 ; 一个字节只有2位的16进制数
MOV BX,AX ; 将al 保存到 bl 中
@DSPAL1:
ROR BL,1 ; 循环将bl 右移4次 ,即将高位移到右侧
ROR BL,1
ROR BL,1
ROR BL,1
MOV DL,BL ; 放到 dl 中
AND DL,0FH ; 清掉 高位
CMP DL,9 ; 和9比较
JA @DSPAL2 ; 大于 即在 A~F 之间
ADD DL,30H ; 否则就是 0~9,加30H变为 ASCii码
JMP @DSPAL3
@DSPAL2:
ADD DL,37H ; 加 37H 变为 A~F 的ASCii码
@DSPAL3:
MOV AH,2
INT 21H
LOOP @DSPAL1 ; 循环输出 低位
MOV AH,2
MOV DL,'H' ; 显示 H
INT 21H
MOV DL,32 ; 显示空格
INT 21H
POPF
POP DX
POP CX
POP BX
POP AX
RET
DSPAL ENDP
CODE ENDS
END START
BCD文件是Windows Vista系统文件,类似Windows XP系统的BOOTini,是windows启动引导文件,支持多个系统提取镜像,所以很多系统都支持BCD格式文件。BCD文件支持最初支持PC/AT 在BIOS设置,以后得到扩展到对 firmwares 硬件支持。
BCD
(Binary
Coded
Decimal)
就是二--十进制数。
双字节二进制数就是无符号16位二进制数,数值0到0xffff
二--十进制数:
0
--
0000,
1
--
0001,
2
--
0010,
3
--
0011,
4
--
0100
5
--
0101,
6
--
0110,
7
--
0111,
8
--
1000,
9
--
1001
把
原数除十取余,就得个位数,个位数等于几,对照上面的0-9,你就有了最低的4位。
原数减掉刚得的余数,再除10,把商除十取余,就得十位数,十位数等于几,对照上面的0-9,你就有了第二个4位了。
按此法,可以得另几个4位。
然后对这些数用“左移”运算和加法,就得到非压缩BCD码。
如用C语言很好解决,不过用C语言不用定义R6R7了, 只要定义一个变量如:unsigned int i;
百位:i/100;
十位:i/10%10;
个位:i%10;
看样子楼主应该是用汇编,如是等到R6达到溢出时才进位的话,比较难做到,实际上你只是要个十百位,也就是说如你R7始终远远没有计满。试一下在R6满100就进位,也就是说R7上存放的数是100的倍数,问题就好解决了:
假如你要把个十百位分别放在R2R3R4中:
MOV A, R6
MOV B, #10
DIV AB
MOV R2, B
MOV R3, A
MOV R4, R7
这样就可以了
以上就是关于用汇编语言编写一个多字节压缩BCD加法程序。要求显示被加数、加数及结果。全部的内容,包括:用汇编语言编写一个多字节压缩BCD加法程序。要求显示被加数、加数及结果。、BCD格式文件用什么程序编辑打开、双字节二进制数转成三字节的非压缩BCD码的程序该怎么弄呢等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)