关于在汇编中查找n个数字的数组的GCD(我在Visual Studio 2017中使用asm)而没有在C中使用外部变量的问题,我有一项家庭作业。我唯一拥有的变量是n个数字的数组。 我没有找到数组的前两个数字的GCD的问题,但是我不确定循环的方式,因为我的GCD为3个数字,所以我不断用数组的下一个数字更新寄存器,b,c是GCD(GCD(a,b),c)。我希望能有所帮助。
#include <stdio.h>
void main()
{
unsigned int intArray[] = {12,24,3};
int num = sizeof(intArray) / sizeof(intArray[0]);
unsigned int MCD;
__asm
{
xor ebx,ebx
xor edx,edx
xor eax,eax
mov eax, intArray[0]
mov ebx, intArray[1]
jmp major
zerob:
mov MCD, eax
jmp fine
major:
cmp eax,ebx
jg nextstep
xchg eax,ebx
jmp major
nextstep:
cmp ebx,0
je zerob
jne modulus
modulus:
div ebx
mov MCD,edx
mov eax,ebx
mov ebx,MCD
jmp nextstep
fine:
}
printf("M.C.D.: %d \n", MCD);
getchar();
}
答案 0 :(得分:2)
删除冗余指令,重新安排代码以减少跳跃,如果使用2个相同的数字,则删除潜在的无限循环,并在每次除法之前将EDX
归零:
mov eax, intArray[0]
mov ebx, intArray[1]
major:
cmp eax, ebx
jg nextstep
xchg eax, ebx
nextstep:
cmp ebx, 0
je zerob
modulus:
xor edx, edx
div ebx
mov eax, ebx
mov ebx, edx
jmp nextstep
zerob:
mov MCD, eax
fine:
使用 num 中的元素数,通过ESI
中的指针获取数字,并将内部循环转换为DO-WHILE循环(有条件地跳至顶部):< / p>
mov ecx, num ;Number of elements
lea esi, intArray[0]
lodsd ;First number in array
dec ecx
jz DONE
AGAIN:
mov ebx, [esi] ;Next number in array
add esi, 4
major:
cmp eax, ebx
jg nextstep
xchg eax, ebx
jmp nextstep
modulus: ;Inner loop
xor edx, edx
div ebx
mov eax, ebx
mov ebx, edx
nextstep:
test ebx, ebx
jnz modulus
dec ecx
jnz AGAIN
DONE:
mov MCD, eax
fine: