2016-11-20 19 views
2

誰でもこのコードを手伝ってくれますか? この場合、ptrgradesが指す値を使用し、4(整数の配列)を乗算して、ptrfreq(絶対周波数の配列)の対応する値をインクリメントしてその値を更新したいとします。 しかし、%ediレジスタや%eax値で正しいアドレス値を使用するためにいくつか問題があると思います。あなたのプログラムを修正するにはアセンブリIA32:このコードで何が問題になっていますか?

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 
+2

'addl $ 4、(%esi)'の代わりに 'addl $ 4、%esi'を試してください。後者は 'grades [i] + = 4;'を行いますが、 'grades + = 4;'、 'grades'が' int * '、' ++ grades; 'です。 – Downvoter

答えて

2
addl $4, (%esi)    # ptrgrade++ 

あなたは%esiレジスタとない%esiポイントにメモリを増やしたい、(やコメントを持っているが、コードを反映します)。

incl (%edi, %eax, 4)   # freq[i]++ 

あなたも外movl ptrfreq, %edi命令を移動することができますこの方法:命令のこのトリオは、ちょうどインデックス化対処するための頼む

addl $4, %esi     # ptrgrade++ 

shll $2, %eax     # multiply grade by 4 
addl %eax, %edi    # and add to the ptrfreq addrs 
incl (%edi)     # freq[i]++ 

:これを書きますループ(l_freq:ラベルの前)以降は変更されなくなりました。

関連する問題