结构体位操作--反汇编(一)

结构体位操作--反汇编(二) 有了第一篇文章的基础,现在我们来分析一个问题:假设某个FPGA的32位寄存器,我们打算用第一篇文章那样的结构体位域的形式来实现对该寄存器的读写。跟第一篇的内容类似,基本上就是结构体的声明不同,当在我们自己的PC机上测试,编译,执行,结果都没有问题。但是在FPGA上放起来时,却发现结果总是不正确。因为要用该结构体来访问寄存器,下面假定FPGA的32位寄存器地址是宏FPGA_REG_ADDR代表的地址 阅读详情

先看下面的代码:

 

假定文件名叫test_struct_bitw.c,使用如下命令:

#gcc -o test_struct_bitw test_struct_bitw.c -g
#objdump -d test_struct_bitw > 1.txt

 反汇编生成如下内容(1.txt为了方便阅读,去掉了很多与本文不相关的内容):

 

这里我们只关心 aa.reserved1= 1; 这句对应的汇编代码,要用到addr2line。我们从反汇编的内容中可以找到 08048324  <main>: 这句,也就是C代码里main函数入口。凭直觉,可能是 804833c这行,使用命令#addr2line -e test_struct_bitw  0x804833c ,输出结果是test_struct_bitw.c:28。显然,我们找到的这句汇编指令就是对应C代码中的28行 aa.reserved1= 1; ,但是不只这一句。同样使用命令#addr2line -e test_struct_bitw  0x8048343 ,#addr2line -e test_struct_bitw  0x8048346 ,输出结果都是test_struct_bitw.c:28,也就是说 aa.reserved1= 1; 这句C代码对应的汇编代码是三句,即:

结合之前的两行代码:

8048332:       c7 05 34 95 04 08 00    movl   $0xffffffff,    0x8049534   

8048339:       00 00 00 

不难看出,就是从0x8049535处取了一个字节(原因是成员reserved1是整个32位成员中的第二个字节,所以地址要从0x8049535开始,同理若是aa.fpga_en= 1;则就应该从0x8049534 处取了),然后进行按位或操作,最后在把位操作后的结果写回到0x8049535地址中去。这里的关键在于要理解  804833c:   0f b6 05 35 95 04 08    movzbl 0x8049535, %eax 这句汇编代码,意思是从0x8049535的内存空间中取一个字节,其余位填0,32位的数据放到eax寄存器中。

操作步骤示意图如下:

 

 

 

IAR与Keil的SFR位操作语法差异与转换方法 在嵌入式C语言开发中,特殊功能寄存器(SFR)的位操作是基础且频繁的操作。不同编译器如IAR和Keil对SFR位操作的语法实现各有不同,这给开发者切换开发环境带来了困扰。IAR采用PORT.BIT语法,直观易用;而Keil C51则使用sfr和sbit关键字,更接近硬件。理解这些差异有助于代码移植和调试。本文详细解析了IAR和Keil的位操作语法差异,并提供了从IAR到Keil的代码转换实战方法,帮助开发者高效应对不同编译环境下的位操作需求。 阅读详情

相关推荐

STM8 GPIO位操作优化:通过修改头文件实现高效寄存器访问

在嵌入式系统开发中,GPIO(通用输入输出)是连接微控制器与外部世界的基础接口,其操作效率直接影响系统性能。传统库函数调用虽然可读性好,但在频繁操作场景下存在开销问题,而直接寄存器操作又降低了代码可维护性。通过C语言的结构体位域和联合体特性,可以实现一种零成本抽象层,将硬件寄存器映射为可直接访问的位成员,在编译后生成高效的位操作指令。这种技术方案在实时性要求高的嵌入式场景中价值显著,既能保持底层硬件操作的性能,又能提升代码的清晰度和安全性。本文以STM8系列MCU为例,深入解析如何通过修改官方头文件stm8

weixin_30785593的博客 521

C语言反汇编_数组和结构体

C语言反汇编_数组与结构体 文章目录C语言反汇编_数组与结构体@[toc]0 . 说明1.数组1.数组对应堆栈空的分配2.数组的寻址1.一维数组2.二维数组3.三维数组3.数组的作为函数参数2.结构体 0 . 说明 ​ 看滴水逆向视频总结笔记 ​ 编译器VC++6.0 1.数组 1.数组对应堆栈空的分配 ​ 数组在汇编中的位置与普通局部变量有一些细节上的差异,一般局部变量都是从栈底依次分配到栈底,...

qq_35289660的博客 1344

CS+调试器反汇编与寄存器面板深度解析:嵌入式底层问题定位实战

