dポイントプレゼントキャンペーン実施中!

C標準ライブラリがwinAPIを経由しなくても実行できるなら、

「C標準ライブラリを作った人」が直接ハードウェアであるCPUとメモリを操作できてしまっていることになると思うのですがどうですか?

質問者からの補足コメント

  • Windowsにおいて

      補足日時:2020/11/09 20:02
  • メーカーの人間だから知ってて当然なんですかね。

    あくまで、ハードウェアの直接の操作を禁じている対象は一般のプログラマやユーザーに対してということですか。

      補足日時:2020/11/09 20:47
  • アセンブラで文字を標準出力に出力することができることをネットで見ました。

    いままではwindows内部でapiを呼び出してやっているんだな、と思っていましたが、
    そうではないようですので、

    アセンブラで標準出力は可能だということなんですか。

    コンソールに表示するにはディスプレイ操作をしていることになると思うのですが、
    どうなんでしょうか。

    アセンブラ自身がデイスプレイの操作方法を知っているということですか。
    ディスプレイはアドレスが用意されていてCPUはそこにメモリを扱うのと同じ要領で
    バイトデータを送っているのだと思いますが。

      補足日時:2020/11/10 13:26
  • 過去に調べたことが間違っていたとして、そのことが思い込みというのかはわかりませんが、
    その内容が間違っているのであれば、その基盤の上に建てられた結論も自ずと支離滅裂なものになるはずです。

    そもそもの疑問として昔からこの疑問がありました、
    windowsでC言語のポインタやアセンブラを使ってプログラムからディスプレイに「点」を打っていただきたいのですが、どうやって可能ですか?

    当然apiやライブラリ、MS-DOS api を使わずにです。
    ソースではなく、大まかな理論が知りたいです。

    私がずっと思っているのは、ディスプレイのメモリでいうアドレスが少なくともわからないといけないと思っています。

    またどんなビットデータを送ればどう表示されるか。

    またwindowsがディスプレイに表示する画面を層として重ね合わせる機構への理解

    もしお気になさらないようであれば、教えていただきたいです。

      補足日時:2020/11/10 23:16
  • 皆さん、ありがとうございました。

    私自身の最近の質問の中で一つずつ確認をして考察していたのですが、
    新しい質問から入った方にとっては混乱の元となっていたかもしれません。

    アセンブラでも例外なくwindowsでは画面表示をする際はwindows APIを呼び出すことに、
    なっていると理解できました。
    アセンブラであってもアドレス指定によるメモリの直接操作によって画面表示は、
    できないということですね。

    今後の人生に生かしたいと思います。

      補足日時:2020/11/12 14:28

A 回答 (9件)

そもそも MS-DOS の時代では「グラフィックスはプログラムがなんとかする」もので, その当時であれば VRAM のアドレスやなんかも全て公開されていたので「しかるべきアドレス」に「しかるべき値」を入れれば「しかるべき図形」が得られる. 例えば CGA であれば


https://www.seasip.info/VintagePC/cga.html
によれば先頭アドレスが 0xB8000 で, その最上位ビットがディスプレイの左上のドットに対応する. なので,
グラフィックスモードに切り換えたあとでアドレス 0xB8000 に値 0x80 を入れる
と「画面の左上のドット」を付けることができる... はず. こうやって地道に 1個ずつドットを点けたり消したりして図形を描く.

今の Windows だと各種保護機構のためこれでは
絶対に動かない
けど... 1.x の時代だと動くかなぁ.
    • good
    • 1
この回答へのお礼

あざす。

やっぱりそうですよね。
私も昔そのOSの保護について本で知って、他の質問アプリで聞いたんですよ、そしたらやはりwindowsはハードウェアを直接触れないということを言っていて、
それにCPUやメモリも加えてしまった私の早計さでもあると思うんですが、どうかんがえてもC言語周りのことを読んでいる時に納得できないことが出てきたんですよね。

