TERABITのプロフィール
- ベストアンサー数
- 4
- ベストアンサー率
- 44%
- お礼率
- 0%
- 登録日2009/03/20
- VC2005 プログラム領域への書込み制限について
<前提> VC2005 で、以下のプログラムを実行すると、 エラーメッセージが出力されます。 <エラーメッセージ> test.exe の 0x004113c9 でハンドルされていない例外 が発生しました: 0xC0000005: 場所 0x004113cb に 書き込み中にアクセス違反が発生しました。 ----------- #include <stdio.h> void main(void) { unsigned long pc_pos; // PC位置をpc_posへ格納 __asm { CALL NXT NXT: POP pc_pos; } (*(unsigned char*)pc_pos) = 0x3F; return; } ----------- そこで、アセンブラで命令列をみると、 アドレス004113C9の場所で、発生しています。 ---------- // 今のPC位置を知るプログラムは? __asm { CALL NXT 004113BE E8 00 00 00 00 call NXT (4113C3h) NXT: POP pc_pos; 004113C3 8F 45 F8 pop dword ptr [pc_pos] } (*(unsigned char*)pc_pos) = 0x3F; 004113C6 8B 45 F8 mov eax,dword ptr [pc_pos] 004113C9 C6 00 3F mov byte ptr [eax],3Fh ※eaxレジスタには、0x004113c3 が格納されています ---------- さて、ここで質問です。 <質問> プログラム領域への書込みは、ライトプロテクトされています。 このライトプロテクトを一時的に外す方法はありますでしょうか。 つまり、0x004113c3アドレスに、3Fhを書き込んでも、 エラーが発生しない方法が知りたいです。 > プログラム領域に対する書込み命令コード 004113C9 C6 00 3F mov byte ptr [eax],3Fh
- ベストアンサー
- darkness22
- C・C++・C#
- 回答数5
- Cでは文字列をどのように認識するのでしょうか?
C言語には文字列型というものは存在しないと教わりました。 文字列の終わりはヌル文字で認識できますが、 文字列型というものが存在しないのに何故次のバイトを読もうとするのですか? たとえばchar str[] = "abc";、あるいはchar *p = "abc";とあったとして printf(str);あるいはprintf(p); でなぜabcが出力されるのでしょうか?なぜaの次にbがbの次にcがあるとわかるのでしょうか? char型で先頭アドレスが渡された場合、ヌル文字を見つけるまでアドレスをインクリメントし続けるという決まりでもあるのでしょうか? それに文字列型というものが存在しないなら''と""を分ける意味もないのでは??
- Cでは文字列をどのように認識するのでしょうか?
C言語には文字列型というものは存在しないと教わりました。 文字列の終わりはヌル文字で認識できますが、 文字列型というものが存在しないのに何故次のバイトを読もうとするのですか? たとえばchar str[] = "abc";、あるいはchar *p = "abc";とあったとして printf(str);あるいはprintf(p); でなぜabcが出力されるのでしょうか?なぜaの次にbがbの次にcがあるとわかるのでしょうか? char型で先頭アドレスが渡された場合、ヌル文字を見つけるまでアドレスをインクリメントし続けるという決まりでもあるのでしょうか? それに文字列型というものが存在しないなら''と""を分ける意味もないのでは??
- includeが必須ではない理由
C言語で printf 等を使用する場合 include は必須だと色々なところで書かれているのですが、以下の構文で警告は出ているものの正確な結果が出力されてしまいました。 //#include <stdio.h> int main(){ int i = 0; scanf( "%d", &i ); printf("%d, %f, %s\n", i, 0.1, "STR"); return 0; } 実行結果 入力値:i = 1 1, 0.100000, STR 警告:関数 'scanf' は定義されていません。int 型の値を返す外部関数と見なします。 警告:関数 'printf' は定義されていません。int 型の値を返す外部関数と見なします。 これはなぜでしょうか。 VisualStudio2008を使用しています。
- ベストアンサー
- ShimantoGa
- C・C++・C#
- 回答数8