C言語におけるグローバル変数参照アセンブリ言語におけるグローバルラベル

1857 ワード

アセンブリ言語とC言語のハイブリッドプログラミングでは,アセンブリ内のデータ定義をC言語でグローバル変数で参照することが一般的であるが,同名の異なる落とし穴がある.
1テストコード
アセンブリ言語で整数変数studentIDを定義し、次のように初期値を指定します.
    .global studentID
    .data
studentID:
    .word 12345678

    .text
    ldr r0, =studentID  /* studentID        */
    ldr r0, [r0]        /*    ,r0=12345678 */

リンク後、studentIDが表すアドレスは0 x 3000000とする.
C言語でstudentIDを参照すると、次のようになります.
extern int studentID;   /* studentID     studentID        */
printf("%d
"
, studentID); /* 12345678 */ printf("%p
"
, &studentID); /* studentID 0x30000000 */

2注意事項
注意:(1)文字列「studentID」は、アセンブリ言語でその存在するメモリアドレス、すなわち定数0 x 300000を表す.
studentID = 0x30000000

(2)同様の文字列「stdentID」は、C言語では0 x 300000メモリアドレスに格納されているデータ(値)を表す.メモリアドレスを取得するには「&studentID」が必要である.
studentID = 12345678;
&studentID = 0x30000000;

明らかにC言語は抽象的な階層を高め、同時に同じ名前が異なる言語で代表される意味の違いをもたらし、アセンブリとCハイブリッドプログラミングに一定の混同をもたらした.