无法弄清楚如何在ASM中从另一个数组中创建偶数数组

时间:2015-11-15 16:48:17

标签: assembly x86

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。 我很无能为力。

1 个答案:

答案 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展开整个循环。