5

私は自分の愚かさとの戦いに負けているようです。

このサイトでは、CP/M のさまざまなバージョンでのシステム コールについて説明しています。

ただし、呼び出し 2 (C_WRITE、コンソール出力) を使用しようとすると、何も起こりません。

次のコードがあります。

ORG 100h
LD E,'a'
LD C,2
CALL 5
CALL 0

ここで記憶から引用します。タイプミスがある場合は、ファイルがコンパイルされ、開始する COM ファイルがあったため、オリジナルには含まれていないので安心してください。

行の意味は次のとおりだと思います。

  1. これがアドレス 100h にロードされることを確認してください (0h から FFh までがゼロ ページです)。
  2. システムコール 2 の E レジスタに ASCII 'a' をロードします。
  3. システムコール 2 の C レジスタに整数 2 をロードします。
  4. システム コールを作成します (システム コールへの JMP はゼロ ページのアドレス 5 にあります)。
  5. プログラムを終了します (終了コマンドはゼロ ページのアドレス 0 にあります)。

プログラムは問題なく起動および終了します。最後のコマンドを削除すると、コンピューターがハングします (これも予想どおりで、CALL 0 が機能することを示しています)。

ただし、ASCII 文字は出力されません。(ただし、余分な新しい行が出力されますが、システムがそれを行った可能性があります。)

CP/M プログラムに、システム コールが行うべきことを実行させるにはどうすればよいですか? 私は何を間違っていますか?

更新: 問題は、私が試したすべてのアセンブラーが特定の形式のソース ファイルを想定していたことです。このファイルは、Microsoft のマクロ アセンブラで動作しました。

        .Z80
START:  LD      E,'a'
        LD      C,2
        CALL    5
        JP      0

asm.com (DR のアセンブラー) と m80.com (Microsoft のマクロ アセンブラー) は Intel 8080 ニーモニックを予期しており、明らかに異なる z80 ニーモニックを予期する必要があるときに通知する必要があると思います(私は推測しています)。

とにかく、asm.comを気にせずに画像自体を単に書くことを示唆しているので、それも正しいので、以下の答えを受け入れます。

4

1 に答える 1

3

明らかな可能性: あなたのアセンブラは 'a' を ASCII 文字ではなく 16 進数と見なしていますか? 0xa改行の ASCII です。'g' を試すか、アセンブラ出力の 16 進ダンプを調べてください。

それ以外はRST 0、数バイト節約できますが、コードは問題なく見えます。

編集:

私はあなたのコードを手作業で組み立てました:

1e 61
0e 02 
cd 05 00
cd 00 00

これを mytest.com としてディスクに保存しました。次に、この CP/M エミュレーターを起動しました (警告: これは直接ファイルをダウンロードするリンクです。エミュレーターは、Joan Riff の「Z80MU PROFESSIONAL」Z80 and CP/M 2.2 Emulatorというタイトルが付けられているようで、それ自体は 20 年以上前のものなので、そうではないようです。 DOSBox 内で DOS 用の Web ページを作成し、mytest.com を実行しました。文字「a」を出力しました。したがって、ツールチェーンまたは CP/M に問題があります。

それが実際に起こったので、写真:

ここに画像の説明を入力

于 2012-09-03T23:02:59.130 に答える