[英]multiplying two two digit numbers with both the numbers taken as input and result is also to be printed in Tasm
我不明白在这种情况下可以做什么,使用 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
mynumber1 db ?
mynumber2 db ?
mov ah,01h
int 21h
sub al, 30h <- ASCII to value
mov bl, 0Ah
mul bl <- multiply al with 10
mov mynumber1, al <- mynumber1 now stores the tens (i.e. if you entered 8 it's now 80)
mov ah,01h
int 21h
sub al, 30h <- ASCII to value, al now stores the ones
add mynumber1, al <- now your two-digit number is completely in mynumber1
现在对mynumber2
重复相同的操作。 然后:
mov al, mynumber1
mov bl, mynumber2
mul bl
现在产品在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
请注意,您需要以下辅助函数,它会从al
打印一个数字:
printdig proc
push dx
mov dl,al
add dl,30h
mov ah,02h
int 21h
pop dx
ret
printdig endp
汇编语言中两位数的乘法,使用 BCD 指令如aam
(ASCII 调整 AX 乘法后)来处理十进制数,每字节一位十进制数。
(另一种方法是将 2 位输入分别转换为一个字节的二进制整数,并执行标准mul
,然后将 AX 中的结果转换回字符串,如使用 DOS 显示数字)
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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.