アセンブラだけでWindowsAPIを叩いてウインドウを表示させることはできるのでしょうか。C言語で普通にできるので、相当複雑になるとは思いますが、当然アセンブラでもできると思います。C言語だと変数の型の名前なども変な名前がいろいろ付いていて裏で何をやっているのかさっぱりわかりません。普通に使う分には問題ないのですが、ブラックボックスのような感じで気持ち悪いのです。どのような命令でAPIが呼び出されているのかCPUレベルで知りたいです。C言語の呼び出し規約ということで、MS-DOSのシステムコールみたいなものとは違うと思うのですが、どうなのでしょうか。
No.6ベストアンサー
- 回答日時:
> アセンブラだけでWindowsAPIを叩いてウインドウを表示させることはできるのでしょうか。
可能です。MS-DOSでは直接int命令を発行しますが、
Windowsはstdcall規約で関数をcallするだけですから他の関数と大差ありません。
コンパイラでCソースのアセンブリリストが出せると思いますので、ご覧になってみればいかがでしょうか。
> C言語だと変数の型の名前なども変な名前がいろいろ付いていて
> 裏で何をやっているのかさっぱりわかりません。
補足等読んでいる限り、アセンブリ云々では多分解決しないと思いますが。
型名を独自に定義しているのは裏で何をやっているかをブラックボックスにして、
もっと抽象度を上げようとしているのであって、わざわざ隠そうとしているものです。
C言語より抽象度が下がれば理解できるという考えはずれているように思います。(後述)
> __stdcall → WINAPI
例えばこの記述は、「呼び出し規約」ではなく「意味役割」に抽象度をあげています。
つまり、Windowsでのコールバックされる関数を示すのがWINAPIであって、
単に__stdcallと書くこととは意味的に等価ではありませんし、可読性や検索性も違います。
# ついでに書けば、__stdcall自体もコンパイラ独自であって、C/C++の言語仕様では規定してませんので、常に動く保証がありません。
> char* → LPSTR
これも、(ゼロ終端の)文字列を示すことを暗示しており、char*より抽象度があがります。
例えばLPBYTEとは意味的に区別して使われていますし、また、
LPTSTRになると、UNICODE(WCS)とMBCSの切り替えにも意味を持ちます。
> unsigned int → UINT
Win16時代のintとWin32時代のintの差異吸収という意味での抽象度上げでしょう。
C言語の仕様上、マルチプラットフォームを意識した開発ではよく見る手法です。
他の型も、抽象度アップや統一感維持のためにそうなっています。
「わざわざブラックボックスにする」ために定義されているものですから、
本来はあまり気にしなくていいお話ですが、知りたい局面も確かにあります。
ただ、それはアセンブリよりもwindows.h中の(C言語の)定義を見るべきでは?
> WinMainの宣言も、
「Windowsの規約」を無視すれば、HINSTANCEもvoid*と書けなくはないです。
# 但し、これはSTRICTの有無で実際の型が変わって通らなくなりますし、普通はそんなことしませんが。
> 単なる書き方の好みの問題とは考えづらいです。
型名に意味/付加情報を与えて抽象度を上げるためであって、好みではないでしょう。
> このような何バイトの情報なのかもよくわからない型名が余計に処理をブラックボックス化させている気もします。
ブラックボックスにするためのものなので、多分そうだと思いますが、
それは意図的なものですし、別に混乱を誘っているわけでもありません。
Windowsの規約に従う処理は、Windowsの型を使うべきであり、
C/C++ネイティブの型と安易に混ぜて使うべきではありません。
Win16⇒Win32や⇒Win64の移行などをやってみれば分かります。
この回答への補足
ありがとうございました。わざわざブラックボックスにしている訳ですね。
確かにUnicodeの切り替えなどでは必要なものだとは思います。
でもやはりMS-DOSのプログラミングをやっていた人がいきなりWindowsをやると混乱しそうです。
No.5
- 回答日時:
こんにちは。
私も、先達の残してくれたドキュメントを手がかりに、ブラックボックスにぶつかっていっています。後は msdn library でしょうか。
光成さん
x86アセンブリ言語入門
http://homepage1.nifty.com/herumi/prog/prog.html
x64 アセンブリ言語プログラミング
http://homepage1.nifty.com/herumi/prog/x64.html
Jun Mizutaniさん
Linux でアセンブリプログラミング
http://www.nk.rim.or.jp/~jun/lxasm/asm00.html
msdn library
http://msdn.microsoft.com/en-us/library/default. …
ご参考まで。
No.4
- 回答日時:
>>いえ、ハンガリー記法ではなく、
Windowsプログラミングでは、
__stdcall → WINAPI
char* → LPSTR
unsigned int → UINT
というように普通の型名を別の(Windowsプログラム用?)型名で置き換えていますよね。
それのことですか?そういうコーディングは、Windowsに限らずUnixのソースでも目にしますね。できるだけソースコードの抽象度を上げて、32,64Bitのビット数の違いとかコンパイラ間での相違を受けず、移植性を高めるためみたいです。
たとえば、共通のinclude file内で
#ifdef A_CPU
typedef unsigned int UINT;
#else
typedef unsigned long UINT;
#endif
なんて記述をするとか、最初からinclude fileを環境ごとに切り替えるってことをするようです。
以前読んだ100以上もの環境に移植されているという商用データベースのソースコードも、そういう書き方になっていました。
No.3
- 回答日時:
No.2
- 回答日時:
>>C言語のWindowsプログラムでは、やたらと大文字の長い型名やトークンを使用しますが、構造体の名前でもないただの unsigned intやvoid *などの一般的な型名や__stdcallなどをあんなにわかりにくいものに置き換えてしまうのでしょうか。
タイプ型のハンガリアン記法のことでしょうか?以下にあるように、現時点では、それは「誤った有害な命名方法」と評価されてマイクロソフトでも使用を禁止しているようですよ。
http://ja.wikipedia.org/wiki/%E3%83%8F%E3%83%B3% …
でも、「過去の遺産」のソースを引きついで利用するとき、それまでの命名法を崩すのも、それはそれで問題になるので、現時点で禁止されていても、そのままの流儀でいっているのでしょうね。
この回答への補足
いえ、ハンガリー記法ではなく、
Windowsプログラミングでは、
__stdcall → WINAPI
char* → LPSTR
unsigned int → UINT
というように普通の型名を別の(Windowsプログラム用?)型名で置き換えていますよね。
WinMainの宣言も、
int __stdcall WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance, char* lpCmdLine, int nShowCmd)
という風に、LPSTRやWINAPIを使わなくても書けるならこう書けばいいと思うのですが、なぜ実際はLPSTRやWINAPIといったキーワードを使用するのでしょうか。単なる書き方の好みの問題とは考えづらいです。このような何バイトの情報なのかもよくわからない型名が余計に処理をブラックボックス化させている気もします。
No.1
- 回答日時:
この回答への補足
ありがとうございます。そもそもWindowsAPIはDLLを呼び出してると思うのですが、アセンブラからDLLを読み込みその関数を呼び出すという操作が特に気になります。
もうひとつ聞きたいこととして、C言語のWindowsプログラムでは、やたらと大文字の長い型名やトークンを使用しますが、構造体の名前でもないただのunsigned intやvoid *などの一般的な型名や__stdcallなどをあんなにわかりにくいものに置き換えてしまうのでしょうか。新しい型が出てくるたびに正体が何なのか気になって仕方がありません。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# アセンブラ指令 3 2023/06/17 14:47
- C言語・C++・C# C言語初心者 構造体 課題について 2 2023/03/10 19:48
- その他(言語学・言語) ピダハン語 2 2022/07/14 12:41
- C言語・C++・C# スタックフレームの消滅 6 2023/05/20 12:33
- 哲学 日本語は 言語類型として あたかも始原のごとくである 3 2022/05/29 04:41
- その他(プログラミング・Web制作) x86_32のGASの擬似命令 3 2023/06/07 19:55
- 日本語 言葉の言語って最初に決めたのは誰なんですか? 自分の好きな動物で例えると 犬(いぬ)猫(ねこ)でいく 4 2022/05/28 11:49
- 地理学 チェルノブイリではなくチョルノービリ、 7 2022/04/02 04:30
- その他(交通機関・地図) スマートEX事前予約について 1 2023/06/26 14:52
- 子育て 一歳半検診 6 2023/03/25 14:10
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ライン数とステップ数の違いは?
-
アセンブラのリンカのダウンロ...
-
アセンプラ16ビット8086
-
PC-9801でマシン語を学習するに...
-
SHの命令の意味について
-
アセンブリ言語について。
-
PICのPCL
-
バイナリの実行ファイルをgccを...
-
実行ファイルからソースはみれる?
-
アセンブラNASMで扱える命令に...
-
0xffffとは?
-
エクセルVBAのIf,Then 構...
-
ビットシフトってどんな時使うの?
-
コンピュータ言語とプログラミ...
-
一般のソフトで画像を扱う場合...
-
8ビットのデータの、先頭ビット...
-
fortran
-
03分22秒36のような時間の単位...
-
シーケンス制御についての質問...
-
パチンコやスロットについて
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ライン数とステップ数の違いは?
-
Windowsはオープンソースですか?
-
アセンブラからC言語に変換する...
-
実行ファイルからソースはみれる?
-
アセンブラ言語がわかりません。
-
アセンブラエディタ
-
PICに書き込むプログラムや変数...
-
SHの命令の意味について
-
このアセンブラの意味を教えて...
-
void __cdeclなど_
-
GCCの.cfi_系について
-
PC-9801でマシン語を学習するに...
-
アセンブラのLA
-
アセンブラで割り算
-
汎用レジスタのワーキングビッ...
-
エンディアンについて。
-
C to 68000アセンブラ
-
PICはアセンブラとC言語のどち...
-
素朴な疑問 (C言語とアセン...
-
アセンブラwordという単位
おすすめ情報