疑問に思ったところがあります。
前回の質問とちょっと前に質問したものなんですが・・・
アセンブリのコンパイルができません。
スタック領域の順番が同じになってしまいます。
**スタックの領域に入る変数の順序は決まってはいない。**ということのですね。
レジスタに値を入れる場合、
・即値をレジスタに直接代入する。
・スタック領域のポインタをレジスタに入れる。
の2通りでしょうか??
下の方の場合なんですが・・・
1)、スタック領域につまれる順序が決まっていないなら、レジスタに代入したいポインタを探すのが困難ですよね?
(つまり・・・スタック → レジスタに入れるとき、スタックの場所がわからないということです。)
順番を定めた方がよいのではないかと思います。
(配列や構造体は除く)
(前回の質問では、スタック領域に入っている値がどのアドレスに入ってるかがまるで分かりませんでした。)
2)、前回の質問でも、出てきたのですが、システムコールを呼ぶ時のパラメータをいれるレジスタは必ず固定なのでしょうか??
「どの値をどのレジスタに代入しなくてはならない」というのは決まっているのでしょうか?
raxやeaxはそれぞれ、64bit, 32bitですが、コンパイラが出力するレジスタは混合して出力されます。
raxとeaxの使い分けはどのようにすれば良いのでしょうか?
3)、前回の質問を見てもらえば分かるのですが、
mov 8(%rsp), %rbx
mov 12(%rsp), %rcx
mov 16(%rsp), %rdx
スタックポインタを4倍しているんですか?毎回4の倍数が指定されているのはなぜでしょうか??
char = 1B
int = 4B
なので、変数が違えば、8,12,16などの値も変わるんですか?
4)、前回の質問のアセンブリを載せます。文字列が見当たりません。文字列のポインタを代入しているような命令も見当たらないのですが・・・
0x555555554690 <main> push %rbp │ │0x555555554691 <main+1> mov %rsp,%rbp │ B+ │0x555555554694 <main+4> mov $0xe,%edx │ │0x555555554699 <main+9> lea 0xcc(%rip),%rsi # 0x55555555476c │ >│0x5555555546a0 <main+16> mov $0x1,%edi │ │0x5555555546a5 <main+21> mov $0x0,%eax │ │0x5555555546aa <main+26> callq 0x555555554732 <_write> │ │0x5555555546af <main+31> mov $0x0,%eax │ │0x5555555546b4 <main+36> pop %rbp │ │0x5555555546b5 <main+37> retq x555555554732 <_write> push %rbp │ │0x555555554733 <_write+1> mov $0x1,%rax │ │0x55555555473a <_write+8> syscall │ │0x55555555473c <_write+10> pop %rbp │ │0x55555555473d <_write+11> retq
lea命令で、アドレスのロードが行われているっぽいですが・・・スタックポインタではないんですかね???
アセンブリ言語初心者です。
お願いします。
Linux 64bit, intel CPU, GCCコンパイラです。
[追記]
毎回、C言語のファイルを逆アセンブルすると、出てくるんですが、
上記のアセンブリにも出てきていますね。
call命令の前後なのですが、mov $0x0,%eax・・・これですね。
EAXレジスタを0にしているようですが、なぜこんなことをする必要性があるのでしょうか??

回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/07/04 09:15
2017/07/04 09:33
2017/07/04 09:54
2017/07/04 10:04
2017/07/04 10:16
2017/07/04 10:21
2017/07/05 15:36
2017/07/06 00:05 編集
2017/07/06 02:02
2017/07/06 02:09
2017/07/06 10:28