装配检查数字是否均匀

时间:2018-03-05 18:02:26

标签: assembly x86

我有编写汇编代码的作业,用于检查数字是奇数还是偶数。我有这个代码

code_seg SEGMENT
    ASSUME cs:code_seg, ds:data_seg;

    mov ax, 11;
    test ax, 1;

end: jmp end;
code_seg ENDS

要检查数字是否均匀,我会查看是否设置了零标志。我知道测试指令就像逻辑AND一样,如果结果为0则设置为零标志。我的问题是:如何检查数字是奇数还是偶数?实际上我无法弄清楚为什么一些偶数(二进制)数和(逻辑和)1给出0的结果?

3 个答案:

答案 0 :(得分:5)

如果设置了最低位,则无符号和有符号数(Two's complement)都是奇数:

00000001 = 1    (odd)
11111111 = 255  (odd)
01111111 = 127  (odd) 
10000001 = -127 (odd)
11111111 = -1   (odd)

所以test instruction

test ax, 1

检查是否设置了最低位,如果是,则该数字为奇数 这可以使用Jcc instructions进行检查,尤其是那些使用

测试?ZERO标志的人
JNZ target    ; jump if odd  = lowest bit set
JZ  target    ; jump if even = lowest bit clear = zero

答案 1 :(得分:2)

(小)整数可以二进制表示为b3 b2 b1 b0

b3 * 2^3  +  b2 * 2^2  +  b1 * 2^1  +  b0 * 2^0 =
b3 *  8   +  b2 *  4   +  b1 *  2   +  b0 *  1

其中所有bn值均为零或一。

获得奇数的唯一方法是最低有效位(b0)是否为1。

将值加1(二进制,0001)除了最低有效位(b0)之外的所有位...

            b3  b2  b1  b0
binary-AND   0   0   0   1
            --  --  --  --
             0   0   0  b0

...如果最低有效位为零(偶数)则给出零值,或者如果最低有效位为1(奇数)则给出非零值(具体为1)。

答案 2 :(得分:-2)

遗憾的是,我对装配并不是很有经验,但在伪代码中有一个叫做" mod"给出了除法的余数。

看看这里:MapFlags

例如:

x = 3 z = x mod 2

z为1,如果x相等,则z为0