K.Maebashi's BBS

ご自由に書き込んでください。雑談も可。
テスト書き込みの類はテスト用掲示板にどうぞ

[日付順表示] [日付順インデックス] [スレッド順インデックス]


新規投稿 | 開設者ホームページへ戻る | ヘルプ


[2180] Re:汎整数拡張について
返信


投稿者:(ぱ)こと管理人
2019/08/07 01:01:42

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が使われていることがわかります。
[ この投稿を含むスレッドを表示] [ この投稿を削除]



[ より新しい投稿] [ より古い投稿]