求汇编语言的BCD码1~100累加程序

求汇编语言的BCD码1~100累加程序,第1张

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 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   ;

    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码转成二进制输出的程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zz/10126026.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-05
下一篇 2023-05-05

发表评论

登录后才能评论

评论列表(0条)

保存