- 644 名前:デフォルトの名無しさん mailto:sage [2007/05/27(日) 03:37:25 ]
- 初心者ですが質問にお答えいただけるとうれしいです。
配列に直接機械語を埋めて関数ポインタで実行させたいのですが よくわかりません。 環境はPentium4、WindowsXP、BorlandC++Compiler。 //ソース #include <stdio.h> int main(void) { int (*func)(void); const char ch[] = { 0xb8, 0x45, 0x23, 0x01, 0x00, 0xc3 }; func = (int(*)(void))ch; printf("%X", (*func)()); return 0; } 何かが決定的に間違っているのにちゃんと12345と表示されます。 アセンブリで mov ax, 123h ret と書いてnasmでアセンブルすると B8 23 01 C3と機械語が吐き出されます。 これをそのままch[]に埋め込んでもエラーで正しく実行されません。 axレジスタって16Bitですよね?なぜか32Bitで補正してやると正しく実行されるんですよね。 きっと、正しくできていると思い込んでいて実際には偶然こうなっただけなのでしょうけど なぜ、これが出来て、普通にアセンブルして出来た機械語が実行できないのでしょうか? もしかして、こういう行為自体が土台不可能な話で、今回出来たのはまったくの偶然ということでしょうか? 教えていただけないでしょうか、よろしくお願いします。
|

|