C言語におけるグローバル変数参照アセンブリ言語におけるグローバルラベル
1857 ワード
アセンブリ言語とC言語のハイブリッドプログラミングでは,アセンブリ内のデータ定義をC言語でグローバル変数で参照することが一般的であるが,同名の異なる落とし穴がある.
1テストコード
アセンブリ言語で整数変数studentIDを定義し、次のように初期値を指定します.
リンク後、studentIDが表すアドレスは0 x 3000000とする.
C言語でstudentIDを参照すると、次のようになります.
2注意事項
注意:(1)文字列「studentID」は、アセンブリ言語でその存在するメモリアドレス、すなわち定数0 x 300000を表す.
(2)同様の文字列「stdentID」は、C言語では0 x 300000メモリアドレスに格納されているデータ(値)を表す.メモリアドレスを取得するには「&studentID」が必要である.
明らかに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ハイブリッドプログラミングに一定の混同をもたらした.