MOV R0,#01H MOV R1,#100 MOV R6,#00H MOV R7,#00HL1: MOV A,R6 ADD A,R0 DA A MOV R6,A MOV A,R7 ADC A,#00H DA A MOV R7,A INC R0 DJNZ R1,L1 ;1~100 BCD 码累加值在R7R6中
1、压缩BCD码(一个字节存两位8421BCD码对应的十进制数)加法程序:
MOV AL,12H
MOV BL,34H
ADD AL,BL
DAA
2、非压缩BCD码(一个字节存一位8421BCD码对应的十进制数)加法程序:
MOV AL,02H
MOV BL,04H
ADD AL,BL
AAA
#include <stdioh>
#include <stdlibh>
#include <stringh>
#define INPUT_BCD_MAX_LENGTH 10
int main(void)
{
//
char bcd[ INPUT_BCD_MAX_LENGTH ];
char bin = NULL;
char t_bin[ 6 ];
int i, j, q, r, t, bcd_len, bin_len;
printf( "Please enter the decimal code: " );
scanf("%s", bcd);
bcd_len = strlen( bcd );
bin_len = bcd_len 6 + 1;
bin = ( char )malloc( bin_len );
memset( bin, 0, bcd_len 6 + 1 );
for( i = 0; i < bcd_len; i++ )
{
/ 把字符转换为数字/
q = bcd[ i ] - '0';
//将每个十进制转换为四位二进制
for( j = 0; j < 4; j++ )
{
t = q / 2;
r = q % 2;
q = t;
if( q == 0 && r != 1 )
{
t_bin[ j ] = '0';
}
else
{
//把数字转换为字符
t_bin[ j ] = r + '0';
}
}
t_bin[ j ] = ' ';
t_bin[ j + 1 ] = '\0';
strrev( t_bin );
strcat( bin, t_bin );
}
printf( "BCD coded decimal:\n%s\n", bin );
free( bin );
bin = NULL;
system("pause");
return 0;
}
参考这个两个6位BCD加法子程序,加数放在33,34,35;被加数放在30,31,32,和放在R2,R3,R4进位在C
QH:
MOV A,30H
ADD A,33H
DA A
MOV R1,A
MOV A,31H
ADDC A,34H
DA A
MOV R2,A
MOV A,32H
ADDC A,35H
DA A
MOV R3,A
RET
;修改'899',和'999'的长度,即可计算任意长度的相加
;如d10 db '18929387499'
; d12 db '18234287439'
; 补充,这是相加,你要求是相减,搞差了,减法的附在后面
dseg segment
d10 db '899'
len1 equ $-d10 ;注意 d10与d12长度相同,可以做不同,但比较麻烦,这里没做
d11 db '+'
d12 db '999' ;长度与d10相同
d13 db '=','$'
d2 db len1+1 dup(0),'$'
dseg ends
assume cs:cseg, ds:dseg
cseg segment
start:
mov ax, dseg
mov ds, ax
mov ah,9
lea dx, d10
int 21h
lea si, d10
lea di, d12
lea bx, d2
add di, len1-1 ;指向个位数位置
add bx, len1 ;指向个位数位置
mov cx, len1 ;计算器
clc ;清除cf
c0:
mov ah,0 ;清除ah
mov al,[si] ;取对应位置上的数字相加
and al,0FH ;
mov dl,[di] ;
and dl,0FH ;
add al,dl ;相加
aaa ;调整
add al,[bx] ;加上可能的进位
aaa ;再调整
mov [bx],al ;保存到对应的位置上
mov [bx-1],ah;可能存在的进位,保存到对应的位置上
dec si ;下一位相加
dec di
dec bx
loop c0
mov cx, len1+1
lea bx, d2
c1:
xor byte ptr [bx], 30H ;将结果转换为ascII值
inc bx
loop c1
mov cx, len1
lea bx, d2
c2:
mov al, [bx] ;查找结果中,第1个结果不是0的数字
cmp al, 30H ;从此开始显示结果,以免出现0123这样的结果
jnz p0
inc bx
loop c2
p0:
mov dx,bx
mov ah,9
int 21h
mov ah,4ch
int 21h
cseg ends
end start
;这是减法的代码
;有个bug,被减数必须大于减数时才正确。
;暂时先这样
dseg segment
d10 db '991'
len1 equ $-d10 ;注意 d10与d12长度相同,可以做不同,但比较麻烦,这里没做
d11 db '-'
d12 db '192' ;长度与d10相同
d13 db '=','$'
d2 db len1+1 dup(0),'$'
dseg ends
assume cs:cseg, ds:dseg
cseg segment
start:
mov ax, dseg
mov ds, ax
mov ah,9
lea dx, d10
int 21h
lea si, d10
lea di, d12
lea bx, d2
add si, len1-1 ;指向个位数位置
add di, len1-1 ;指向个位数位置
add bx, len1 ;指向个位数位置
mov cx, len1 ;计算器
clc ;清除cf
c0:
mov ah,0 ;清除ah
mov al,[si] ;取对应位置上的数字相加
and al,0FH ;
mov dl,[di] ;
and dl,0FH ;
sub al,[bx] ;减去可能的借位
aas ;再调整
sub al,dl ;相减
aas ;调整
neg ah ;如有借位,转换为正数1
mov [bx],al ;保存到对应的位置上
mov [bx-1],ah;可能存在的进位,保存到对应的位置上
dec si ;下一位相加
dec di
dec bx
loop c0
mov cx, len1+1
lea bx, d2
c1:
xor byte ptr [bx], 30H ;将结果转换为ascII值
inc bx
loop c1
mov cx, len1
lea bx, d2
c2:
mov al, [bx] ;查找结果中,第1个结果不是0的数字
cmp al, 30H ;从此开始显示结果,以免出现0123这样的结果
jnz p0
inc bx
loop c2
p0:
mov dx,bx
mov ah,9
int 21h
mov ah,4ch
int 21h
cseg ends
end start
以上就是关于求汇编语言的BCD码1~100累加程序全部的内容,包括:求汇编语言的BCD码1~100累加程序、编写程序:实现两个8421BCD码加法程序、利用C语言 将BCD码转成二进制输出的程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)