Assembly 16位(4位)BCD加法(TASM 8086)

Assembly 16位(4位)BCD加法(TASM 8086),assembly,x86-16,addition,tasm,bcd,Assembly,X86 16,Addition,Tasm,Bcd,我正在尝试添加两个4位(16位)BCD数字并显示结果 我已经写了下面的代码,但我想知道如何处理进位,因为这个程序正在挂断DosBox(TASM模拟器) 出于某种原因,我的教授希望我们显示输入输出,请耐心听我说:/ model small .data res dw ? .code .startup ; 1st number mov cx,4 mov bx,0 l1: shl bx,4 mov ah,01 int 21h and al,0FH a

我正在尝试添加两个4位(16位)BCD数字并显示结果

我已经写了下面的代码,但我想知道如何处理进位,因为这个程序正在挂断DosBox(TASM模拟器)

出于某种原因,我的教授希望我们显示输入输出,请耐心听我说:/

model small
.data 

 res dw ?
.code
.startup


; 1st number 
mov cx,4
mov bx,0
l1:
    shl bx,4
    mov ah,01
    int 21h

    and al,0FH
    add bl,al
    
loop l1

mov ah,02h   ; display + sign
mov dx,"+"
int 21h


; 2nd number
mov cx,4
mov bx,0
l3:
    shl dx,4
    mov ah,01
    int 21h

    and al,0FH
    add dl,al
loop l3

 mov al,bl
 add al,dl 
 daa
 mov cl,al  # storing lower byte in clower
 mov al,ah
 adc al,bh
 daa 
 mov ch,al  # storing higher byte in c higher
 
 mov [res],cx
 
 mov ax,02h
 mov dx,res  # To display the result
 int 21h




.EXIT
END

另外,我是否在代码中出错?

对于第二个数字的输入,您正在重置
BX
寄存器,从而销毁第一个输入的数字!现在的美妙之处在于,您根本不需要将目标寄存器归零,因为将字寄存器移位4位并执行4次将不会留下任何事先写入的内容。所以,放下那些初始值设定项

级联BCD加法使用
AH
寄存器,但该寄存器在程序中的该点没有任何有用的内容。您应该使用
DH
寄存器

在加法结束时,
CX
寄存器保存一个4位压缩BCD。不能使用DOS.PrintCharacter函数02h一次性打印,该函数的函数号为
AH
(而不是
AX
)。您需要一个循环,从存储在
CH
寄存器的高位半字节中的最高有效位开始,循环4个BCD数字

  mov bx, 4
More:
  rol cx, 4        ; Brings highest nibble round to lowest nibble
  mov dl, cl       ; Move to register that DOS expects
  and dl, 15       ; Isolate it
  or  dl, '0'      ; Convert from value [0,9] to character ['0','9']
  mov ah, 02h      ; DOS.PrintCharacter
  int 21h
  dec bx
  jnz More
把它们放在一起,写一些更好的评论
对于第二个数字的输入,您正在重置
BX
寄存器,从而销毁第一个输入的数字!现在的美妙之处在于,您根本不需要将目标寄存器归零,因为将字寄存器移位4位并执行4次将不会留下任何事先写入的内容。所以,放下那些初始值设定项

级联BCD加法使用
AH
寄存器,但该寄存器在程序中的该点没有任何有用的内容。您应该使用
DH
寄存器

在加法结束时,
CX
寄存器保存一个4位压缩BCD。不能使用DOS.PrintCharacter函数02h一次性打印,该函数的函数号为
AH
(而不是
AX
)。您需要一个循环,从存储在
CH
寄存器的高位半字节中的最高有效位开始,循环4个BCD数字

  mov bx, 4
More:
  rol cx, 4        ; Brings highest nibble round to lowest nibble
  mov dl, cl       ; Move to register that DOS expects
  and dl, 15       ; Isolate it
  or  dl, '0'      ; Convert from value [0,9] to character ['0','9']
  mov ah, 02h      ; DOS.PrintCharacter
  int 21h
  dec bx
  jnz More
把它们放在一起,写一些更好的评论
如果您在“显示结果”之前说
mov ax,02h
,则应为
mov ah,02h
,与前面的用法相同。不过祝你好运,因为你展示了一个数字。MS-DOS没有任何数字输出功能。如果您在“显示结果”之前说
mov-ax,02h
,这应该是
mov-ah,02h
,与以前的用法相同。不过祝你好运,因为你展示了一个数字。MS-DOS没有任何数字输出功能。