Assembly 组件IA32:What';这段代码怎么了?
有人能帮我处理这段代码吗? 在本例中,我希望使用ptrgrades所指的值,然后乘以4(整数数组),以增加ptrfreq(具有绝对频率的数组)中相应的值,以更新该值。 但我认为我在获取要在%edi寄存器中使用的正确地址值或可能是%eax值时遇到了一些问题Assembly 组件IA32:What';这段代码怎么了?,assembly,x86,Assembly,X86,有人能帮我处理这段代码吗? 在本例中,我希望使用ptrgrades所指的值,然后乘以4(整数数组),以增加ptrfreq(具有绝对频率的数组)中相应的值,以更新该值。 但我认为我在获取要在%edi寄存器中使用的正确地址值或可能是%eax值时遇到了一些问题 movl ptrgrades, %esi # set esi pointer to grades movl grades_length, %ecx # length of vector gra
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
要更正程序(并使注释反映代码),您需要增加%esi
寄存器,而不是%esi
指向的内存。写下:
addl $4, %esi # ptrgrade++
这三条指令只是要求使用索引寻址:
incl (%edi, %eax, 4) # freq[i]++
这样,您也可以将
movl ptrfreq,%edi
指令移到循环之外(在l_freq:label之前),因为%edi
不再更改。尝试addl$4,%esi
而不是addl$4,(%esi)
。后者则为等级[i]+=4代码>,前者的分数为+=4代码>,或者,如果等级
是int*
,++等级代码>。
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]++