もう最後の疑問であって欲しいと願っているのですが、
この質問の回答者様の中でMS-DOSのint21によるコンソールへの標準出力について説明されていますが、「(上記の保護を考えて)なぜ、MS-DOSがwindowsAPIを経由せずにコンソールへの画面出力ができるのか」を知りたいです。

windowsAPIを使用していたらすいません。

お礼日時:2020/11/11 00:52

>今「MS-DOS」って動いてるんだっけ? Microsoft


>自体はもう出してないはずだし,
>「最新」のやつであったとしても今の
>機械で動くような気がしないんだけど

これは申し訳ない。int21は32bitのWindows のNTVDM上でないと
動かないですね。
    • good
    • 1

☓ windowsのセキュリティ上ハードウェアの直接の操作を禁じているからである


○ 拡張デバイスの直接の操作を禁じている

あー、多分質問者は、そもそもWindows機(IBM-PC/AT互換機)って本体がディスプレイ表示用のカードとか「持ってない」っての知らんのかもしれん・・・・・・。
世代のアレかもしれないけど・・・・・・。
今だと全部「バンドル」されてるから気づかんのかもなぁ。
本当だったら、「本体だけ」買ったら何も出来ない機械なのだが・・・。 > Windows機
    • good
    • 1
この回答へのお礼

仰るとおり、全て初耳です。

AT互換機という言葉以外は。

AT互換機はwikiで調べたことあります。

お礼日時:2020/11/11 11:21

うん, いろいろと確認をしないとダメだな.



「(上記の保護を考えて)なぜ、MS-DOSがwindowsAPIを経由せずにコンソールへの画面出力ができるのか」の「MS-DOS」って, なにのこと? そして, いつの時代の話をしている?

今「MS-DOS」って動いてるんだっけ? Microsoft 自体はもう出してないはずだし, 「最新」のやつであったとしても今の機械で動くような気がしないんだけど.
    • good
    • 2
この回答へのお礼

DOS-api int21については昨日初めて聞いたばかりです。

すいません、質問は、

「上記の保護を考えて、MS-DOS時代からアセンブラに引き継がれているapiであるint21は標準出力をする際にやはりwindowsAPIを呼び出すのか」

に変更するのが正しかったです。

「int21」はアセンブラでシステムコールを呼び出すものであると紹介されているので質問するまでもなさそうですが、詳しい方の承認があると嬉しいです。

ネットで「int21」を検索したときに「DOS-api」という言葉が出てきたので、また旧世代の遺産が例外的にwindowsに残されているのかと一瞬思いました。

失礼しました。

お礼日時:2020/11/11 13:36

すごい思い込みですね。

妄想力すごすぎます。
一度きれいさっぱり忘れて1から勉強した方が良いと思いますよ。
まだまだこういう妄想が盛沢山なのではありませんか?

>「C標準ライブラリを作った人」が直接ハードウェアである
>CPUとメモリを操作できてしまっていることになると
>思うのですがどうですか?

できますよ。

もともと OS はアプリケーションから直接やるには大変な処理を
サービスとして提供することから始まってます。
やがて、OSそのものや他のアプリに影響がでないように
そうしたアプリケーションの操作を隔離する
ハードとソフトの仕組みを持つようになったのが今の OSです。

OSはアプリケーションの動きを極力阻害せずに安全を
確保する形で発展してきたのです。メモリをAPI経由でしか
アクセスさせないのではなく
他のアプリのメモリがアプリから見え無くしたり、
安全にアクセスできない場所のメモリに触ろうとすると
ハードで検出してアプリが殺されるとか、そういう方向で
安全確保を行ってます。

アプリケーションをOSががちがちに統制したら
アプリが遅くなって、コンピュータが使い物にならないですよ。

>アセンブラで標準出力は可能だということなんですか。

これも、APIの呼び出しはアセンブラではできないという
思い込みではありませんか?

