异或操作C++/组装

XOR Operation C++/Assembly

本文关键字:组装 C++ 操作      更新时间:2023-10-16

这是一个执行异或操作的代码。代码的作用类似于 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 = %Xn", x.BYTE);
printf("   a = %dn", x.bits.a);
printf("   b = %dn", x.bits.b);
printf("   c = %dn", 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 = %Xn", x.BYTE);
printf("   a = %dn", x.bits.a);
printf("   b = %dn", x.bits.b);
printf("   c = %dn", x.bits.c);
getchar();
return 0;
}

我希望 a 和 b 是常数,c 是可变的。

当你使用带有0xF1的按位 AND 清除一些x.BYTE位时,然后在 al 的值中 OR 向左移动 1,填充的位是c的前三位,也就是x.BYTE的下半字节。这为我们提供了:

0001
 XOR
0011
----
0010

其值为 2,解释输出。至于b,因为它占用了x.BYTE的 1..4 位,并且您希望b的值为零,只需对这些位执行按位 AND 操作:

 mov al, x.BYTE
 and al, 0x8F