Hey, ich habe bei einer Aufgabe Schwierigkeiten zu verstehen, was folgender Assembler-Code macht.
Das zugehörige Programm akzeptiert als Übergabeparameter eine Seriennummer und prüft ob diese gültig oder ungültig ist. Nun geht es darum den Algorithmus rauszufinden bzw. das Schema nach welchem die Nummern akzeptiert werden.
Dazu folgender disassemblierter Code:
#Edit: Hier das gleiche nochmal in Intel-Syntax:
Ich muss dazu sagen, dass ich mich vorher nie wirklich mit Assembler beschäftigt habe.
Deswegen ein paar Fragen:
Hier verschiebe ich also den Inhalt aus %rdi an die Stelle -0x18(%rbp) (also 24Bytes vor dem Register rbp.
Falls das nun ein 4Byte int ist. Steht der dann in positiver oder negativer Richtung praktisch? Also von: -0x18(%rbp) bis -0x14(%rbp) oder von -0x18(%rbp) bis -0x1C(%rbp).
Danach wird vermutlich mein char*-Übergabeparameter mit atoi in ein int umgewandelt. Woher weiß ich da in welches Register bzw an. welche Stelle der Wert geschrieben wird?
Ich würde jetzt mal raten, dass der int-Wert nach -0x4(%rbp) geschrieben wurde.
Und danach wird geprüft ob der Wert 0 ist?
Falls ja, dann wird der maximale int-Wert in das %eax Register geschrieben und die Methode verlassen?
Mir gehts prinzipiell erstmal darum den Code bis zum ersten "cmpl" zu verstehen. Habe da so etwas meine Schwierigkeiten. Evtl. kennt auch einer gute Literatur wo man sich einlesen kann.
Der Assembler Code ist für eine x86 Maschine (64Bit).
Hoffe mich kann da jemand etwas aufklären.
Grüße
Das zugehörige Programm akzeptiert als Übergabeparameter eine Seriennummer und prüft ob diese gültig oder ungültig ist. Nun geht es darum den Algorithmus rauszufinden bzw. das Schema nach welchem die Nummern akzeptiert werden.
Dazu folgender disassemblierter Code:
Code:
Dump of assembler code for function check_key: 0x00000000004005bd <+0>: push %rbp 0x00000000004005be <+1>: mov %rsp,%rbp 0x00000000004005c1 <+4>: sub $0x20,%rsp 0x00000000004005c5 <+8>: mov %rdi,-0x18(%rbp) 0x00000000004005c9 <+12>: mov -0x18(%rbp),%rax 0x00000000004005cd <+16>: mov %rax,%rdi 0x00000000004005d0 <+19>: mov $0x0,%eax 0x00000000004005d5 <+24>: callq 0x4004c0 <atoi@plt> 0x00000000004005da <+29>: mov %eax,-0x4(%rbp) 0x00000000004005dd <+32>: cmpl $0x0,-0x4(%rbp) 0x00000000004005e1 <+36>: jne 0x4005ea <check_key+45> 0x00000000004005e3 <+38>: mov $0xffffffff,%eax 0x00000000004005e8 <+43>: jmp 0x40062e <check_key+113> 0x00000000004005ea <+45>: mov -0x4(%rbp),%edx 0x00000000004005ed <+48>: mov %edx,%eax 0x00000000004005ef <+50>: shl $0x2,%eax 0x00000000004005f2 <+53>: add %edx,%eax 0x00000000004005f4 <+55>: add %eax,%eax 0x00000000004005f6 <+57>: add %edx,%eax 0x00000000004005f8 <+59>: mov %eax,-0x4(%rbp) 0x00000000004005fb <+62>: mov -0x4(%rbp),%eax 0x00000000004005fe <+65>: mov %eax,%edx 0x0000000000400600 <+67>: shr $0x1f,%edx 0x0000000000400603 <+70>: add %edx,%eax 0x0000000000400605 <+72>: sar %eax 0x0000000000400607 <+74>: mov %eax,-0x4(%rbp) 0x000000000040060a <+77>: sarl $0x3,-0x4(%rbp) 0x000000000040060e <+81>: addl $0xf7f9,-0x4(%rbp) 0x0000000000400615 <+88>: subl $0x13c,-0x4(%rbp) 0x000000000040061c <+95>: cmpl $0x17,-0x4(%rbp) 0x0000000000400620 <+99>: jne 0x400629 <check_key+108> 0x0000000000400622 <+101>: mov $0x0,%eax 0x0000000000400627 <+106>: jmp 0x40062e <check_key+113> 0x0000000000400629 <+108>: mov $0x1,%eax 0x000000000040062e <+113>: leaveq 0x000000000040062f <+114>: retq End of assembler dump.
Ich muss dazu sagen, dass ich mich vorher nie wirklich mit Assembler beschäftigt habe.
Deswegen ein paar Fragen:
Code:
mov %rdi,-0x18(%rbp)
Falls das nun ein 4Byte int ist. Steht der dann in positiver oder negativer Richtung praktisch? Also von: -0x18(%rbp) bis -0x14(%rbp) oder von -0x18(%rbp) bis -0x1C(%rbp).
Danach wird vermutlich mein char*-Übergabeparameter mit atoi in ein int umgewandelt. Woher weiß ich da in welches Register bzw an. welche Stelle der Wert geschrieben wird?
Ich würde jetzt mal raten, dass der int-Wert nach -0x4(%rbp) geschrieben wurde.
Und danach wird geprüft ob der Wert 0 ist?
Code:
cmpl $0x0,-0x4(%rbp)
Mir gehts prinzipiell erstmal darum den Code bis zum ersten "cmpl" zu verstehen. Habe da so etwas meine Schwierigkeiten. Evtl. kennt auch einer gute Literatur wo man sich einlesen kann.
Der Assembler Code ist für eine x86 Maschine (64Bit).
Hoffe mich kann da jemand etwas aufklären.
Grüße