ひょっとするとできるかもしれませんが、アセンブラで一番
お手軽なのは、おそらく int21 システムコールを使った
コンソール出力なんじゃないかな。

パソコン創世記の頃からある API の一種です。
    • good
    • 1
この回答へのお礼

最近の回答に引き続きありがとうございます。

はい、CPUとメモリを直接操作できることは他の回答者様にも今回指摘されているように、直接操作できるものと理解しました。

ただ、私がそのようにハードウェアを直接操作できないと理解していたのは、他の回答者様へのお礼にも書いていますが、何年も前になりますが、他の質問アプリや本、ネットでそのように説明されていたからであり、私自身も質問アプリで何度も確認しました、のでそのことを疑うことはしませんでした。

彼らの説明する直接操作できないハードウェアにCPUとメモリが含まれていなかったんであろう事がこの質問ページにて明らかになりました。

また、int21によってアセンブラで出力できることは先程ネットを見ていて知りました、また調べておきます。

しかしそのMS-DOSがどのようにディスプレイにアクセスしているのか気になるところですね。

お礼日時:2020/11/10 14:38

「C標準ライブラリがwinAPIを経由しなくても実行できる」って, どういう意味で言ってる?



まず「C標準ライブラリ」というと, ふつうは ISO 9899 「プログラミング言語 C」に規定された「標準ライブラリ」を指す. つまり「標準ライブラリ関数の集合体」なわけだ. ところが, そういう解釈だと「それを実行する」が意味不明になる. 「図書館の本を読む」とはいうけど「図書館を読む」とはいわないでしょ?

「標準ライブラリ関数を実行する」なら意味は通じるんだが, そうだとしても
必ず API を経由しなければならない
なんてことはない. 例えば strchr なんか, わざわざ API を使うか?

ちなみにだが, 場合によっては「直接メモリを操作」できないと困ることもある. そうでないと
int x = 3;
もできないしそもそも API が呼び出せない.
    • good
    • 1
この回答へのお礼

わかりました。

昔聞いた「すべてのwindows上で動作するプログラムはwindowsAPIを経由して...」の「すべて」とは、CPUの操作、レジスタの操作、メモリ内の検索は含まれないということなんでしょうね。

アセンブラは実際直接操作しているではないか、となります。

事実、CPUの操作、レジスタの操作、メモリ内の検索がwindowsAPIを経由するなら、私が最近している質問の中に出てくる、「DLLを検索するインポートライブラリ」そのものを検索することができなくなってしまいます。

その辺を分かっていなかったと思います。

しかし、windowsAPIを経由しなければ、コンソールに文字1文字でさえも表示することができず、ディスプレイに点1点でさえも表示することはできないということは正しいということですよね。
なぜなら「ハードウェアは複雑怪奇であり、セキュリティ上の理由からハートウェアの直接の操作はwindowsによって禁止されているから」です。

ありがとうございました。

お礼日時:2020/11/10 11:54

Windows で動く GCC や Clang を作った人は「メーカーの人間」なのか?

    • good
    • 1
この回答へのお礼

回答ありがとうございます。

Unixの頃に作ったものがwindowsにも採用されることになった時に、その業績を評価されて特別にwindowsの設計図をmicrosoftから譲り受けて正式に"発注"を受けて開発したんだろうな、程度に思っていました。

お礼日時:2020/11/10 01:11

Visual StudioのCランタイムライブラリなら、インストールの仕方によってはソースコードが見られたはずです。


最新のでもソースコードをインストールできるかは確認していませんが。

fopen()なんかは内部でWindowsAPIのCreateFile()を呼んでいたりしますし、普通にWindowsAPIだって使いますよ。
BCCの方での実装がどうなっているかはわかりませんが、OSの上で動作する以上はOSのシステムコール(WindowsAPIとか)は利用するでしょう。
ランタイムライブラリの中ではアセンブラで実装されているものもあるかも知れませんけどね。
    • good
    • 1
この回答へのお礼

ありがとうございます。

