Assembly 将两个两位数与作为输入和结果的数字相乘也将在Tasm中打印
我不明白在这种情况下能做些什么 使用AAM指令可以实现单位数乘法 但是,对于AAM,您需要解包BCD,因此两位数乘法后的结果不会在AX寄存器中累积 所以我需要一个关于如何处理这个问题的想法。谢谢 以下是输入的样子(取一个两位数),需要BCDAssembly 将两个两位数与作为输入和结果的数字相乘也将在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
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