K.Maebashi's BBS 投稿フォーム
ハンドル名
件名
Link
>こんにちは。 > >>汎整数拡張という機能は、char型やshort型は、アセンブラ上ではint型と同じように >>扱われる、ということかなと思うのですが、この認識で合っているでしょうか? >>Cのソースコードからアセンブラに変換されるときに、汎整数拡張によって何か >>変換処理が行われるわけではないと思っています。 > >汎整数拡張という機能は、charやshortの変数でも、式の中ではintに変換される、 >という機能です。変数に格納された値を使う時にはintでも、変数のサイズは、 >charやshortならintより小さいわけですから、メモリから値を取り出して >(intと同じビット幅の)レジスタに乗せるときには汎整数拡張による変換処理が >入りますし、逆に(int型の)式の値をcharとかshortの変数に格納するときには、 >逆の変換が必要です。 > >試してみました。 > >char_test.c >#include <stdio.h> > >int char_test(void) >{ > char char_var = 5; > > printf("%d", char_var); >} > >int_test.c >#include <stdio.h> > >int int_test(void) >{ > int int_var = 5; > > printf("%d", int_var); >} > >アセンブラ上の差異は以下です(Linuxでgcc -S)。 > >char_test.s >movb $5, -1(%rbp) ← char_var = 5のところ >movsbl -1(%rbp), %eax ← char_varの値をeaxレジスタに移動 > >int_test.s >movl $5, -4(%rbp) ←int_var = 5のところ >movl -4(%rbp), %eax ← int_varの値をeaxレジスタに移動 > >int_test.sでは、単に32ビットを移動するmovl命令が使われていますが、 >char_test.sでは、5をchar_varに代入する際にはバイトでの移動命令movbが、 >char_varの値を取り出すときにはバイトを32ビットに変換しつつ移動する >movsblが使われていることがわかります。 >
spamよけのため、ここに「ほげぴよ」と入力してください。
削除パスワード :
クリック!