在用汇编写一个比较函数的时候,用到了xor指令
...
mov al,13
mov ah,13
xor al,ah
jne cmp_next_byte
为了确定xor的准确性,然后去问了文心一言
问:
mov al,未知mov ah,13xor al,ah请问al的初始值要为多少,经过xor位异或后al才能为0呢?
=====================================
答:
要使 xor al, ah 操作后 al 的结果为0,我们需要确保 al 的每一位都与 ah(在这个例子中是 13,二进制为 0000 1101)的对应位相反。 由于 ah 的高4位(第4位到第7位)都是0,这些位实际上对 al 和 ah 之间的异或结果没有影响,因为任何数与0异或都保持不变。但是,ah 的低4位(第0位到第3位)是 1101,所以 al 的这些对应位必须是 0010 才能使整个异或结果为0。 然而,由于我们只关心 al 和 ah 对应的位(即低8位),并且 ah 的高4位是0,所以 al 的高4位可以是任意的,只要低4位是 0010 即可。 因此,al 的初始值必须是一个以 0010 结尾的数。具体来说,任何形如 XXXX 0010 的二进制数(其中 XXXX 可以是任意的4位二进制数)都可以满足条件。 在十进制中,这样的数范围从 34(二进制 0010 0010)到 254(二进制 1111 1110,但注意最高位通常是符号位,在无符号上下文中才是 254),但实际上我们只关心低4位是 0010 的部分。 如果你想要一个具体的十进制值,那么任何以 34 开始并加上 16 的倍数的数都可以(因为每增加 16,就是在二进制中向左移动一位,而不会影响低4位),例如 34、50、66、82、98、114、130、146、162、178、194、210、226、242(但 242 与 13 异或的结果不是0,这里只是展示一个可能的范围)等,但注意这些值中只有 50(二进制 0011 0010)与 13(二进制 0000 1101)异或后会得到0(但实际上不是,这里是个错误,正确的应该是形如 XXXX 0010 的数,其中 XXXX 是任意的但使得整个数与 13 异或后为0的只有 0000 0010 即十进制的 2,但因为我们只改变了低4位,所以应该是任何以 0010 结尾且高4位与 13 异或后也为0的数,实际上这样的数只有 2,即 0000 0010)。 然而,真正的答案是:为了使 xor al, ah(其中 ah = 13)后 al 为0,al 的初始值必须是 2(二进制 0000 0010),因为只有这样,al 的每一位才能与 ah 的对应位完全相反。
=====================================
不应该是与自身位异或后才会是0吗,也就是al需要是13,ah也是13的情况下xor结果才会是0
|