3

A86 を使用して 8086 用のコードを組み立てようとしています。問題を 4 行のコードに絞り込みました。

MOV BX, testz
ADD AL, [testz]

INT 20h
testz:
~     ^
#ERROR 16: Definition Conflicts With Forward Reference                    @@@@#
db ?

このコードのどこが間違っていると思いますか? アドレス自体を BX レジスタに移動し、testz アドレスのバイト値を AL に追加しています。

より大きなプログラムでは、#ERROR 13: Byte/Word Combination Not Allowed.

しかし、はバイトlabelの単語です。[label]コンパイラがそれらを区別できないのはなぜですか?

ADD BL, [second]
MOV BX, second
~             ^
#ERROR 13: Byte/Word Combination Not Allowed   
second:
~      ^
#ERROR 16: Definition Conflicts With Forward Reference                    @@@@#
db ?

バイト/ワードの競合が見られないためです。


私のコンパイラはオフセット testz と testz を同等に解釈します。バイトコードを調べましたが、違いはわかりませんでした。

MOV BX, testz
ADD AL, [BX]

上記のコードは機能しますが、これを 1 行で実行できる他の方法はありますか?

ADD AL, [testz]

[] にラベル名を入れると、コンパイラ a86 では受け入れられません。しかし、私はそれらが言語で許可されていると感じています。

4

3 に答える 3

5

私はあなたがしたいと思いMOV BX, offset testzます。あなたのアセンブラは と を同じ意味に解釈[testz]testzているようです。

代わりに、概念的に同等のものを試すことでこれを確認できますLEA BX, testz

編集: ( http://www.csn.ul.ie/~darkstar/assemblyr/manual/a14.txtから):

ERROR 16: Definition Conflicts With Forward Reference

   This error occurs when the assembler has previously guessed
   the type of a forward-referenced symbol in order to determine
   what kind of instruction to generate, and the guess turned out
   to be wrong.  The error is reported at the time the symbol is
   defined.  For example, when A86 sees MOV AX,FOO, it will
   assume FOO is an immediate value.  This error is reported if
   FOO turns out to be a word variable: FOO DW 0.  You need to
   search backwards from the error message, to references of FOO,
   and specify the type you intend to be used: MOV AX,FOO W.  If
   you really did intend to load the offset of FOO and not the
   memory contents, you can code MOV AX,OFFSET FOO to make the
   error message go away.
于 2012-06-08T01:53:43.573 に答える
1

DOS マニュアルは、次のようなハンドラーのポインターを指示します。

mov ax, word ptr es:[bx],BBBB

BBBBの拠点へ

また、セグメントのベースへの参照です-cxを押した後も同じです[私は思います-覚えていません]

BBBBがセグメントのSSSSであることを除いて、上記と同じです

クラッシュが原因でマウスが機能を停止したときにハンドラーを作成し、この単語 ptr を単語の代わりにバイトとして使用しましたが、実際の単語ポインターを作成したことはなく、「単語 ptr」 16 進数へのバイトの後方バイナリ変換と共にプログラムします [A6 後方は 65 です]。

また、INT呼び出しを行うためにDOS amnualで見つけたエラーです[デバッグアセンブリまたはint ##を呼び出してアセンブリをプログラムする場合とは異なりますが、実際には8080への直接呼び出しを行います。これの事実は、そうではないということです割り込み呼び出しですが、IRQ 呼び出しです。命令コードが正しくありません。具体的にはプレゼンテーションです。また、Intel es:[bx] は機能しません。es[bx] を使用する必要があります。

また、ine xtension-wheres my head at---あなたの質問に答えるために、8ビットレジスタを参照し、次に16ビットレジスタを参照しています-これに対して、ADD blを指示し、追加オペランドの後にbxを変更します.これはあなたのエラー#13。

あなたがしなければならないことは、事前に bl が BX と互換性があることを保証することです。そうしないと、基本的にこれが何であるかの前方参照エラーが発生します。ページテーブルまたは参照テーブルを変更するための参照が間にある sti と cli で一時停止できる IRQ 要求として実行されない限り、完全に完了します。

于 2014-12-17T18:13:21.063 に答える