大会IA32:这段代码有什么问题?

时间:2016-11-20 13:35:48

标签: assembly x86

任何人都可以帮我解决这段代码吗? 在这种情况下,我想使用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

1 个答案:

答案 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不再发生变化。