楼上写错了,产生进位应该还加上0110(即十进制的6)进行修正,因为BCD码每四位数字表示一个一位十进制数,但是四位二进制数能表示16个数,当产生进位时,有6个数没有加上,故产生进位时,要加上6
(1)
0111 0100 1000
+ 0001 0110 1001
-------------------
1000 1011 0001
+ 0110 0110
-------------------
1001 0001 0111
748+169 = 917
(2)
0011 1001 1001
+ 0100 1000 1001
-------------------
1000 0010 0010
+ 0110 0110
-------------------
1000 1000 1000
399+489 =888
CODE SEGMENT
ASSUME CS:CODE
; 521
UNPKBCD DB 09,08,04,03,4,6,8,6,4,5,3,2,9,6,5,7,5,4
N EQU ($-UNPKBCD)/2
SUM DB 0,0,0
START: PUSH CS
POP DS
PUSH CS
POP ES
;====================
LEA SI,UNPKBCD
MOV CX,N
@1:
MOV AL,[SI]
MOV AH,[SI+1]
ADD SUM,AL
CMP SUM,9
CLC
JLE @2
SUB SUM,10
STC
@2:
ADC SUM+1,AH
CMP SUM+1,9
CLC
JLE @3
SUB SUM+1,10
STC
@3:
ADC SUM+2,0
ADD SI,2
LOOP @1
;=================
MOV AH,2
MOV DL,SUM+2
OR DL,30H
INT 21H
MOV DL,SUM+1
OR DL,30H
INT 21H
MOV DL,SUM
OR DL,30H
INT 21H
;==================
MOV AH,4CH
INT 21H
CODE ENDS
END START
module count60(qout,cout,data,load,cin,reset,clk); output[7:0] qout; output cout; input[7:0] data; input load,cin,clk,r
module count60(qout,cout,data,load,cin,reset,clk);
output[7:0] qout;
output cout;
input[7:0] data;
input load,cin,clk,reset;
reg[7:0] qout;
always @(posedge clk) //clk上升沿时刻计数
begin
if (reset) qout<=0; //同步复位
else if(load) qout<=data; //同步置数
else if(cin)
begin
if(qout[3:0]==9) //低位是否为9,是则
begin
qout[3:0]<=0; //回0,并判断高位是否为5
if (qout[7:4]==5) qout[7:4]<=0;
else
qout[7:4]<=qout[7:4]+1; //高位不为5,则加1
end
else //低位不为9,则加1
qout[3:0]<=qout[3:0]+1;
end
end
assign cout=((qout==8'h59)&cin)1:0; //产生进位输出信号
endmodule
以上就是关于用BCD码进行十进制数加法全部的内容,包括:用BCD码进行十进制数加法、求汇编语言大神:两位非组合型BCD码整数加法、求模为60的BCD码加法计数器仿真程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)