2011-01-17 13 views
0

私は(アセンブリ8086に)以下の擬似コードのジャンプを整理することはできませんが:総会複数の条件ジャンプ

array = ...numbers set... 
cl = 2 
num = 0 
si = 0 
while(si != 11) 
{ 
    ax = 0 
    al = array[si] 

    // divide with assembly 
    div cl 
    if(ah = 0) 
    { 
     n+1 
    } 
    si+1 
} 

私はそのようなものを試してみた:

.data 
array db 0Fh, 45h, 0A1h, 78h, 0CFh, 0AAh, 8Fh, 19h ; Array 
p db 0 ; Number of even numbers in the array 
.code 
xor si, si 
xor cx, cx 
mov cl, 2 
again: 
xor ax, ax 
mov al, array[si] 
div cl 
cmp ah, 0 
je eq 
inc si 
cmp si, 11 
jne again 
eq: 
inc p 
inc si 
cmp si, 11 
jne again 

はあなたがいずれかを持っていますかどのようにこのコードを修正するアイデア?

... 
cmp ah, 0 
jne noteq 
inc p 
noteq: 
inc si 
cmp si, 11 
jne again 

答えて

0

一つの方法は、右cmp ah, 0ジャンプ下inc pを行うと、彼らは同じじゃない場合にのみ、それを飛び越えることであろうeqラベル。現在、最後の反復がah!= 0ブランチで終了する場合は、eqラベルになり、siを12に増やしてagainラベルに戻ります。 inc pだけが飛び越されるようにコードを再編成することもできます。したがって、どちらのケースも同じsiの比較(擬似コードに似ています)を使用します。

偶数/奇数のみをチェックしたい場合は、最下位ビットをテストするほうが簡単です。

0

技術的には、何が欠けていることがちょうど前に最後にジャンプです: