2016-10-29 6 views
0

メッセージを何度も表示しようとしています。アセンブリ言語で何度もメッセージを表示する

私はNASMを使用して、私はこのプログラムを使用:

MOV cx, 1 
    mov ax, 10 
re: 
    CMP ax, cx 
    JS fin 
    mov dx, texte 
    INC cx 
    JMP re 
fin: 
    Int 21h 
    texte: db 'Hello, World !!' 
+0

どうしたのですか? (また、 'ax'を初期化しているようには見えません) – obe

+0

問題はコードにメッセージが表示されませんHello、World !! 10回 –

答えて

1

カップルより多くの事:ここに詳細情報を参照してください出力を実行するINT21Hため

  • を、あなたはすでにループの制限を格納するAXを使用している9にAHを設定する必要があります。他のレジスタ(BX、SI、DIは現在使用されていません)、またはハードコードされた制限を使用する必要があります。また、int21h関数9は、出力時にALの値を変更します。これは、AXを使用しない理由の1つです。
  • 文字列は$文字で終了する必要があります。これは、int21h/9が期待するものであり、一般的なアセンブリ言語の規約ではありません。
  • そして、obeが言ったように、 "jmp re"行の後ではなく、前のint 21hコマンドが必要です。
  • "fin"ラベルでは、プログラムを終了することができます。そのシーケンスは、 "mov ah、4ch/int 21h"です。
+0

または、1から10までループするために2つのレジスタを使用する代わりに、CXを10からカウントするか、10をCMPの即値オペランドとして指定します。 SIとDIも使用されていませんが、なぜIDXはBXに言及したのですか? –

+0

これを行う方法は数多くあります。 "LOOP re"コマンドがおそらく最も簡単です。 –

+0

[LOOPが遅い]を除いて(http://stackoverflow.com/questions/35742570/why-is-the-loop-instruction-slow-couldnt-intel-have-implemented-it-efficiently)、良い初心者を教える習慣。コンパイラの出力を見るときに実際のコードを見つけられないので、cmp/jcc(またはdec/jnz)でループを作成することもできます。 LOOPについて言及しないほうが簡単です。なぜなら、コードサイズの最適化以外では役に立たないからです。 –

2

現在、あなただけの下部にint 21hを呼び出します。 ループ内に移動してみます。

また、私は最後にアセンブリで何かをしてから本当に長い時間がかかっていますが、int 21hが何をするかを決定するためにいくつかのレジスタを準備する必要があるでしょう。 http://spike.scu.edu.au/~barry/interrupts.html#ah09

+0

私はそれを変更し、nasmコマンドを使用しましたが、メッセージは表示されません。 –

+1

あなたの質問のコードを変更しないでください。代わりに、下に更新されたコードを追加してください。 – fuz

関連する問題