Hi,
ich beschäftige mich in letzter Zeit mit dem GNU Debugger (GDB) und versuche in diesem Rahmen ein Verständnis für Assembler zu erlangen.
Ich habe zu den Zwecken ein kleines Programm mit einer Funktion, die das Ergebnis der ersten Binomischen Formel zurückgibt, in C++ geschrieben:
Anschließend habe ich mit GDB die Funktion disassembled und versucht nachzuvollziehen, was dort passiert:
Code bei pastebin, besser lesbar
Die Instruktionen +39 und +42 verstehe ich nicht so ganz; warum dieses Hin-und-Her?
Und warum wird rbp vor dem Return wieder vom Stack entfernt?
Vielen Dank im Voraus.
ich beschäftige mich in letzter Zeit mit dem GNU Debugger (GDB) und versuche in diesem Rahmen ein Verständnis für Assembler zu erlangen.
Ich habe zu den Zwecken ein kleines Programm mit einer Funktion, die das Ergebnis der ersten Binomischen Formel zurückgibt, in C++ geschrieben:
Code:
int computeFirstBinom(int a, int b)
{
int r = a*a + 2*(a*b) + b*b;
return r;
}
Anschließend habe ich mit GDB die Funktion disassembled und versucht nachzuvollziehen, was dort passiert:
Code bei pastebin, besser lesbar
Code:
Dump of assembler code for function computeFirstBinom(int, int):
0x000000000000092a <+0>: push rbp ; push <base pointer> to stack
0x000000000000092b <+1>: mov rbp,rsp ; move <stack frame pointer> to <base pointer<
0x000000000000092e <+4>: mov DWORD PTR [rbp-0x14],edi ; move the 4 bytes from register edi to rbp-0x14 --> a
0x0000000000000931 <+7>: mov DWORD PTR [rbp-0x18],esi ; move the 4 bytes from register esi to rbp-0x18 --> b
0x0000000000000934 <+10>: mov eax,DWORD PTR [rbp-0x14] ; eax = a
0x0000000000000937 <+13>: imul eax,DWORD PTR [rbp-0x14] ; eax *= a --> eax = a*a
0x000000000000093b <+17>: mov edx,eax ; edx = eax --> edx = a*a
0x000000000000093d <+19>: mov eax,DWORD PTR [rbp-0x14] ; eax = a
0x0000000000000940 <+22>: imul eax,DWORD PTR [rbp-0x18] ; eax *= b --> eax = a*b
0x0000000000000944 <+26>: add eax,eax ; eax += eax --> eax = 2*a*b
0x0000000000000946 <+28>: add edx,eax ; edx += eax --> edx = a*a + 2*a*b
0x0000000000000948 <+30>: mov eax,DWORD PTR [rbp-0x18] ; eax = b
0x000000000000094b <+33>: imul eax,DWORD PTR [rbp-0x18] ; eax *= b --> eax = b*b
0x000000000000094f <+37>: add eax,edx ; eax += edx --> eax = a*a + 2*a*b + b*b
0x0000000000000951 <+39>: mov DWORD PTR [rbp-0x4],eax ; ? move the value of register eax to rbp-0x4
0x0000000000000954 <+42>: mov eax,DWORD PTR [rbp-0x4] ; ? move the value of rbp-0x4 to eax
0x0000000000000957 <+45>: pop rbp ; pop rbp from stack
0x0000000000000958 <+46>: ret ; return to caller?
End of assembler dump.
Die Instruktionen +39 und +42 verstehe ich nicht so ganz; warum dieses Hin-und-Her?
Code:
0x0000000000000951 <+39>: mov DWORD PTR [rbp-0x4],eax ; ? move the value of register eax to rbp-0x4
0x0000000000000954 <+42>: mov eax,DWORD PTR [rbp-0x4] ; ? move the value of rbp-0x4 to eax
Und warum wird rbp vor dem Return wieder vom Stack entfernt?
Vielen Dank im Voraus.
Zuletzt bearbeitet: