-1

IPレジスタの内容を印刷する必要があります。(a86)。

私は割り込みハンドラを持っています:

int11:
call ipp
iret

そして手続き ipp:

ipp:
pop dx
print dx
ret

そして関数印刷:

print macro
push ax,dx
lea dx, #1
mov ah,9
int 021 
pop dx,ax

しかし、それは多くの奇妙な記号を出力します:)

何が悪いのか教えてください。

PS アセンブラに関する私の知識は非常に貧弱です。

4

2 に答える 2

2

バイナリ値をテキストに変換する必要があります。'$' で終わる文字列でなければなりません。そして、その文字列のアドレスを dx にロードします。

また、ds が正しい値を保持していることを確認する必要があります。

見てください:http://www.delorie.com/djgpp/doc/rbinter/id/73/25.html

于 2012-05-27T19:18:41.537 に答える
1

複数の問題があります。

ここ

ipp:
pop dx
print dx
ret

でスタックから戻りアドレスを削除しますpop dxret返信アドレスを盗んだ後、どこに戻ってくると思いますか? アドレスをスタックに戻さないのはなぜですか?

また、同じことで、ISR によって中断されるプログラムpop dxのレジスタ値が破損します。ISRにdxセーブ&リストアしてみませんか?dx

さらに別のもの...私はあなたのアセンブラを知りませんが、この行

lea dx, #1

奇妙に見えます。マクロのこの行を呼び出すprint dxと、IMO は次のように変換されます。

lea dx, dx

これは無効な x86 命令です。あなたのコードはまったくコンパイルされますか??? もしそうなら、あなたのアセンブラは何をしますlea dx, dxか? それを作成しますmov dx, dxか、nopそれとも削除/無視しますか?

さらに、int 21h の関数 9 は、"$" で終わるアドレスを持つ ASCII 文字列を表示ds:dxし、コード内でそのような文字列を作成しません。

あなたのコードは決してセットアップせず、中断されたプログラムにたまたまある値dsを使用するだけです。これは悪いことです。ds使用する場合は、保存して復元する必要がありdsます。また、ISR のデータが ISR のコード セグメントに含まれる場合dsは、 の値をロードする必要がありますcs

そして、beforedxのオフセットがあります。の値を印刷してもよろしいですか? いつ、どこでの値を知りたいですか?iretprint dxipip

最後に、なぜこれらすべてに対して ISR を用意しているのですか?

ippまずはISRなしで作品を作ってみませんか?なぜデバッガを使わないのですか?

于 2012-05-29T19:16:25.803 に答える