在没有外部变量的情况下在汇编中查找n个数字的数组的GCD

时间:2019-05-14 11:03:05

标签: assembly x86 greatest-common-divisor

关于在汇编中查找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();
}

1 个答案:

答案 0 :(得分:2)

步骤1,清理和更正

删除冗余指令,重新安排代码以减少跳跃,如果使用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:

步骤2,创建循环

使用 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: