Assembly 将两个两位数与作为输入和结果的数字相乘也将在Tasm中打印

Assembly 将两个两位数与作为输入和结果的数字相乘也将在Tasm中打印,assembly,x86,dos,bcd,Assembly,X86,Dos,Bcd,我不明白在这种情况下能做些什么 使用AAM指令可以实现单位数乘法 但是,对于AAM,您需要解包BCD,因此两位数乘法后的结果不会在AX寄存器中累积 所以我需要一个关于如何处理这个问题的想法。谢谢 以下是输入的样子(取一个两位数),需要BCD mov dx,offset msg mov ah,09h int 21h mov ah,01h int 21h mov ch,al sub ch,30h ror ch,04h mov ah,01h int 21h mov cl,al sub cl,3

我不明白在这种情况下能做些什么 使用AAM指令可以实现单位数乘法 但是,对于AAM,您需要解包BCD,因此两位数乘法后的结果不会在AX寄存器中累积

所以我需要一个关于如何处理这个问题的想法。谢谢

以下是输入的样子(取一个两位数),需要BCD

mov dx,offset msg
mov ah,09h
int 21h

mov ah,01h
int 21h

mov ch,al
sub ch,30h
ror ch,04h

mov ah,01h
int 21h

mov cl,al
sub cl,30h
add cl,ch
现在该产品位于
AX
中。如果确实需要,请继续将
AX
的内容转换回BCD


以下代码将打印存储在AX中最多4位的数字:

xor dx,dx
mov bx,03E8h
div bx
call printdig

mov ax,dx
xor dx,dx
mov bx,0064h
div bx
call printdig

mov ax,dx
xor dx,dx
mov bx,000Ah
div bx
call printdig

;remainder from last div still in dx
mov al,dl
call printdig
请注意,您需要以下helper函数,它从
al
打印一个数字:

printdig proc
push dx
mov dl,al
add dl,30h
mov ah,02h
int 21h
pop dx
ret
printdig endp
现在该产品位于
AX
中。如果确实需要,请继续将
AX
的内容转换回BCD


以下代码将打印存储在AX中最多4位的数字:

xor dx,dx
mov bx,03E8h
div bx
call printdig

mov ax,dx
xor dx,dx
mov bx,0064h
div bx
call printdig

mov ax,dx
xor dx,dx
mov bx,000Ah
div bx
call printdig

;remainder from last div still in dx
mov al,dl
call printdig
请注意,您需要以下helper函数,它从
al
打印一个数字:

printdig proc
push dx
mov dl,al
add dl,30h
mov ah,02h
int 21h
pop dx
ret
printdig endp

汇编语言中2位数字的乘法,使用BCD指令处理十进制数字,每个字节一位十进制数字

(另一种方法是将两位输入分别转换为一个一字节的二进制整数,然后执行标准的
mul
,然后将AX中的结果转换回类似于中的字符串)


汇编语言中2位数字的乘法,使用BCD指令处理十进制数字,每个字节一位十进制数字

(另一种方法是将两位输入分别转换为一个一字节的二进制整数,然后执行标准的
mul
,然后将AX中的结果转换回类似于中的字符串)



