任何人都可以帮我解决这段代码吗? 在这种情况下,我想使用ptrgrades指向的值,然后乘以4(整数数组)来增加ptrfreq(具有绝对频率的数组)中的对应值来更新该值。 但我认为我有一些问题需要在%edi寄存器中使用正确的地址值,或者可能是%eax值。
movl ptrgrades, %esi # set esi pointer to grades
movl grades_length, %ecx # length of vector grades
l_freq:
movl ptrfreq, %edi # reset with inital addrs of pointer
movl (%esi), %eax # tmp = grades[i]
shll $2, %eax # multiply grade by 4
addl %eax, %edi # and add to the ptrfreq addrs
incl (%edi) # freq[i]++
addl $4, (%esi) # ptrgrade++
loop l_freq # loop while ecx != 0
答案 0 :(得分:2)
addl $4, (%esi) # ptrgrade++
要更正程序(并使注释反映代码),您需要增加%esi
寄存器而不是%esi
指向的内存。写下这个:
addl $4, %esi # ptrgrade++
shll $2, %eax # multiply grade by 4 addl %eax, %edi # and add to the ptrfreq addrs incl (%edi) # freq[i]++
这三条指令只需要一个索引寻址:
incl (%edi, %eax, 4) # freq[i]++
这样,您也可以将movl ptrfreq, %edi
指令移到循环之外( l_freq:标签之前),因为%edi
不再发生变化。