2016-09-06 11 views
0

私はアセンブリが初めてであるため、それについて詳しくは分かりません。私はMASM611とDosBox 0.74を使用しています。現在、私は別のラベルから以前のラベルに戻る必要があるコードを書いています。私は 'ret'の構文についてもわからない。また、デバッグ中に 'ret'に問題が発生します。私は私のプログラムは、それが「ループ」に跳ね上がったところからLABEL1に戻ってそのポイントに行きたい返信中の構文の問題

label1: 
cmp bl,bh 
je loop 
jmp display 

loop: 
inc count 
ret 

コードは次のようなものです。基本的に、コードはアルファベットを要求し、アルファベットを与えると、プログラムは永遠のループに入ります(おそらく、うまくいきません)。デバッグ後は、 'ret'までは正常に動作しますが、トラックや何かが失われます。

+0

問題について具体的に説明する必要があります(たとえば、問題が発生した場合はエラーですか?はいの場合はどうなりますか?(メッセージなど))。 'ret'が実行されたときに、正確に何が起こると思いますか? – UnholySheep

+0

私は編集しました:) – chillax

+0

'ret'は、関数を呼び出した次の命令で実行を再開します。 –

答えて

3

ジャンプのある場所の後に戻るために、retをジャンプと組み合わせて使用​​することはできません。理由は、ジャンプ命令はスタックに戻りアドレスを格納しないため、retが動作するために必要です。

どちらの別のジャンプを使用します。

je loop 
back:    -- see jmp below which jumps back here 
    jmp display 

loop: 
    inc count 
    jmp back 

それともcall指示使用してサブプログラムを呼び出す:より複雑な構文を宣言するために、特定のアセンブラで必要とすることができることを

jne no_call  -- skip the call if condition is not met 
    call subprog 
no_call:    -- 'ret' will return back here, as well as the jne above 
    jmp display 

subprog: 
    inc count 
    ret 

は注意をサブプログラム。

2

JCC/JMPは返信先アドレスをRETにプッシュしません。 Ondrejが説明するように、あなたはそれを呼び出す必要があります。

の分岐この混乱を解くために、より効率的な方法(とNO条件付きCALL命令はありません):初心者のコードは、道より多くの命令や枝それが必要以上を持っているため

label1:  ;; jump to display after count += (bl == bh) 
    cmp bl,bh 
    jne display  ; jump straight there if there's no need to increment 
    inc count   ; preferably keep this in a register; Try to avoid memory for things you modify in a loop. 
    jmp display 

それは普通のことです。より速く実行する以外に、分岐を簡素化することは、通常、人間にとって理解しやすく、読みやすく、従うことを容​​易にします。これは間違いなく良いことです。