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