我无法组织以下伪代码的跳转(到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
您对如何修复此代码有任何想法吗?
答案 0 :(得分:0)
一种方法是在inc p
跳跃下执行cmp ah, 0
,如果它们不相等则只跳过它:
...
cmp ah, 0
jne noteq
inc p
noteq:
inc si
cmp si, 11
jne again
答案 1 :(得分:0)
从技术上讲,你所缺少的是在eq
标签之前跳到最后。目前,如果最后一次迭代在ah
!= 0分支中结束,它将落到eq
标签,将si
增加到12并跳回again
标签。您还可以重新组织代码,以便只跳过inc p
,因此两种情况都会使用相同的si
比较(类似于您的伪代码)。
注意,如果你只想检查偶数/奇数,只测试最低位是一种更简单的方法。