Операция XOR C ++ / Сборка - PullRequest
       23

Операция XOR C ++ / Сборка

0 голосов
/ 14 января 2019

Это код, который выполняет операции XOR. Код работает как 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 переменны.

1 Ответ

0 голосов
/ 14 января 2019

Когда вы используете побитовое И с 0xF1 для очистки некоторых битов x.BYTE, тогда ИЛИ в значении al, сдвинутом влево на 1, заполняемые биты - это первые три бита c, он же нижний клев x.BYTE. Это дает нам:

0001
 XOR
0011
----
0010

Имеет значение 2, объясняющее вывод. Что касается b, так как он занимает биты 1..4 из x.BYTE, и вы хотите, чтобы b имел нулевое значение, просто выполните побитовое И для этих битов:

 mov al, x.BYTE
 and al, 0x8F
...