リンク内容
前回の続きで、基本を!
sub命令についておかしな点があります。
私の持っている本にはこうあります。
subl -8(%rbp), %eax
これはメモリのRBP-8 のアドレスのところにある値から、EAXの値を引いてその結果をEAXにいれます。
ところが、実際にやってみると、どうも逆のようです。
17 movl $1, -4(%rbp) 18 movl $2, -8(%rbp) 19 movl -4(%rbp), %eax 20 subl -8(%rbp), %eax
eaxは -1 が入ります。
(1)同じAT&T構文でも、様々な書き方が存在するんでしょうか?
なにによって書き方が決まるのでしょうか?
使用しているコンパイラ?OS?
私の本が間違っているのでしょうか??
(2)関数の呼び出しの際にRSPをベースポインタからずらす場合がある。
subq $16, %rsp
main()内とかには、よくありますよね・・・
別の関数を呼び出したりする際に、上記のような一行が入っていない場合があります。
この違いはなんでしょうか?
どんな時に、RSPをズラして、どんな時には、ズラさないのでしょうか?
RSPをズラす、ズラさないは何によって決まっているのでしょうか?
(3)無駄なコードが多い理由はなんでしょうか??
17 movl $1, -4(%rbp) 18 movl $2, -8(%rbp) 19 movl -4(%rbp), %eax 20 subl -8(%rbp), %eax 21 movl %eax, -12(%rbp) 22 movl -12(%rbp), %eax 23 movl %eax, %esi 24 leaq .LC0(%rip), %rdi 25 movl $0, %eax 26 call printf@PLT 27 movl $0, %eax 28 leave
21 movl %eax, -12(%rbp)
22 movl -12(%rbp), %eax
23 movl %eax, %esi
この部分は一行に出来ると思います。
movl %eax, %esi
最適化しても、ちょくちょく無駄なコードが入っています。
なぜこのような無駄なコードが入っているのでしょうか?
セキュリティのためですか?人間が無闇にいじくると脆弱性が生まれる危険性はありますかね?
例えば、前回出てきた。
25 movl $0, %eax
これについてもそうですが・・・・
削除しても動作自体に問題はありませんでした。
しかし、削除したらマズイかそれとも大丈夫なのかの判断が出来ません。
ちょっと前回より細かい場所なんのですが、気になってしかたありません。
どなたか教えてください。
回答2件
あなたの回答
tips
プレビュー