Assembly 组件IA32:What';这段代码怎么了?

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

有人能帮我处理这段代码吗? 在本例中,我希望使用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
要更正程序(并使注释反映代码),您需要增加
%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]++