私はこの数日間、私が取り組んできたこのアセンブリコードを持っています。それはAからJへの文字を印刷する条件を持っているが、各文字の間にアスタリスクを付けた宿題のためのものです。 出力:A * B * C * .... J *。アセンブリ内のCXカウンタのインクリメント(TASM)
追加する必要がある制限は、1つのデータコンテナdl
のみを使用できることです。さらに、ループとジャンプの条件のみを使用できます。
私はほとんど仕事を終えましたが、私のカウンターcx
が私のコード内でうまく増分していない理由を理解することに問題がありました。インクリメントが動作する場合、私はどうなると思いますが、すべての時間は、プロセスがcx
が増加していることを考えると、Xにジャンプして、ループyに渡されていること、それがループます
.model
.code
org 100h
s: mov ax, 3 ;
int 10h ; just clearing the screen
mov ah, 2
mov cx, 1 ; counter is just set to one for possible increment
mov dl, 'A' ; A is added to data container
int 21h ; prints out A
x: mov dl, '*' ; first asterisk is then added to container, replacing A
int 21h ; asterisk is printed out A*
mov dl, 'A' ; asterisk is replace by A in the counter
y: inc dl ;
loop y ; loops at y then increments container dl, A + 1-> B
int 21h ; prints out container, A*B
inc cx ; where the problem lies. Should increment but not
cmp dl, 'J' ; if the character in container is not above j, jumps to..
jna x ; ..where x is
int 20h ; ends but doesnt due to infinite looping, container not reaching 'J'
end s
とインクリメント:ここに私のコードですコンテナcx
が複数のインクリメントの後にどのくらい保持するかによって異なります。これは、コンテナが文字Jの上に到達する条件に達することにつながります。
これは私の問題です。私が得ることができるあらゆる助けのための事前にありがとう。
incの代わりにaddを使用している可能性があります。 add命令は、cx、1またはw.eを追加します。 – Jerinaw
私はタスクの記述を得ていません、それは "dl"の "制限"を意味しますか?あなたは 'cx'もデータに使用しています。そして、もしあなたがcharごとのストリーム出力をしているのであれば、 '' * ''値で 'dl'を破壊し、それを文字に戻す必要があるでしょうから、データ用に別のものを使う必要があります。だから、まさに限界は何ですか?メモリバッファはありませんか?スタックの使用はありませんか? 'dh'は使用できません。なぜ 'cx'できますか?ところで、あなたは 'int 21h'なしでVRAMに直接書くことができますか? :Dそれでは、それは簡単です:D(実際には、ptrを書き込むためにもっと多くのレジスタが必要です) – Ped7g
ああ、申し訳ありませんが、私は言いたいはずの制限はdlの値を保存できないと思います別の容器に移す。 '*'を追加してループやジャンプ条件を使って自分のやり方で復元することで破壊する必要があります。 – Emanhero