Сборка нескольких условных переходов - PullRequest
0 голосов
/ 17 января 2011

Я не могу организовать переходы для следующего псевдокода (до сборки 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

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

Ответы [ 2 ]

0 голосов
/ 17 января 2011

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

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

0 голосов
/ 17 января 2011

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

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