Ich bin neu in der Assembly, und ich habe mich gerade mit dem Call Stack vertraut gemacht. Um die Befehlszeilenargumente in x86_64 auf Mac OS X zu bekommen, kann ich folgendes tun:x86_64 Assembly Befehlszeilenargumente
_main:
sub rsp, 8 ; 16 bit stack alignment
mov rax, 0
mov rdi, format
mov rsi, [rsp + 32]
call _printf
Wo Format "% s". rsi wird auf argv [0] gesetzt.
Also, aus diesem, zog ich heraus, was (glaube ich) der Stapel sieht aus wie zunächst:
top of stack
<- rsp after alignment
return address <- rsp at beginning (aligned rsp + 8)
[something] <- rsp + 16
argc <- rsp + 24
argv[0] <- rsp + 32
argv[1] <- rsp + 40
... ...
bottom of stack
Und so weiter. Tut mir leid, wenn das schwer zu lesen ist. Ich frage mich, was [etwas] ist. Nach ein paar Tests stelle ich fest, dass es normalerweise nur 0 ist. Gelegentlich ist es jedoch eine (scheinbar) zufällige Zahl.
EDIT: Könnten Sie mir auch sagen, ob der Rest meiner Stack-Zeichnung korrekt ist?
Ah ja, das macht mehr Sinn. Aber dann, warum ist es, dass wenn ich mache: "** mov r10, [rsp + 32] **" und dann "** r10, 8 **" und dann r10 in printf übergeben, bekomme ich ein segfault? Das sollte argv [1] sein, oder? –
Warte, mein ** Fehler **. Ich denke argv ist eigentlich "rsp + 40", nicht 32. Vielleicht. Ich bin jetzt ziemlich verwirrt, aber danke für deine Hilfe! –