2016-11-20 5 views
2

Kann mir jemand bei diesem Code helfen? In diesem Fall möchte ich den Wert von ptrgrades verwenden und dann mit 4 multiplizieren (Array von ganzen Zahlen), um den entsprechenden Wert in ptrfreq (Array mit absoluten Häufigkeiten) zu erhöhen, um diesen Wert zu aktualisieren. Aber ich denke, dass ich einige Probleme habe, um den korrekten Adresswert zu erhalten, um in% edi Register oder vielleicht% eax Wert zu verwenden.Assembly IA32: Was ist los mit diesem Stück Code?

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

Versuchen Sie 'addl $ 4,% esi' anstelle von' addl $ 4, (% esi) '. Während das letztere "Grade [i] + = 4;", macht das erstere 'Grade + = 4;', oder, wenn 'grade' ein' int * 'ist,' ++ graden; '. – Downvoter

Antwort

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

Ihr Programm zu korrigieren (und den Kommentar haben reflektieren den Code), können Sie die %esi Register und nicht die Erinnerung, wo %esi Punkte erhöhen möchten. Schreiben:

addl $4, %esi     # ptrgrade++ 

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

Dieses Trio von Anweisungen bittet nur für eine indizierte Adressierung:

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

Auf diese Weise können Sie auch die movl ptrfreq, %edi Anweisung außerhalb des Umzugs Schleife (vor dem l_freq: Label) seit %edi ändert sich nicht mehr.