問題タブ [watcom]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c - OpenWatcom を使用した C のバイナリー・シンプル・リアルモード OS へのコンパイルとリンク
アセンブリで記述された単純な (非常に単純な) リアル モード カーネルがあり、できる限り C に移植しようとしています。そのために、16 ビットのバイナリ コードに OpenWatcom コンパイラを使用しています。
私のファイル「os.c」で、この行を書き留めると動作します:
char msg[50];
しかし、私がこれを行うと:
char msg[50] = "hello";
うまくいきません。文字列を書くたびに、壊れてしまいます。私はいたるところを検索し、ナンセンスなことをたくさん試しましたが、何もしませんでした。
誰かがそれが何であるかの手がかりを持っていますか?
2 つ以上のリンクを投稿することはできないため、必要な 4 つのリンクはすべて Pastebin にあります。前もって感謝します。
c - メモリ アドレスを持つ配列を作成するときのエラー
次のように行列宣言を実装しています。
これらはすべてグローバル変数です。このコードは正常にコンパイルされます。
基本的に、「ポインター」は、変数のアドレスと、それが保持することになっている最大値を保持します。
私の問題は、uint64_t として定義された新しい変数をこの行列に追加する必要があることです。私のプラットフォームのポインターのサイズは 32 ビットですが、変数のサイズのため、「ポインター」を uint64_t に変更する必要があります。しかし、私がするとき:
次のエラーが表示されます。
「ポインター」タイプを単に変更すると、このエラーが発生するのはなぜですか?
コンパイラとしてwatcom 1.3を使用しています。GccとVisual Studioは、このコードをうまくコンパイルしました。
c - WatCom を使用して宣言されたセグメント オフセットで RAW BIN を生成する方法
NASM にブートローダーを書きました。これは、64kb のプログラム データをディスクからメモリにロードし、アドレス 0060:0000 [SEG:OFF] で開始します。私は自分のプロジェクトのこの部分をアセンブリでコードを書く (NASM) ことでテストし、それをディスクに入れました。正常に動作します!
完全なプロジェクトは、アセンブリで完全に記述するには少し複雑です。そこで、インライン アセンブリで C を使用することにしました。このために、open-watcom-c-win32-1.9 という名前の環境をダウンロードします。 RAW BIN ファイルを作成するためのいくつかの WatCom コンパイラとリンカー ディレクティブをテストするための単純な C コードがあります。bin ファイルは生成されますが、ブート ローダーがメモリにロードした後は実行されません。セグメント値とオフセット値を設定するために多くの wlink ディレクティブを試しましたが、うまくいきません。
問題は、コードの生成中にコンパイラとリンカが間違ったセグメントとオフセット アドレスを使用することだと思います。いずれにせよ、Wlink は次のエラーをドロップするためです。
警告!W1023 開始アドレスが見つかりません。0000:0000 を使用しています
セグメントオフセットアドレスを正しく設定する方法はわかりませんが、作業プログラムには必要です。セグメント : オフセットが宣言された C ソース コードから 16 ビット リアル モードの RAW BIN ファイルを生成するために使用する WatCom ディレクティブの種類について質問があります。WatComで可能ですか、それとも他のものを使用する必要がありますか?
c - GAS アセンブリをアセンブルして Open Watcom C ライブラリとリンクするにはどうすればよいですか?
16 ビットの DOS 実行可能ファイルを生成しようとしていますが、gcc コンパイラを使用しています。そのため、古い gcc-4.3 ia16 ポートを使用しています。ビルドの Docker イメージを作成しました: https://registry.hub.docker.com/u/ysangkok/ia16-gcc-rask
これが私が試みていることです:
gcc は OpenWatcom の libc ヘッダーを使用できないため、ヘッダーは含めません。
16 ビットの binutils が利用できないため、リンクしません。オブジェクト ファイルをビルドすると、16 ビットとして正しくマークされません。
今、私はこのアセンブリファイルを持っています:
コンテナーの外側のホストで、yasm を使用して組み立てようとします。
yasm が理解できないので、構文行をコメントアウトして、再試行すると、今度は成功します。
再配置シンボルをテストします。
悲しいことに、それらは 32 ビットです。とにかくコンテナでリンクしようとすると、うまくいきません:
ELF の代わりに COFF を作ろうとすると、yasm はアセンブルさえできません:
yasm が 16 ビットをサポートしていないことは知っていますが、回避策はありますか? GAS 互換の 16 ビット アセンブラはありますか? GAS から Intel へのコンバーターが機能していません。
c - Watcom Inline アセンブリ SEG および OFFSET 演算子を開く
今日、MASM の SEG 演算子はデフォルトで問題の式の SEGMENT のアドレスではなく GROUP のアドレスを返し、それをオーバーライドするオプションとメソッドがあることを知りました。
私は現在、Open Watcom 1.9 / 16 ビット DOS で C とアセンブリ (インラインおよびスタンドアロン) が混在する複雑なプロジェクトを行っているため (実際には、DOS は起動時にのみ必要であり、その後は自分の MINI-OS が制御します)。 WASM はある程度 MASM と互換性があることを知っていますが、次の質問があります。
インライン アセンブリを実行して変数のセグメントを取得する場合、SEG 演算子は変数が含まれる GROUP または SEGMENT を返しますか?
MY_GROUP という名前の GROUP、MY_GROUP に属する MY_SEG という名前の SEGMENT、および MY_SEG に配置される MY_VAR という名前の変数/ラベルがあるとします。
その後、私が行う場合
どの値が AX にロードされますか? MY_GROUP のアドレスですか、それとも MY_SEG のアドレスですか (それらが異なる場合)。
インラインアセンブリの問題に関連するコマンド ライン スイッチは見つかりませんでした。次に、MASM 構文を試しました。
上記の両方の行により、「セグメントまたはグループ ラベルのみが許可されています」というエラーが発生します。
私の問題はインライン アセンブリにのみ関連することに注意してください。実際、私はスタンドアロン アセンブリ モジュールに JWASM を使用しています。上記の構文はうまく機能し、期待どおりの結果が得られます。
この状況でインラインアセンブラが何をするのか、また、それぞれの動作を制御する方法があれば誰か教えてもらえますか?
どうもありがとうございました!
compilation - インテル® Visual Fortran で直接アクセス I/O が正しく動作しない理由
このプログラム
Visual Fortran では正しく動作しません (正しくありません):
WATCOM での結果 (正しい):
なんで?