2016-11-12 23 views
-1

私はこの行を変更すべきだと思う:ループを終了するために、そして私のプログラムは、512ループを終了するにはどうすればよいですか?

%include "io.inc" 
section .data 
    nr: db 0x88, 0x1 
section .text 
    global CMAIN 
    CMAIN: 
    for: 
     inc byte [nr] 
    jnc for 
     inc byte [nr + 1] 
     PRINT_UDEC 2, nr 
     xor eax, eax 
    ret 
+2

[INC](http://www.felixcloutier.com/x86/INC.html)命令の命令セットリファレンスを見ると、INCはキャリーフラグを変更してください。命令セット参照は_ ** CFフラグは影響を受けません**。結果に応じて、OF、SF、ZF、AF、PFフラグがセットされます。このため、_JNC_(ジャンプなし)を使用しているので、ループは終了しません。あなたは_JNC_の代わりに_JNZ_(ジャンプしないゼロ)をしたいでしょうか? –

+0

キャリーフラグを1つ増やしたい場合は、 'add byte [nr]、1 'のような[_ADD_](http://www.felixcloutier.com/x86/ADD.html)命令を使用できます。 –

+0

サイド注意。 _INC_を使用してこのコードの2つの可能な結果の1つがあります。ループが開始する前にキャリーフラグがクリアされていれば無限にループします(これはあなたが見ている可能性が高いです)。ループの前に設定された場合、649(0x200 + 0x89)を出力します –

答えて

1

nrは255のバイト限界に近づくと、INCが上回るだろうを印刷する必要があります

inc byte [nr] 

を255から0へのラップアラウンド

残念なことに、 は、CARRYフラグをオンに設定しませんラップアラウンドは、JNCの条件が常に満たされているため、無限ループを引き起こします。

それで一つの解決策は、?CARRYフラグを変更

add byte [nr], 1 

inc byte [nr] 

を変更することになります。その後、アルゴリズム全体が期待通りに成功するはずです。

+0

INCはキャリーフラグ(あなたはOPの質問の下で私のコメントを見ることができます) –

+0

@MichaelPetch:はい。私はその答えを書いている間にそれを疑ったが、それをチェックしなかった。私は私の答えを修正するつもりです。 – zx485

+1

nrが0FFh = 255になるまでOPを最初に伝えるので、答えはまだ不一致です.INRは255の8ビット限界を超え、?それを引き起こします._ –

0

と変更されていません。したがって、そのような場合:

%include "io.inc" 
section .text 
    global CMAIN 
    CMAIN: 
    mov eax,512 
    PRINT_UDEC 4,eax 
    ret ; and not caring to return 0 
+0

私はおそらく、彼らはおそらくタグを与えられたループを探していたと思う。 –

+0

@MichaelPetch確かに..しかしあなたの質問を適切に言い表すことは重要であり、このコードは(存在しない)ループも終了します。 QED – Ped7g

+0

確かに。しかし、私はコメントの前に質問の原因を調査しました。この[lab link](http://ocw.cs.pub.ro/courses/iocla/laboratoare/laborator-07)を見直し、_ [2p]を見てみると2.インクリメントフラグ_インテントが何であったか。この考え方は、オペランドを変更することなく、1行を変更してループを修正し、無限ループではなくなり、結果として512を出力します。 _JNZ_のようなものを使うと、そのトリックができます。私は質問がはるかに良い書き込むことができることに同意します。 –

関連する問題