我有编写汇编代码的作业,用于检查数字是奇数还是偶数。我有这个代码
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的结果?
答案 0 :(得分:5)
如果设置了最低位,则无符号和有符号数(Two's complement)都是奇数:
00000001 = 1 (odd)
11111111 = 255 (odd)
01111111 = 127 (odd)
10000001 = -127 (odd)
11111111 = -1 (odd)
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