assume cs:code, ds:data
data segment
array db 7, 1, 2, 3, 4, 5, 6, 7
l equ ($-array)
d1 db l dup(0) ;array even elements
; d2 db l dup(0) ; array uneven elements
data ends
code segment
start:
mov ax, data
mov ds, ax
mov si, offset array
mov di, 0
mov cl, 7
mov ch, 0
cld
build_array:
LODSB
or al, 0b ; trigger PF
JPE array_even ; if the number its even
array_even:
mov d1[di], al
inc di
loop build_array
mov ax, 4c00h
int 21h
code ends
end start
所以基本上我正在尝试创建d1和d2,它们是偶数和不均匀元素的数组。我的计划是先创建d1然后再创建d2。然而,我创建d1的尝试不起作用,我很确定如果我得到一些帮助,我可以自己做d2。 我很无能为力。
答案 0 :(得分:0)
有时你需要两次跳跃:一次是有条件的,一次是无条件的。
有时候,你可以让你的条件分支直接进入循环的顶部,允许另一个案例通过并完成循环的其余部分。但是,在您的情况下,您仍然需要检查循环条件,以免丢失源数组的计数。
条件分支转发,跳过您不想做的事情,是实施if
的最佳方式。
do {
int var = a[i];
if (! (var&1)) { // test reg, 1 / jz forwards
*(even++) = var;
}
} while(++i < n);
gcc -Og
on godbolt compiles a similar function to asm very similar to what you want。但它只使用-Og
,而不是-O2
,所以还有改进的余地。 -O3
展开整个循环。