鱼C论坛

 找回密码
 立即注册
查看: 2775|回复: 3

[技术交流] 从反汇编来看位域的原理

[复制链接]
发表于 2015-11-17 19:49:08 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

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
monitor.jpg

然后在看这个地址内存值是多少:0xcd   操蛋?  我改成0xff
ptradd.jpg

改成0xff
edittoff.jpg


看看反汇编代码如下:
 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中运用过多次。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-11-17 23:06:48 | 显示全部楼层
看着好厉害的样子
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-4-15 21:18:15 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-4-27 10:58:23 | 显示全部楼层
楼主这个好像没有什么
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-27 00:43

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表