历史上的今天
返回首页

历史上的今天

今天是:2025年06月01日(星期日)

2019年06月01日 | STM32在KEIL平台反汇编代码分析

2019-06-01 来源:eefocus

  不同的平台的汇编代码是不一样的,最早的汇编在50年代就发明了,比很多人的父母的年龄都大,老掉牙,不用学习怎么写汇编。一个公司有一个人知道怎么写汇编就够了。但要学习读汇编


为什么学习汇编?


  1 性能 直接翻译为机器语言,性能最高。优秀的C语言效率只能达到汇编的80%左右。其他高级语言跟汇编一比差得更远。语言越高级性能越差。很多bootloader和BIOS用汇编写,汇编操作的是电脑,手机刚刚上电时,硬件和初始化的那些命令,它们的性能的要求比较高,效率高开机速度更快。 

  2 分析问题。个人认为,编程人与机器对话,我们写C,写JAVA,但是电脑并不认识这些语言,电脑只认识0和1;所以需要一个人来翻译这些语言,这个翻译官就是编译器,但是编译器不能百分之百准确的表达程序员的意思,也就是所谓的翻译有反义。例如,编译器为了性能好一点,可能会优化变量和语句,这个过程可能好心办坏事,把有用的操作优化了。因此只有看懂一些汇编语句,才能分析程序真正执行的流程。在问题难以定位的情况下,汇编可能是分析问题的最后一根稻草。 

  3 帮助理解硬件。有些学校的单片机课程是以汇编进行教学的,主要原因就是汇编更贴近硬件。不过我不赞成这种做法,C语言能快速做出一点东西,有利于学生在放弃之前,增加成就感,好坚持下去。但是汇编确实更贴近硬件,


如何在KEIL下阅读汇编


  按d进入debug模式,在view下选择disassembly window 

 这里写图片描述 

  看光标,c文件下指向了main函数的第一行。 

  汇编窗口也指向了对应的语句。但是,在执行C语言的第一行之前,仍然有许多操作要做,比如变量放在哪?在哪里调用了main函数等,这些操作都被集成开发环境IDE给封装起来了。我们必须知道,在执行main函数之前,有许多事情要做,只不过,初学的时候不必理会。


  以下是C语言源码,功能是点亮LED.


//main.c

#include   

int main(void)

{

    RCC->APB2ENR |= RCC_APB2ENR_IOPBEN;

    GPIOB->CRL &= ~(0xf<<(1*4));

    GPIOB->CRL |= 0x2<<(1*4);     

    GPIOB->ODR &= ~(1<<1);

    return 0;             

}

//main.h

#define RCC_APB2ENR (*(unsigned int *)0x40021018)

#define GPIOB_CRL (*(unsigned int *)0x40010c00)

#define GPIOB_ODR (*(unsigned int *)0x40010c0c)


  汇编窗口往上翻,确实很多语句。 

  先看这几行代码的汇编 

这里写图片描述

  先说最常用的两句汇编


LDR r0,[r1]    r0 = *r1

STR  r0,[r1]    *r1 = r0

MOV r0,r1    r1->r0拷贝


  资料参考,可以搜索 

http://blog.csdn.net/tanyouliang/article/details/6767011 

http://blog.csdn.net/a1875566250/article/details/8507168 

 这里写图片描述 

  从内存0x0800 017c的32位数据拷贝到r0 

  r0 = * 0x0800 017c , 

  我们看到的 1000 4002其实 就是0x4002 1000。这里边有个知识点叫做大小端模式,以下简单讲解,不能理解就记住 

 这里写图片描述 

  这个数据是在地址是这么存放的 

  7C 7D 7E 7F 

  00 10 02 40 

  实际数据是0x4002 1000 

  * 0x0800 017c=0x4002 1000 

  然后r0的值+0x18也就是24 因为这个是第6号(第6号就是第7个的意思)元素 

  得到r0 = *0x4002 1018,r0的值由一个地址,变成了地址所存放的数据。 

  然后是或0x08操作,结果再复制给r0,*0x4002 1018 |=0x08 

  给r1分配地址,这个地址也是0x4002 1000, r1 = *0x4002 1000 

  把r0存放的值,(不是r0的地址,)存到r1+18的空间上 

  *(r1+0x18) = r0 

  *0x4002 1018 = (*0x4002 1018 |=0x08) 

  *0x4002 1018|=0x08 

  最终结果:地址4002 1018的数,执行了或0x08的操作


  再分析下一句 

 这里写图片描述 

  前两句给r0分配空间,r0 = *0x4001 0c00 

  然后用BIC清除数据位,把4-7位清零,结果再赋值给r0 

  *0x4001 0c00 &= ~(0xf0) 

  r1 = *0x4001 0c00 

  *0x4001 0c00 &= ~(0xf0)

 

  剩下的不再详细分析,直接给答案 

 这里写图片描述 

***0x4001 0c00 |= 0x20 

0x4001 0c0c &= ~(0x02)*


  经过层层抽丝剥茧,可以看到C语句被翻译成了意料之中的汇编语句。或者说,经过分析这些汇编语句,我们发现,自己的意图被机器准确的理解了。再然后就是汇编变成机器码,这个过程本篇不讨论


推荐阅读

史海拾趣

Adam Tech公司的发展小趣事

Adam Tech深知品质是企业生存和发展的基石。因此,公司始终将品质管理放在首位,通过引进先进的生产设备和技术,以及实施严格的质量控制流程,确保每一款产品都符合客户的要求和行业标准。同时,公司还建立了完善的售后服务体系,及时解决客户在使用过程中遇到的问题。这种对品质的执着追求和持续改进的精神,使得Adam Tech在客户中赢得了良好的口碑。

