2011-01-17 3 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 

У вас есть какие-либо идеи, как исправить этот код?

ответ

0

Одним из способов было бы сделать inc p прямо под cmp ah, 0 прыгать и только прыгать через него, если они не равны:

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

Технически, что вам не хватает прыжок до конца как раз перед лейбл eq. В настоящее время, если последняя итерация заканчивается на ветке ah! = 0, она провалится до метки eq, увеличьте si до 12 и вернитесь к метке again. Вы также можете перестроить код таким образом, чтобы перескочил только inc p, поэтому оба случая использовали бы то же самое сравнение si (аналогично вашему псевдокоду).

Обратите внимание, что если вы хотите только проверить четные/нечетные числа, просто тестирование самого младшего разряда является более простым способом.