沉思的牛 发表于 2015-11-17 19:49:08

从反汇编来看位域的原理

由于学习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中运用过多次。

喝汽水的狸猫 发表于 2015-11-17 23:06:48

看着好厉害的样子{:7_126:}

我爱软件开发 发表于 2016-4-15 21:18:15

{:10_261:}

hiwch 发表于 2016-4-27 10:58:23

楼主这个好像没有什么
页: [1]
查看完整版本: 从反汇编来看位域的原理