异或操作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 = %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
相关文章:
- 组装指令中乘法的下部和上部是什么
- COUT 无法提供输出可能是由于内联组装
- 如何在C++中在线组装?
- 为什么GCC在我的机器上创建额外的组装说明?
- 虚拟继承构造函数的组装
- 无法加载文件或组装.即使它在适当的位置并可以很好地建造
- 网站组装 |错误:'C/ObjC'不允许使用无效'-std=c++11'参数
- ICC 中的 -O3 会弄乱内联函数,使用 -O1 或 -O2 或相应的手动组装
- Howo 使用 cl 预处理为 masm 组装生成一个单独的文件
- 使用不同的整数组装字符数组以类似于日期和时间
- 在C++模块化编程中,如何组装.cpp和.h文件
- 组装的C 似乎包含多余的说明
- 如何在64位QT应用中使用32位组装功能
- 组合两个用不同高级语言编程的 Web 组装组件
- C#COM组装实现C 接口
- C :重新组装4个字节的浮子
- 我可以在外部组装(function.asm)中制作C 方法吗?
- 3d C 阵列到组装
- 异或操作C++/组装
- 新运营商在组装中返回什么