XOR 运算 C++/汇编
XOR Operation C++/Assembly
这是一段进行异或运算的代码。
代码就像 x.bits.b = x.bits.c ^ x.bits.a
我想要的是:x.bits.c = x.bits.a ^ x.bits.b
我试图将所有 "cl" 值更改为 "bl" 但没有成功。
#include "stdafx.h"
int main()
{
typedef union {
unsigned char BYTE;
struct {
unsigned char a : 1;
unsigned char b : 3;
unsigned char c : 4;
}bits;
}un_X;
un_X x;
x.BYTE = 0xFE;
x.bits.a = 1;
x.bits.b = 0;
x.bits.c = 2;
printf("\n");
printf("BYTE = %X\n", x.BYTE);
printf(" a = %d\n", x.bits.a);
printf(" b = %d\n", x.bits.b);
printf(" c = %d\n", x.bits.c);
_asm {
//unsigned char a = x.BYTE & 0x01;
mov al, x.BYTE
and al, 0x01
// unsigned char c = (x.BYTE & 0xF0) >> 4;
mov cl, x.BYTE
and cl, 0xF0
shr cl, 4
//unsigned char b = c ^ a;
xor al, cl
// x.BYTE &= 0xF1; // 1111 0001
mov dl, x.BYTE
and dl, 0xF1
// x.BYTE |= (b << 1);
shl al, 1
or dl, al
mov x.BYTE, dl
}
printf("\n");
printf("BYTE = %X\n", x.BYTE);
printf(" a = %d\n", x.bits.a);
printf(" b = %d\n", x.bits.b);
printf(" c = %d\n", x.bits.c);
getchar();
return 0;
}
我希望 a 和 b 是常数,c 是变量。
当您使用按位与 0xF1
来清除 x.BYTE
的某些位时,然后在 al
的值中向左移动 1,得到填充的位是 c
的前三位,也就是 x.BYTE
的低半字节。这给了我们:
0001
XOR
0011
----
0010
其中值为 2,解释输出。至于 b
,因为它占用了 x.BYTE
的位 1..4,而您希望 b
的值为零,只需对这些位执行按位与:
mov al, x.BYTE
and al, 0x8F
这是一段进行异或运算的代码。 代码就像 x.bits.b = x.bits.c ^ x.bits.a 我想要的是:x.bits.c = x.bits.a ^ x.bits.b
我试图将所有 "cl" 值更改为 "bl" 但没有成功。
#include "stdafx.h"
int main()
{
typedef union {
unsigned char BYTE;
struct {
unsigned char a : 1;
unsigned char b : 3;
unsigned char c : 4;
}bits;
}un_X;
un_X x;
x.BYTE = 0xFE;
x.bits.a = 1;
x.bits.b = 0;
x.bits.c = 2;
printf("\n");
printf("BYTE = %X\n", x.BYTE);
printf(" a = %d\n", x.bits.a);
printf(" b = %d\n", x.bits.b);
printf(" c = %d\n", x.bits.c);
_asm {
//unsigned char a = x.BYTE & 0x01;
mov al, x.BYTE
and al, 0x01
// unsigned char c = (x.BYTE & 0xF0) >> 4;
mov cl, x.BYTE
and cl, 0xF0
shr cl, 4
//unsigned char b = c ^ a;
xor al, cl
// x.BYTE &= 0xF1; // 1111 0001
mov dl, x.BYTE
and dl, 0xF1
// x.BYTE |= (b << 1);
shl al, 1
or dl, al
mov x.BYTE, dl
}
printf("\n");
printf("BYTE = %X\n", x.BYTE);
printf(" a = %d\n", x.bits.a);
printf(" b = %d\n", x.bits.b);
printf(" c = %d\n", x.bits.c);
getchar();
return 0;
}
我希望 a 和 b 是常数,c 是变量。
当您使用按位与 0xF1
来清除 x.BYTE
的某些位时,然后在 al
的值中向左移动 1,得到填充的位是 c
的前三位,也就是 x.BYTE
的低半字节。这给了我们:
0001
XOR
0011
----
0010
其中值为 2,解释输出。至于 b
,因为它占用了 x.BYTE
的位 1..4,而您希望 b
的值为零,只需对这些位执行按位与:
mov al, x.BYTE
and al, 0x8F