这个问题目前还很不清楚。你的输入看起来像什么?输出应该是什么样子的?是否要求使用BCD?张贴代码的相关部分。@Denson因为您是从键盘读取输入,所以您没有绑定到输入格式,因为您需要从ASCII转换。在我看来,用BCD进行计算没有任何好处。如果你真的需要,用标准二进制进行计算,然后将结果转换成BCD。如果可能的话,你能详细说明你的解决方案吗?这个解决方案非常简单。使用
int 21h
从控制台读取,将ASCII转换为实际数字(决定需要多少错误处理以及是否包含负数),乘以
MUL
IMUL
,转换回ASCII,使用
int 21h
写入控制台。这就是问题的全部。我不认为这适用于两位数@DanielKamilKozar,但如果可能的话,让你自己更清楚这个问题目前还不清楚。你的输入看起来像什么?输出应该是什么样子的?是否要求使用BCD?张贴代码的相关部分。@Denson因为您是从键盘读取输入,所以您没有绑定到输入格式,因为您需要从ASCII转换。在我看来,用BCD进行计算没有任何好处。如果你真的需要,用标准二进制进行计算,然后将结果转换成BCD。如果可能的话,你能详细说明你的解决方案吗?这个解决方案非常简单。使用
int 21h
从控制台读取,将ASCII转换为实际数字(决定需要多少错误处理以及是否包含负数),乘以
MUL
IMUL
,转换回ASCII,使用
int 21h
写入控制台。这就是问题的全部。我不认为这适用于两位数@DanielKamilKozar,但如果可能的话,请您更清楚地告诉我,在不转换为BCD的情况下,我应该如何从ax输出数字?在这种情况下,我输出数字的方式不起作用@us2012@Denson请参阅我对以下问题的回答:。它解释了一个简单的数字打印算法。我看过你的算法,假设我在ax中有一个四位数的数字,我该怎么做?该算法也适用于此吗?mov prod,ax mov bx,ax mov cx,ax mov dx,ax mov bl,0ah mov ch,00h mov dl,00h ror dx,08h mov ax,cx div bl mov temp1,al mov temp2,ah add temp1,30h add temp2,30h mov ax,dx div bl mov temp3,al mov temp4,ah add temp3,30h这是我为输出数字而编写的代码(假设我正确使用了ur algo算法)它给出了不正确的输出,这确实很难读取,但仅从查看
ror dx,08h
以及代码中没有一个常数
0Ah
这一事实来看,我可以告诉您,您根本没有正确使用它。请记住,您不是在与BCD打交道。我可能会有一些时间来扩展我的答案…你能告诉我,我应该如何从ax输出数字,而不转换为BCD,我输出数字的方式在这种情况下不起作用吗@us2012@Denson请参阅我对以下问题的回答:。它解释了一个简单的数字打印算法。我看过你的算法,假设我在ax中有一个四位数的数字,我该怎么做?该算法也适用于此吗?mov prod,ax mov bx,ax mov cx,ax mov dx,ax mov bl,0ah mov ch,00h mov dl,00h ror dx,08h mov ax,cx div bl mov temp1,al mov temp2,ah add temp1,30h add temp2,30h mov ax,dx div bl mov temp3,al mov temp4,ah add temp3,30h这是我为输出数字而编写的代码(假设我正确使用了ur algo算法)它给出了不正确的输出,这确实很难读取,但仅从查看
ror dx,08h
以及代码中没有一个常数
0Ah
这一事实来看,我可以告诉您,您根本没有正确使用它。请记住,您不是在与BCD打交道。我可能有一段时间来扩展我的答案。。。
org 100h

.data      
num1_O db ?
num2_O db ?
num1_T db ?
num2_T db ? 
temp db ? 
carry db ? 
1st db ?
2nd db ?
3rd db ?
4th db ?
ent_num db " ENTER NUMBER $"
ans db "mul of both number is = $"

.code
start:                          
     mov ax, @data
     mov ds, ax
     mov dx, offset ent_num
     mov ah, 09h
     int 21h
     
     mov ah, 01h               ;1
     int 21h   
     sub al, 30h
     mov num1_T, al
     
     mov ah, 01h               ;2
     int 21h   
     sub al, 30h
     mov num1_O, al  
     
     
     mov dx, offset ent_num
     mov ah, 09h
     int 21h  
     
     mov ah, 01h                 ;1
     int 21h
     sub al, 30h
     mov num2_T, al
     
     mov ah, 01h                  ;2       al
     int 21h
     sub al, 30h 
     mov num2_O, al 
     
     mov 1st, 0
     mov 2nd, 0
     mov 3rd, 0
     mov 4th, 0
     
     
     
     mov al, num2_O
     mul num1_O
     mov ah, 00h
     aam
     
     add 3rd, ah         ;1st carry            4th solved
     add 4th, al 
     
     
     mov al, num2_O
     mul num1_T
     mov ah, 00h
     aam
     
     add 2nd, ah            ;carry
     add 3rd, al  
                    
     
     mov al, num2_T
     mul num1_O
     mov ah, 00h
     aam
     
     add 2nd, ah            ;carry
     add 3rd, al   
     
     
     mov al, num2_T
     mul num1_T
     mov ah, 00h
     aam
     
     add 1st, ah            ;carry
     add 2nd, al   
     
     mov dl, 010
     mov ah, 02h
     int 21h
     mov dx, offset ans
     mov ah, 09h
     int 21h
     
     
     mov al, 3rd
     mov ah, 00h
     aam
     
     add 2nd, ah
     mov 3rd, al 
     
     
     mov al, 2nd
     mov ah, 00h
     aam
     
     mov 2nd, al
     add 1st, ah
     
     mov dl, 1st
     add dl, 30h
     mov ah, 02h
     int 21h 
     
     mov dl, 2nd
     add dl, 30h
     mov ah, 02h
     int 21h
     
     mov dl, 3rd
     add dl, 30h
     mov ah, 02h
     int 21h
     
     mov dl, 4th
     add dl, 30h
     mov ah, 02h
     int 21h
     end start
   

ret