从反汇编来看位域的原理
由于学习DSP经常用到位域,所以就研究了一下C语言是怎么实现位域的操作。反汇编了一下居然是这酱紫~!{:7_137:}
既然说位域的原理,当然你要知道位域是什么!{:7_114:}
不知道的鱼油自行补习甲鱼的C课程,或者百度~~~!{:9_231:}
我在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的时候
01012D0Amoval,byte ptr //把这个数取到al
01012D0Dor al,1 //其实这里就是位运算,相当于 al |= 0x01;第0位与成
01012D0Fmovbyte ptr ,al //把运算后的数送回去
myBit.bit4 = 0; //赋值为0的时候
01012D1Amoval,byte ptr //把这个数取到al
01012D1Dandal,0EFh //al = al and 1110 1111 第四位与上一个0肯定就是0嘛,其它位是1,其它位不变
01012D1Fmovbyte ptr,al //把运算后的数送回去OK 位域的原理相信大家都已经搞明白;
其实就是位运算,相信你已经在C中运用过多次。
看着好厉害的样子{:7_126:} {:10_261:} 楼主这个好像没有什么
页:
[1]