【发布时间】:2018-03-05 18:02:25
【问题描述】:
我有作业要编写汇编代码来检查数字是奇数还是偶数。我有这个代码
code_seg SEGMENT
ASSUME cs:code_seg, ds:data_seg;
mov ax, 11;
test ax, 1;
end: jmp end;
code_seg ENDS
为了检查数字是否为偶数,我查看是否设置了零标志。我知道测试指令就像逻辑与,如果结果为 0,它会设置零标志。我的问题是:如何检查数字是奇数还是偶数?其实我不明白为什么一些偶数(二进制)数和(逻辑与)1 给出的结果为 0?
【问题讨论】:
-
一个数字即使最低有效位为零。
0 & 1 = 0,1 & 1 = 1. -
我猜是x86-assembly?
test ax, 1是,正如您已经知道的那样,等于and ax, 1,但不会更改ax的值,只是标志。正如@Jester 所说:a 甚至是 ( a & 1 ) == 0。所以你现在要做的就是有条件的,例如jz isEven,jnz isNotEven,setz dx,你就完成了。你可以例如在命令行输出中打印 »number is even« 或 »number is not even«。 -
这不是 logical
andas&&在 C 中,而是 bitwiseandas&在 C 中。所以 @987654334当且仅当ax中的最低有效位设置为 1 时,@ 将是非零的。并且当解释为整数值的一部分时,将用作 2 的零次方,即 +1 到总整数值.它是唯一不能被二整除的(其他二的幂是)。请参阅 AJNeufeld 的答案,这是非常好的 IMO(除了关于&&与&的缺失部分)。