私はアセンブリが初めてで、コールスタックに慣れているので、私には裸でいます。 Mac OS Xのx86_64版でのコマンドライン引数を取得するために、私は次の操作を行うことができますx86_64アセンブリコマンドライン引数
形式は「%sの」ある_main:
sub rsp, 8 ; 16 bit stack alignment
mov rax, 0
mov rdi, format
mov rsi, [rsp + 32]
call _printf
。 rsiはargv [0]に設定されます。
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
などなど:
ので、これから、私は、スタックが最初にどのように見えるか(と思う)を描きました。申し訳ありませんが読みにくいですか。私は何かが何か疑問に思います。いくつかのテストの後、私はそれが通常わずか0であることがわかります。しかし、時折、(一見すると)乱数です。
編集:また、スタックの残りの図面が正しいかどうか教えていただけますか?
はいああ、それはより理にかなって:通常、
argv
したがって、1rbp
以下eightbyte(それが義務付けられていないもののargc
は、最初に来る)となります。しかし、なぜ私はそうするのですか? "** mov r10、[rsp + 32] **"そして "** add r10、8 **" そしてr10をprintfに渡すと、セグメンテーション? argv [1]でしょうか? –待って、私の**失敗**。私はargvが実際には "rsp + 40"、つまり32ではないと思う。たぶん。私は今はかなり混乱していますが、助けてくれてありがとう! –