0

我无法为以下伪代码组织跳转(到 Assembly 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

您对如何修复此代码有任何想法吗?

4

2 回答 2

0

一种方法是inc p在跳跃下方做正确的cmp ah, 0动作,并且只有在它们不相等时才跳过它:

...
cmp ah, 0
jne noteq
inc p
noteq:
inc si
cmp si, 11
jne again
于 2011-01-17T19:12:17.877 回答
0

从技术上讲,您缺少的是在eq标签之前跳转到末尾。目前,如果最后一次迭代在ah!=0 分支中结束,它将落到eq标签,增加到si12 并跳回again标签。您还可以重新组织代码,以便仅inc p跳过 ,因此两种情况都将使用相同的si比较(类似于您的伪代码)。

请注意,如果您只想检查偶数/奇数,则仅测试最低位是一种更简单的方法。

于 2011-01-17T19:13:48.470 回答