KDOC 226: 任意のアドレスに読み書きする
この文書のステータス
- 作成
- 2024-08-24 貴島
- レビュー
- 2024-09-09 貴島
概要
メモリアドレスを直接指定して、値を読み書きしてみるコードを見る。
0x2b67
アドレスに値 111
を書き込み、後からアドレス直接指定で値を読み込むようなアセンブリが生成できている。
無効な範囲を指定すると、Segmentation Faultになり書き込みできない。
int main() { *((int *) 0x0001) = (int) 111; }
int main() { int x = 1; printf("0x%08X: x -> %i\n", &x, x); *((int *) &x) = (int) 999999; printf("0x%08X: x -> %i\n", &x, x); }
0x4423DD04: x -> 1 0x4423DD04: x -> 999999
セグメント内なら、任意のメモリにアクセスできる。
int main() { int x = 2; printf("0x%08X: x -> %i\n", &x, x); int load1 = *((int *) &x-0x100000); int load2 = *((int *) &x+0x100); int load3 = *((int *) &x+0x2); printf("load1(-0x100000): 0x%08X\n", load1); printf("load2(+0x100): 0x%08X\n", load2); printf("load3(+0x2): 0x%08X\n", load3); }
0x9EBD7178: x -> 2 load1(-0x100000): 0x00000000 load2(+0x100): 0x00001000 load3(+0x2): 0x00001000
int main() { char base = 0; char a = 'a'; char b = 'b'; char c = 'c'; printf("0x%08X: base\n", &base); printf("0x%08X: a\n", &a); printf("0x%08X: b\n", &b); printf("0x%08X: c\n", &c); printf("\n"); printf("a: 0x%08X\n", *((char *) &base+0x1)); printf("b: 0x%08X\n", *((char *) &base+0x2)); printf("c: 0x%08X\n", *((char *) &base+0x3)); }
0x5FD01F44: base 0x5FD01F45: a 0x5FD01F46: b 0x5FD01F47: c a: 0x00000061 b: 0x00000062 c: 0x00000063
関連
- KDOC 202: 『30日でできる! OS自作入門』。出てきたコードを確認した