装配检查数字是否均匀

问题描述 投票:2回答:3

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

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的结果?

assembly x86
3个回答
4
投票

如果设置了最低位,则无符号和有符号数(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

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
投票

遗憾的是,我对组装不是很有经验,但在伪代码中有一个叫做“mod”的功能,它给出了一个除法的余数。

看看这里:Assembly Language - How to Do Modulo?

例如:

x = 3 z = x mod 2

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

© www.soinside.com 2019 - 2024. All rights reserved.