Corstat Containers公司的发展小趣事

Corstat Containers公司始终坚持以品质为核心的发展理念。在生产过程中,公司严格把控原材料采购、生产工艺和产品质量检测等环节,确保每一件产品都符合客户的要求。这种对品质的坚持赢得了客户的信任和好评,也为公司赢得了更多的合作机会。

Belden Wire and Cable公司的发展小趣事

随着全球化的深入发展,Belden公司开始积极拓展国际市场。通过在全球范围内设立分支机构和工厂,百通不仅提升了自身的产能和效率,也更好地满足了全球客户的需求。同时,公司还不断推出新产品和新技术,拓展在工控线缆、音视频线缆和计算机网络等领域的市场份额。如今,Belden已经成为全球最大的综合布线及专业线缆制造商之一,其产品和服务遍布全球各地。

这五个故事只是Belden Wire and Cable公司发展历程中的一部分,但它们都客观地反映了公司在电子行业里不断发展、创新和壮大的事实。通过这些故事,我们可以看到一个企业通过不断创新和拓展市场,逐渐成长为行业领导者的过程。

Gravitech公司的发展小趣事

1902年,Joseph C. Belden在美国伊利诺伊州芝加哥创立了Belden公司。在创立初期,公司主要生产电线和电缆产品,并逐渐在行业内崭露头角。1905年,经过大量的实验和研究,Belden公司成功研发出“Beldenamel”绝缘材料,这种灵活的搪瓷绝缘材料极大地提升了线缆的性能和可靠性,为公司的早期发展奠定了坚实的基础。

Connection One公司的发展小趣事

在电子行业的快速发展中,Connection One公司始终保持着强烈的创新意识。公司不断投入研发资金,引进高端人才,推动技术创新和产品升级。这种持续创新的精神使得公司在行业中始终保持领先地位,铸就了辉煌的业绩。

这些故事虽然基于虚构情节,但反映了电子行业中企业发展的一些普遍规律。在实际情况中,一个成功的电子企业往往需要具备技术创新能力、市场拓展能力、全球化视野以及持续创新的精神。

Crosspoint Solutions公司的发展小趣事

在电子行业中,产品质量是企业生存和发展的关键。Crosspoint Solutions公司深知这一点,因此始终将品质管理放在首位。公司建立了严格的质量检测体系,从原材料采购到产品出厂的每一个环节都进行严密把控。这种对品质的执着追求赢得了客户的信任和好评,使公司在市场上树立了良好的口碑。

问答坊 | AI 解惑

一种简单实用的车载正弦波逆变电源

摘要:介绍了一种简单实用的车载正弦波逆变电源。控制电路采用权电阻网络正弦波发生器及专用控制芯片UC3637产生SPWM波,经高压悬浮驱动器IR2110至逆变电路功率开关门极。实验结果表明,该电源输出波形良好,供电特性满足要求。其突出优点是结构简单 ...…

查看全部问答>

又一个7.8级

地震了!为灾区人民祈祷:平安!        有一本书介绍:1976年的唐山大地震,二个月前就被人预测到了,这个人就是曾担任过河北省人大常委、开滦马家沟矿地震台的马希融,地震发生的9个小 时前,他还打电话向省、国家地震局发 ...…

查看全部问答>

建筑智能化系统工程施工图设计主要问题(转载)

摘要:本文指出建筑设计院和系统集成商承担建筑智能化系统工程设计的状况将长期存在。由于种种原因,施工图设计质量不尽如人意,存在较多的问题。精心设计、精心施工,才能提高智能化系统工程的设计质量和工程技术水平,需要领导重视,设计人员敬业 ...…

查看全部问答>

无线电基础与收音机

基本的电子书,不错…

查看全部问答>

串口不能多次写入

大家好:     我现在在学习单片机,用的周立功DP51-H和DPFLASH下载软件。刚往单片机上烧写小程序还行,但是只要一上20k的程序,就很有问题.具体的情况就是:20k以上的代码,只能烧写一次。第二次烧写,DPFLASH就会提示通讯口出现错误, ...…

查看全部问答>

GPIO数据寄存器

谁写过操作LPC1114的GPIO数据寄存器读写数据的操作!!分享下!!…

查看全部问答>

求教:LF2407如何外扩存储器?

不知那位大哥用过LF2407,我想请教一下:如果我想用LF2407外扩一片64Kx16的数据RAM和一片64Kx16的程序RAM,我的LF2407的引脚应该怎样搭建?另想问一下:/STRB这个引脚有何作用?在外扩存储器时  是否可以不用这个脚? …

查看全部问答>

关于LM3S2B93 的CAN 使用问题,请高手帮忙。 谢~!

我在做LM3S2B93的CAN通讯的时候,出现如下两个错误:   用最新的库:driverlib.a   Error[Li005]: no definition for \"CANRegRead\" [referenced from E:\\CAN\\Debug\\Obj\\my_can.o] Error[Li005]: no definition for \"CANRegW ...…

查看全部问答>

菜鸟跪求指点!!!急~~

本人做了一块TMS320C6747的板子 这两天调试CCS一直连接不上报错错误如下:Error 0x80000240/-275                  Fatal Error during :Initialization ,OCS,This error was generat ...…

查看全部问答>

9b96开发环境iar

每次把iar关上在打开就没有办法编译了 提示错误是tool unknown error:                                       ...…

查看全部问答>