はい、確かにC標準関数でもwindowsAPIが呼び出されていることは以前から確認していました。

そのことがwindows上で動作するプログラムは必ずwindowsAPIを経由するという資料を強化する大きな根拠となっていました。

お礼日時:2020/11/10 01:15

うーーーむ。



ぶっちゃけ、この質問見た回答者側って「え、何言ってんの?」って反応になってんじゃないか。全く意味が・・・分からない。と言って良いんじゃないか。

例えば

> 「C標準ライブラリを作った人」が直接ハードウェアであるCPUとメモリを操作できてしまっていることになると思う

なんでそーなるの?っつーか言ってる意味が分からない。
「C標準ライブラリを作る」のと「直接ハードウェアであるCPUとメモリを操作」するのと全く何の関係があるのだろうか、とか。
仮に直接ハードウェアを操作したとしても、一体何が悪いのだろうか、とか。
そもそもC標準ライブラリを作った、としても、バイナリになってるかどうか、仕様上は保障されてないんじゃないか。C標準ライブラリを単独で実行出来る前提なんだろうか。ええええ?
うーーーむ、分からん。

とにかく錯綜してるんですよね。結果「何が言いたいんだかサッパリ分からん」。

> C標準ライブラリがwinAPIを経由しなくても実行できるなら、

そもそも前提が分からない。
そんなにWinAPIって支配的なんだろうか。
そもそも「API」の意味が分かってない?
じゃなければ、質問じゃなくって「意味を成さない」単語の羅列を見せられてるんだろうか。

まずAPI(Application Program Interface)とは「あるプログラムを外部から利用する際使われるインターフェース」の事で、読んで字の如く全く支配的なニュアンスは含まれていない。
例えばTwitter社が提供してるAPIはTwitterクライアント、と呼ばれるソフトウェアを作る為に使われているが、別にインターネットを支配してるわけじゃない。「インターネットを利用する為に作ったソフトウェアをコンパイルする際にTwitter APIを必ず利用せねばならない」なんてルールは存在しない。あくまでTwitterと言う(サーバー)ソフトウェアを使う際に利用するAPIをTwitterが提供しているだけ、だ。APIは使用を強制するような性質のモノではない。
ただ、それはネットの話であるけど、別に特定のOS内での話でも変わらない。
WindowsのWinAPIはWindowsと言うソフトウェアの「特定の機能」を使いたい場合に呼び出す「インターフェース」であって、全ソフトウェアに支配的に「使え」と強制するようなモノではない。
むしろ「貴方が必要だと思ったから呼び出す」モノである。
ソフトウェアでも特にオペレーティングシステムの「機能」を呼び出すのを「システムコール」と言う。もちろん、コンパイラによって必要性に応じて「自動で呼び出す」場合もあるけど、基本的には貴方が呼び出すモノである。
しかもこの辺も「C言語仕様」とは全く関係がない。

> ハードウェアの直接の操作を禁じている対象は一般のプログラマ

どういう意味か、またちょっと分からんのだが、基本的に誰もハードウェアの直接の操作は禁じていない。
    • good
    • 2
この回答へのお礼

熱心な回答ありがとうございます。

なぜwindowsAPIが支配的だとイメージするようになったのかと思い出していました。

昔ネットや本、質問アプリで「windows上で動作するプログラムは全てWindowsAPIを経由して実行されている。なぜならハードウェアも複雑怪奇であり、windowsのセキュリティ上ハードウェアの直接の操作を禁じているからである」

というようなことを聞いていたからです。

実際に私のこの数日の質問履歴にも、windowsはハードウェアの直接の操作を禁じていると仰っている回答者様がいらっしゃいます。

そのことに対して私は「Linuxのようにオープンソースではないし、窓口を統一する方が分かりやすいな」と納得したものでした。

恐らくその前提が間違っているんですね。

またその前提から考えてみます。

お礼日時:2020/11/10 01:07

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!