你好,来自stackoverflow的人。所以我是汇编语言中的'新手',但我喜欢编程而且我雄心勃勃,所以最终我也将掌握汇编,但在那之前我需要你的帮助解决问题。 所以,我必须为8086微处理器编写一个程序,找到给定数字的所有因子(除数),我搜索了互联网,但结果对我来说很复杂,此时要理解。所以我和我我的大脑用C编写了程序,但现在我的大脑不知道如何将它转换为汇编语言。
#include <stdio.h>
int main()
{
int number, i;
printf("Enter a number: ");
scanf("%d", &number);
printf("The divisors(factors) for %d are: ", number);
for(i = 0; i <= number; i++)
{
if(number % i == 0)
printf("%d", i);
}
return 0;
}
那么,我如何在assambly中做到这一点? 这是现在做了多少,但可能只是糟糕的代码:
Date:
number dw 54 ;dw because I work with 16 bits
i dw 2
result dw ? ; the actual result
CODE:
mov ax, number ; I move the value of number in ax(16 bits)
mov bx, i
loop:
div bx ; number % i
cmp bx, 0; compare the modulo with 0
je final ; jump to final if is true
mov dx, 0
mov ax, bx
mov bx, dx
jmp loop ; jump from loop
;So...what now?...
final:
move result, ax;move what i have in ax to result
move ax, 4C00h ; i really don't know what is this...i just know i has to be at the end
int 21h ; an integer
拜托,你能帮助我吗? 注意:我试图安装TASM来测试我的代码,但它没有用,我觉得它只适用于Windows 7,但我不确定。所以,我需要你告诉我代码是好还是坏
答案 0 :(得分:1)
首先,我建议你从寻找最小的除数开始。因为正如我上面所见,当模数为零时,你将进入最终标签。因此,当它找到一个除数时,它会跳到那里并完成。
我的第二个建议是,当你正在研究MUL和DIV指令时,请仔细使用它们。当你做DIV BX模数不会在BX上。它将在DX上。因为你的除数是16位(这是BX)。因此,8086将执行DX:AX / BX,其中包括:AX和剩余:DX(模数)。
就像我说的,如果你是新手,你应该先在DIV和MUL上练习更容易的应用程序。