jyunさん,、いつもありがとうございま... 投稿者:志穂 投稿日:2002/11/12(Tue) 18:00 No.74 | |
|
void intadd(int a,int b,int *c) { *c=a+b; } からアセンブリソース吐き出さ ると わからないことが2点ほどあります。
.file "add.s" gcc2_compiled.: .text .align 4 .globl add .type intadd,@function add: pushl %ebp movl %esp,%ebp pushl %ebx <------- movl 16(%ebp),%eax movl 8(%ebp),%edx movl 12(%ebp),%ecx leal (%ecx,%edx),%ebx <-------- movl %ebx,(%eax) .L2: movl -4(%ebp),%ebx movl %ebp,%esp popl %ebp ret
2つ目のpushlはなんのために必要なんでしょうか?
|
| Re: jyunさん,、いつもあ・.. 志穂 - 2002/11/12(Tue) 18:02 No.75 | |
|
|
それと、 leal (%ecx,%edx),%ebx <-------- ですが、 これは %ecx + %edxの結果を%ebxに格納するってことでしょうか? でも、わからないのは、 (%ecx,%edx)の()です。 これがついてるってことは、アドレスのメモリの 内容ってことですよね? これは無視して考えるんでしょうか?
|
| Re: jyunさん,、いつもあ・.. jun - 2002/11/12(Tue) 22:31 No.77 | |
|
|
> 2つ目のpushlはなんのために必要なんでしょうか? ebx の保存です。movl -4(%ebp),%ebxで復帰しています。 なぜ、popl %ebx でないかはコンパイラに聞いてください(^^)。
> でも、わからないのは、 > (%ecx,%edx)の()です。
lea はそういう命令です。R1 = R2 + R3 * 4 + 定数 のように 配列のアドレス計算などが高速にできるように用意された特殊 な命令です。四則演算命令と考えると"( )"は不自然ですが、 理由はインテルのアセンブラ作者に聞いて下さい(^^)。 |
| Re: jyunさん,、いつもあ・.. 志穂 - 2002/11/12(Tue) 22:45 No.79 | |
|
|
親切にどうもありがとうございます。 はぁー、すっきり!!(笑) もう、わかんないことだらけで。 ほんといつもたすかります!! |
|