C言語関係掲示板

過去ログ

No.1135 コンパイル後のグローバル変数を末尾XXXXX0hにしたい

[戻る] [ホームページ]
No.2228

コンパイル後のグローバル変数を末尾XXXXX0hにしたい
投稿者---大仁田厚(2004/07/05 19:12:07)


配列変数long型 A[4]
のコンパイル後のメモリマッピングでAのグローバルアドレスを末尾
が0hにしないとうまく動作しないデバイスを使用としています。
普通にコンパイルすると、偶数ではマッピングされるのですが、
XXXX0hではマッピングされません。
HEXで末尾1桁を0からマッピングさせるやり方を
ご存知の方いたら教えてください。


No.2229

Re:コンパイル後のグローバル変数を末尾XXXXX0hにしたい
投稿者---かずま(2004/07/05 19:32:55)


#include <stdio.h>

int main(void)
{
    char a[sizeof(long) * 4 + 15];
    long *A = (long *)((long)a + 15 & ~15);
    int i;

    printf("a=%p\n", a);
    printf("A=%p\n", A);
    for (i = 0; i < 4; i++)
        A[i] = i;
    for (i = 0; i < 4; i++)
        printf("%d\n", A[i]);
    return 0;
}



No.2230

Re:コンパイル後のグローバル変数を末尾XXXXX0hにしたい
投稿者---大仁田厚(2004/07/05 19:38:21)


早速のご回答ありがとうございます。
さっそく試してみます。


No.2231

Re:コンパイル後のグローバル変数を末尾XXXXX0hにしたい
投稿者---ぽこ(2004/07/05 20:12:02)


>ご存知の方いたら教えてください。

コンパイラにアライメントを指定する機能はありませんか?
VC++の場合
__declspec(align(16)) int x;

gccの場合
int x __attribute__ ((aligned (16)));

とすることで変数xを16バイト境界に配置することが出来ると思います。
※未確認。

#かずまさんの示された手法は、私にはトリッキーに見ますが、
#デバイスドライバ開発とかでは常識的な書き方なんでしょうか?