Assembly 无法理解如何从ASM中的另一个数组中创建偶数数组

Assembly 无法理解如何从ASM中的另一个数组中创建偶数数组,assembly,x86,Assembly,X86,所以基本上我要创建d1和d2,它们是由偶数和非偶数元素组成的数组。我的计划是先创建d1,然后创建d2。然而,我创建d1的尝试没有成功,我很确定如果我得到一些帮助,我可以自己做d2。 我很笨。有时候你需要两次跳跃:一次是有条件的,一次是无条件的 有时,您可以让您的条件分支直接到达循环的顶部,允许另一个案例失败并完成循环的其余部分。但是,在您的情况下,仍然需要检查循环条件,以不丢失源数组的计数 有条件的前向分支,跳过您不想做的事情,是实现if的最佳方式 。但是它只使用了-Og,而不是-O2,所以还有

所以基本上我要创建d1和d2,它们是由偶数和非偶数元素组成的数组。我的计划是先创建d1,然后创建d2。然而,我创建d1的尝试没有成功,我很确定如果我得到一些帮助,我可以自己做d2。
我很笨。

有时候你需要两次跳跃:一次是有条件的,一次是无条件的

有时,您可以让您的条件分支直接到达循环的顶部,允许另一个案例失败并完成循环的其余部分。但是,在您的情况下,仍然需要检查循环条件,以不丢失源数组的计数

有条件的前向分支,跳过您不想做的事情,是实现if的最佳方式


。但是它只使用了-Og,而不是-O2,所以还有改进的余地-O3展开整个循环。

首先,奇偶校验不是您所想的,它不会告诉您数字是否为偶数,它会告诉您其中是否有偶数个1位。你想要测试al,1;jz偶数。谢谢你,我试着用你的建议编辑,在每次循环中它似乎都会增加di,而不仅仅是当数字是偶数时。它对JPE也做了同样的事情。我应该把array\u设置为偶数:out of the loop还是smh?当然可以,您的代码没有两个case,执行仍然会继续array\u偶数。你需要一个分支,它可以跳过商店,带着线圈走到生产线上。我明白了。这是有道理的,但怎么做呢?如果这听起来很愚蠢,我很抱歉,但我真的迷路了。
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
do {
    int var = a[i];
    if (! (var&1)) {  // test reg, 1 / jz forwards
      *(even++) = var;
    }
} while(++i < n);