在嵌入式系统开发中,调试是定位和解决复杂问题的核心环节。其原理在于通过调试器实时监控和干预目标系统的运行状态,从而洞察程序的实际执行流程与数据变化。这项技术的核心价值在于能够穿透高级语言的抽象层,直接观察CPU的指令执行和内部状态,是解决硬件异常、内存越界、时序临界等底层难题的关键。在嵌入式开发、固件逆向、性能优化等应用场景中,掌握底层调试工具至关重要。本文聚焦于瑞萨RX系列微控制器的主流集成开发环境CS+(Cube Suite+),深入剖析其内置调试器的两大核心利器——反汇编面板与寄存器面板。反汇编面板如

weixin_33801856的博客 355

结构体的反汇编分析

一、为什么用结构体? char、short、int、float、数组等都是宽度不同的容器,用来存储程序执行所需要和所产生的数据,其中数组是存储相同宽度数据的容器,那么当需要存储不同宽度的不同类型的数据时,结构体是一个非常适合的选择 二、结构体的定义和使用 结构体的定义 结构体内部变量在定义时,除了自身以外可以使用任何类型(不能递归定义) 结构体的使用 void function() { /*提升堆栈:默认大小0xC0:分配的栈空间大小----0x100-0xC0=0x40 001D44E0 pu

qq_31125257的博客 558

深入解析Keil C51的bdata与sbit:嵌入式位操作的高效实践

在嵌入式系统开发中,位操作是控制硬件寄存器、管理状态标志的核心基础技术。其原理是通过逻辑与、或、移位等运算,直接对数据的特定位进行读取或修改,以实现对硬件引脚、状态标志的精准控制。这项技术的价值在于能够以最小的数据单元进行高效操作,对于资源受限的单片机(尤其是8位MCU)而言,是提升代码执行效率和实时性的关键。在驱动数码管、软件模拟通信协议、状态机管理等常见应用场景中,高效的位操作至关重要。Keil C51编译器针对经典的8051架构,提供了bdata和sbit这两个非标准关键字,它们能将变量分配到芯片硬件

weixin_30457465的博客 385

HCS08寻址模式与指令集实战:从原理到嵌入式性能优化

在计算机体系结构中,寻址模式是CPU访问数据或指令地址的核心机制,它定义了操作数的来源与定位方式。其原理在于,CPU通过指令中的地址字段与特定寄存器(如程序计数器、变址寄存器)进行计算,生成有效地址,从而访问内存或内部寄存器。理解寻址模式的技术价值在于,它是编写高效、紧凑机器代码的基础,直接影响程序的执行速度和内存占用。在嵌入式系统、编译器优化及底层驱动开发等应用场景中,精准运用寻址模式能显著提升性能。本文以NXP HCS08微控制器为例,深入剖析其**直接寻址**访问快速内存区的优势,以及**变址寻址**

justJavaC的专栏 514

结构体反汇编解析

原因:只有在定义这个结构体变量时候,编译器就去看这个结构体的定义,然后结构体都是基础数据类型组成的,占用内存的大小都是确定的,所以可以通过偏移来访问结构体的成员。如果是地址就是采用箭头,箭头是偏移的意思,就像x86内核要取出寄存器的信息,定义一个结构体,然后用偏移来访问各个寄存器的值。可能是现在vscode编辑器的优化,把一些压栈的操作给忽略了,所以更加直白一些。,这是将在堆中创建了两个int变量,然后puser指向第一个int变量。发现在定义结构体的部分是没有汇编代码的。实体取出值就是按点(.)来访问。

weixin_45131087的博客 326

嵌入式ARM汇编与反汇编面试题及参考答案

ARM 指令集是 ARM 架构原生 32 位定长指令集,单条指令占用 4 字节内存空间,全部指令拥有完整 32 位操作码编码域,支持丰富的运算、内存访问、协处理器、条件执行、移位内嵌运算功能,适用于 ARMv4 及更早全部架构,运行在 ARM 处理器 ARM 工作模式,CPU 总线单次读取完整 32 位指令,流水线按 32 位指令分段取指译码。

大模型大数据攻城狮的专栏 456

c语言结构体反汇编,结构体位操作--反汇编(一)

先看下面的代码:1 #include 2 #include 34 typedef unsigned long ulong;56 struct A7 {8 ulong board_type: 1;9 ulong channel_type: 3;10 ulong fpga_en : 1;11 ulong fpga_downloade...

weixin_39817391的博客 571

Windows 11 的C盘User(用户)文件夹下的用户文件夹名称的修改

背景介绍:由于系统重装导致Windows 11的系统用户名与C盘User(用户)文件夹下的用户名文件夹(公用文件夹旁边的文件夹)出现名称不一致,事例中系统用户名命名为“寂萧”,User(用户)文件夹下的文件夹名称却是“77555”。【QQ邮箱前五位真的真的看着很别扭】注:改名有风险,三思而后行。User(用户)文件夹下的用户名是中文在某些软件的应用场景下产生不便,导致很多软件莫名其妙报错,甚至无法使用,笔者不建议修改为中文名。//和笔者一样的强迫症除外//

2302_79084172的博客 10万+

避开PSRR仿真三大坑:用Cadence psspxf分析分频器时,这些设置错了白忙活

本文深入探讨了使用Cadence psspxf工具进行分频器PSRR仿真时常见的三大技术陷阱,包括扰动信号参数设置、收敛性优化和后处理信号提取。通过详细的参数推荐和实战技巧,帮助工程师避免仿真误差,提升PSRR分析效率与准确性,特别适用于16分频器等数字-模拟混合电路设计。

weixin_29258297的博客 302

为什么使用结构体效率会高?通过汇编代码给你讲透!

作为一个有着十几年研发经验的嵌入式老杆子,作者发现很多程序猿新手,在编写代码的时候,特别喜欢定义很多全局变量,写个模块,能定义几百个全局变量,函数里面也是各种全局变量,这种屎山代码效率低,难维护,几乎无法移植,但是防御性极高!(凡事都有两面性)很多新手之所以把这些变量封装到一个结构体中,主要原因是图方便,但是要知道,这其实是一个不好的习惯,而且会降低整体代码的性能。最近有幸与大神交流的时候,他聊到...

嵌入式Linux 390

Spring Boot 构建war 部署到tomcat下无法在Nacos中注册服务

因此,当使用外部容器时,如此处的 Tomcat 来部署项目,AbstractAutoServiceRegistration 就不能监听到容器启动事件了,也就不会尝试向服务注册中心注册当前这个微服务,那么注册就失败了,并且也就没有异常信息了。自定义获取获取外部容器端口的方法, 然后监听应用启动事件,当应用被启动时,获取外部容器启动的端口号,然后将这个 port 设置到 NacosAutoServiceReigistration 中。在启动类同级目录,复制下面代码即可(不需要修改,直接构建war即可)

ttyy1112的专栏 2519

使用Keil5进行C语言位操作优化的实战案例

通过实际项目案例,深入讲解如何在keil5环境下利用C语言进行高效的位操作优化,提升代码性能与执行效率,适用于嵌入式开发中的资源精简与运行速度优化。

weixin_42323064的博客 343

出现 Tomcat:HTTP状态 404 - 未找到解决方法(图文分析)

出现如下问题 HTTP状态 404 - 未找到 类型 状态报告 消息 请求的资源[/ajax_war_exploded/]不可用 描述 源服务器未能找到目标资源的表示或者是不愿公开一个已经存在的资源表示。 Apache Tomcat/8.5.69 解决方法如下: 网上中的操作有步操作多数都误导 这个部署的环境目录上面是web.xml 下面的目录路径是web即可不用到webapp 保存重启服务器即可使用 其他配置中启动tomcat的操作具体 JRE 1.8 ...

码农研究僧的博客 13万+

复现论文《孤岛微电网环境下基于物理模型引导的深度强化学习VSG频率控制方法》

本文提出了一种结合物理模型与深度强化学习的孤岛微电网VSG频率控制方法。通过建立VSG小信号模型并设计可变系数控制器,将物理知识融入深度强化学习框架,解决了高维参数和机组耦合带来的控制难题。复现代码实现了三个核心组件:VSGSmallSignalModel建模VSG动态特性,VariableCoefficientController实现参数自适应调节,PhysicsGuidedDRL整合DQN算法与物理模型引导的奖励机制。该方法通过模型驱动与数据驱动的优势互补,提升了频率控制性能,其中物理模型既作为先验知识

huanghm88的专栏 127

C语言结构体位定义(位段)的实际作用深入分析

C语言结构体位定义(位段)的实际作用深入分析。

weixin_42031299的博客 739

ArcGIS Pro SDK (二十五)工作流管理器

【代码】ArcGIS Pro SDK (二十五)工作流管理器。

Winemonk 494

汇编指令实战指南:从x86/ARM架构到反汇编调试的底层认知

汇编指令是计算机底层硬件交互的核心语言,它直接对应CPU的寄存器、内存和运算单元操作。理解汇编原理是掌握程序执行机制、性能优化和系统调试的基础。在x86/x86-64等复杂指令集架构中,指令长度可变且功能强大,支持灵活的内存寻址模式;而ARM等精简指令集架构则采用固定长度指令和加载/存储分离的设计,在移动和嵌入式领域广泛应用。掌握汇编指令的分类,如数据传送、算术运算和流程控制指令,能帮助开发者深入分析性能瓶颈、排查底层错误。通过反汇编工具如GDB和x64dbg进行实战调试,可以直观观察编译器优化、理解函数调

weixin_33709609的博客 394

【tio-websocket】15、学习tio的第1步—tio-study

tio-study 是用于学习 t-io 的示范工程,tio-study 是入门 t-io 最好的方式!tio-study 工程演示的是一个典型的 TCP 长连接应用工程,分为 server(服务端) 和 client(客户端) 工程,server 和 client 共用 common(公共模块) 工程

JACKAL 1万+

[Dify实战]插件编写- 如何让插件直接输出文件对象(支持 TXT、Excel 等)

本文介绍了在Dify插件中实现文件对象返回的方法。通过create_blob_message()函数,开发者可以输出txt、Excel等格式文件,让用户直接下载而非复制文本。文章详细讲解了二进制文件生成的原理,提供了文本翻译和Excel报表生成的代码示例,并列出常见MIME类型对照表。这种技术能显著提升插件实用性,特别适用于翻译、报表生成等需要文件输出的场景,使交互体验从"复制粘贴"升级为"一键下载"。

技术小甜甜:传播可落地技术,帮助个人和企业降低解决真实场景问题的成本 1249

对于结构体指针+、-常数的理解(page_to_pfn和pfn_to_page)

昨天笔试也有这么道题目, int arrayTmp[10] = {0}; int nTmp = &arrayTmp[4]-&arrayTmp[0]; 问nTmp = ? 当时想也没想写了nTmp = 16; 回家在机器上调试运行了一下,结果nTmp=4。因为不常用这种方法,所以觉得很纳闷儿。看了下反汇编的代码,发现: int nTmp = &arrayTmp[4] - &arrayTm

MyDriverC 547

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

逆向工程师的“二进制夜视仪”:手把手教你用ImHex解析数据结构、反汇编与YARA扫描

本文详细介绍了ImHex作为逆向工程师的“二进制夜视仪”在解析数据结构、反汇编与YARA扫描中的应用。通过模式语言、反汇编引擎和YARA扫描三大核心功能,ImHex能将原始字节转化为可视化洞察,提升二进制分析效率。文章还提供了实战案例和实用技巧,帮助读者快速掌握这一强大工具。

weixin_30268071的博客 166

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

MSP430位操作指令BIC/BIS/BIT详解与嵌入式开发实战

在嵌入式系统开发中,指令集是连接软件逻辑与硬件行为的底层桥梁,其设计哲学直接影响代码的执行效率与系统稳定性。位操作作为处理器指令集的核心功能之一,其原理基于基本的逻辑运算(与、或、非),通过硬件直接映射实现对寄存器或内存中特定位的原子性读写。这种技术价值在于提供了确定性的硬件控制能力,避免了高级语言抽象可能带来的性能损耗与竞态风险。在嵌入式应用场景中,如GPIO端口控制、外设寄存器配置、中断状态管理以及低功耗状态机实现,精准的位操作都是不可或缺的基础。本文聚焦于德州仪器MSP430微控制器的BIC(位清除)

weixin_30617737的博客 419

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

视频教程-x86/x64软件逆向分析入门-C/C++

x86/x64软件逆向分析入门 成都理工大学优秀讲师,教授,二十年开发经验,...

weixin_28639619的博客 1137

联发科嵌入式工程师面试全攻略与技术解析

嵌入式系统开发是连接硬件与软件的关键技术领域,其核心在于对计算机体系结构、实时操作系统和底层协议的深入理解。从原理上看,嵌入式开发需要掌握ARM架构特性、内存管理机制以及中断处理流程,这些基础概念构成了嵌入式软件工程师的核心能力模型。在技术价值层面,优秀的嵌入式解决方案能显著提升设备性能并降低功耗,尤其在物联网和智能硬件领域具有广泛应用。以联发科校招面试为例,技术考察重点包括BootLoader启动流程优化、TCP/UDP协议选型等实际问题,其中通过objdump反汇编定位崩溃点的调试技巧,以及RTOS移植

weixin_42551310的博客 493
上一篇: 浅谈Linux PCI设备驱动(二)
下一篇: 结构体位操作--反汇编(二)
linuxdrivers
博客等级 码龄16年 147粉丝 14原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值