我在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/