2016-04-27 9 views
0

アセンブリ内の2つの数値の合計を出力したいとします。コードを実行すると、コンパイラは次のメッセージを表示します。アセンブリ内の割り込みコードを修正します。

INT 21h、AH = 020h - まだサポートされていません。 は、サポートされている割り込みの一覧を参照してください。

私のコードにエラーが表示される理由を説明してください。どのような割り込みコードを使用すべきか私に言及してください。

.MODEL SMALL 
.STACK 100H 
.DATA 
A DW 5H 
B DW 2H 
SUM DW ? 
.CODE 
MAIN PROC 
MOV AX,@DATA 
MOV AX,A 
ADD AX,B 
MOV SUM,AX 
INT 21H 

MAIN ENDP 
END MAIN 
+2

EMU8086がまだやっていないことが多々あります。将来のリリースかもしれません。 –

+3

問題は、AHレジスタに使用するMS-DOSサービスの番号をロードせずにINT 21hを使用することです。そのため、使用するサービスを呼び出す代わりに、AHにある値に対応するサービスが呼び出されます。 –

+1

これは、使用しようとしている機能をサポートしていないエミュレータを使用しているためです。 –

答えて

4

MSDOS割り込みを呼び出す前に使用するMSDOS関数コードでAHをロードする必要があります。

例えば

、ASCII文字を印刷するには、

; assuming AL already contains ASCII character to print 
MOV AH, 07H 
INT 21H 

あなたがAHに有効な関数のコードをロードされていません。あなたのコンパイラが20Hを得た場所は困惑ですが、何もせずに@DATAをAXにロードしているので(DSの設定など)、起動時に正しいデータセグメントを指していないのだろうかと思います。

MSDOSは数値から文字列への変換を提供していないので、表示する場合は値を自分で変換する必要があることにも注意してください。文字列を出力する関数コードは、DS:SIが '$'で区切られた文字列(nullで終了していない!)を指している場合、AH = 09Hと考えられます。私は最初に確認することをお勧めします。

ベース16で印刷したい場合は、4桁の各セクションをその16進数の対応する印刷可能なASCII文字に変換してから、関数07Hを使用して文字を印刷できますが、最も重要な4ビットで、割り込みの呼び出しをセットアップするときに残りの値をゴミ箱にするので、各4ビット部分の合計から値をリロードする必要があります。

+0

セグメントの事には良い推測です。私は彼が決して 'mov ds、ax'をしなかったことを忘れてしまった。私は、5 + 2は 'AH = 0'を残すので、エラーメッセージを生成したものと一致しないコードを投稿しなければならないと考えていました。 –

関連する問題