Assembly 16位(4位)BCD加法(TASM 8086)
我正在尝试添加两个4位(16位)BCD数字并显示结果 我已经写了下面的代码,但我想知道如何处理进位,因为这个程序正在挂断DosBox(TASM模拟器) 出于某种原因,我的教授希望我们显示输入输出,请耐心听我说:/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
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没有任何数字输出功能。