装配检查数字是否均匀
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了装配检查数字是否均匀相关的知识,希望对你有一定的参考价值。
我有编写汇编代码的功课,用于检查数字是奇数还是偶数。我有这个代码
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的结果?
答案
如果设置了最低位,则无符号和有符号数(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
另一答案
(小)整数可以二进制表示为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)。
另一答案
遗憾的是,我对组装不是很有经验,但在伪代码中有一个叫做“mod”的功能,它给出了一个除法的余数。
看看这里:Assembly Language - How to Do Modulo?
例如:
x = 3
z = x mod 2
z为1,如果x相等,则z为0
以上是关于装配检查数字是否均匀的主要内容,如果未能解决你的问题,请参考以下文章