den folgenden Quellcode Betrachten, wobei R, S und T sind Konstanten mit #define erklärt:Störungsbestimmungs Konstanten in diesem Assembler-Code zu haben
int A[R][S][T];
int store_ele(int i, int j, int k, int *dest)
{
*dest = A[i][j][k];
return sizeof(A);
}
dieses Programm Bei der Zusammenstellung erzeugt GCC den folgenden Assembler-Code:
i at %ebp+8, j at %ebp+12, k at %ebp+16, dest at %ebp+20
1. movl 12(%ebp), %edx //move j into register %edx
2. leal (%edx, %edx, 8), %eax //move address %edx+%edx*9 into %eax
3. leal (%edx, %eax, 4), %eax //move address %edx + %eax*4 into %eax
4. imull $111, 8(%ebp), %edx //111*i goes into %edx
5. addl %edx, %eax
6. addl 16(%ebp), %eax //add k to %eax
7. movl A(, %eax, 4), %edx //%eax*4 offset by address of A moved into %edx
8. movl 20(%ebp), %eax
9. movl %edx, (%eax)
10. movl $888, %eax
ich weiß, dass der letzte Befehl 'movl 888 $,% eax' sagt, dass es 888 Bytes sind, die zu 222 ints entspricht (i j * k *). Wie Sie sehen können, weiß ich, was jede Anweisung macht, aber ich habe Schwierigkeiten, diese zu rekonstruieren, um die Konstanten zu bestimmen, die in i, j und k übergeben werden. i * 111
= i * 3 * 37
:
ich keine Antworten erwarten aber keine Hinweise mich in die richtige Richtung weisen würde stark
Welche Version verwenden Sie? –
Nachdem ich mir den Code genauer angesehen hatte, konnte ich feststellen, dass% edx eine Menge Arithmetik durchläuft, dann wird bei Anweisung 9% edx als Dereferenz auf% eax (die zu der Zeit auf die Adresse von A gesetzt wurde) verschoben. . Danke auch an alle, die meinen Beitrag bearbeitet haben, um ein passendes Format zu haben, ich bin ein Neuling auf dieser Seite. – user3296049
Diese Version ist ATT – user3296049