马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
由于学习DSP经常用到位域,所以就研究了一下C语言是怎么实现位域的操作。
反汇编了一下居然是这酱紫~!
既然说位域的原理,当然你要知道位域是什么!
不知道的鱼油自行补习甲鱼的C课程,或者百度~~~!
我在VS2010中写了如下代码测试,然后进行反汇编。#include <stdio.h>
//建立位域类型, 类型重定义为BITS
typedef struct Bits
{
unsigned char bit0:1; //bit0位域名,占一个位
unsigned char bit1:1;
unsigned char bit2:1;
unsigned char bit3:1;
unsigned char bit4:1;
unsigned char bit5:1;
unsigned char bit6:1;
unsigned char bit7:1;
}BITS;
void main()
{
BITS myBit; //BITS位域变量
BITS *bitPtr = &myBit; //BITS位域指针
unsigned char *ptr;
ptr = (unsigned char *)bitPtr; //用unsigned char型指针指向位域
myBit.bit0 = 1;
myBit.bit1 = 1;
myBit.bit4 = 0;
myBit.bit7 = 1;
}
开始进行调试,反汇编:
先看看内存地址是多少:原来是0x0043FE27
然后在看这个地址内存值是多少:0xcd 操蛋? 我改成0xff
改成0xff
看看反汇编代码如下: myBit.bit0 = 1; //域赋值为1的时候
01012D0A mov al,byte ptr [myBit] //把这个数取到al
01012D0D or al,1 //其实这里就是位运算,相当于 al |= 0x01;第0位与成
01012D0F mov byte ptr [myBit],al //把运算后的数送回去
myBit.bit4 = 0; //赋值为0的时候
01012D1A mov al,byte ptr [myBit] //把这个数取到al
01012D1D and al,0EFh // al = al and 1110 1111 第四位与上一个0肯定就是0嘛,其它位是1,其它位不变
01012D1F mov byte ptr,al //把运算后的数送回去
OK 位域的原理相信大家都已经搞明白;
其实就是位运算,相信你已经在C中运用过多次。
|