我在x86 masm课堂上,我们有一个我不明白的项目。助教和教授几乎没有用,我一直在努力与他们联系一周,没有答案,也没有办公时间。无论如何,我应该计算出15年内每月的平均天数。 (2000-2015)我们也应该考虑supposed年。

我事先用C编写了程序,这是我的代码:

main()
{
    double sum=0;

    int dpm[12] = {31,28,31,30,31,30,31,31,30,31,30,31};
    int i=0;
    int j=0;
    int months=0;

    while(j<16)
    {
        while(i<12)
        {
            if(j==0 || j==4 || j==8 || j==12)
            {
                dpm[1]=29;
            }
            sum+=dpm[i];
            dpm[1]=28;
            months++;
            i++;
        }
    j++;
    }
    printf("%.2f",sum/months);
}


(我意识到在这里使用for循环是最好的,但是虽然循环更容易在asm中完成,所以我使用了while循环)

我不太了解汇编程序,但是到目前为止,这是我所拥有的:

.DATA

    sum    DWORD 0
    months DWORD 0
    dpm    DWORD 31,28,31,30,31,30,31,31,30,31,30,31
    elm    DWORD 12
    i      WORD  0
    j      WORD  0

.CODE
main

    mov eax, sum            ; move sum to eax
    lea esi, dpm            ; move array to ebx
    mov ecx, elm            ; move no of elements to ecx
    mov ax, j               ; move j to ax
    mov bx, i               ; move i to bx

outterLoop:

    cmp 15, ax              ; compare 15 to i
    jle innerloop           ; jump to inner loop if it is less

innerLoop:

    cmp 11, bx              ; compare 11 to j
    jle checkLeap           ; jump to checkleap if it is less
    inc ax                  ; incremement j

checkLeap:

    cmp 0, bx               ; if j is 0
    je leap                 ; go to leap year function
    cmp 4, bx
    je leap
    cmp 8, bx
    je leap
    cmp 12, bx
    je leap
    jne updates             ; if not, go to updates fn

leap:

    add esi, 4              ; go to second element in array "february"
    mov 29, esi             ; make feb 29 instead of 28

updates:

    add eax, [esi]          ; add element to sum
    add esi, 4              ; increment array

    ; inc months

    mov                     ; here I would make second element of array 28

    inc bx                  ; increment i


我不知道自己是否步入正轨,并希望获得指导和建议。谢谢

最佳答案

与立即数进行比较时,您需要将数字放在最后。 (校正7次)

cmp ax, 15           ; compare 15 to i


要更改列表中的2月长度,请使用

mov dword [esi], 29  ; make feb 29 instead of 28


重置同样的事情

mov dword [esi], 28  ; here I would make second element of array 28


由于您已将j索引放入AX寄存器中,因此需要将总和放入不同于EAX的寄存器中。请记住,AX只是EAX的低16位。

下一个代码需要额外的跳转。现在它总是执行innerLoop

 cmp ax,15       ; compare 15 to i
 jle innerloop   ; jump to inner loop if it is less

innerLoop:

关于c - 遍历和平均数组MASM中的元素,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29017554/

10-10 01:00