STM32在KEIL平台反汇编代码分析_stm32反汇编成c语言_yummy说电子的博客-程序员秘密

技术标签: STM32  反汇编  

  不同的平台的汇编代码是不一样的,最早的汇编在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 <stm32f10x.h>  
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 r0r1    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语句被翻译成了意料之中的汇编语句。或者说,经过分析这些汇编语句,我们发现,自己的意图被机器准确的理解了。再然后就是汇编变成机器码,这个过程本篇不讨论

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/geek_monkey/article/details/79055257

智能推荐

[Android] Android自定义View修炼之路(1)_Glemontree_的博客-程序员秘密

前言尼玛一直觉得自定义View好难,但是呢自定义View在Android开发过程中又是无法逃避的坎,一个App我觉得除了数据外,就属外观了,漂亮的界面总是让人心旷神怡。每每看到别人做的酷炫的控件都好羡慕,想知道他们是怎么实现的,相信很多初学者都有和我一样的苦恼。但是呢,学习是一个不断积累的过程,不能指望着一步登天,所以还是需要先打好基础,一步一步来,下面让我们跟着大神一步步学习自定义View吧(ps

error C4430: missing type specifier - int assumed. Note: C++ does not support default-int_donghongkui的博客-程序员秘密

在VS2008中生成时出错:error C4430: missing type specifier - int assumed. Note: C++ does not support default-int这是因为在VC6中,如果没有显示的指定返回值类型,编译器将其视为默认整型。但是vs2005不支持默认整型。解决方法如下:打开:项目----项目属性----配置属性----C/C++----命令行

逻辑回归解决共线性问题_XcsdnJ2713的博客-程序员秘密

解释变量理论上的高度相关与观测值高度相关没有必然关系,有可能两个解释变量理论上高度相关,但观测值未必高度相关,反之亦然。所以多重共线性本质上是数据问题。造成多重共线性的原因有一下几种:1、解释变量都享有共同的时间趋势;2、一个解释变量是另一个的滞后,二者往往遵循一个趋势;3、由于数据收集的基础不够宽,某些解释变量可能会一起变动;4、某些解释变量间存在某种近似的线性关系...

OpenJDK 正式宣布AWT、2D、Swing等项目解散_程序猿DD_的博客-程序员秘密

7月15日OpenJDK管理委员会全票通过批准成立由Phil Race担任初始负责人的Client Libraries Group(客户端类库工作组)。新的工作组将继续赞助OpenJFX...

android studio导入support -v4 包的方法_android导入supper_瑺圊樹的博客-程序员秘密

1.进入 file-project structure2.左边选择app3.右边选择dependencies4.左下角可以看到一个加号,点击选择Library dependency就可以看到可以导入的jar包,选择support-v4导入即可

[Android]只显示月和日的DatePickerDialog_weixin_34364071的博客-程序员秘密

 前言  需求要只显示月和日的日历控件,又不想自定义控件,最简单的办法就是隐藏显示年的这个框了,但DatePickerDialog并没有直接提供方法来操作,这里分享一个笨办法:) 声明  欢迎转载,但请保留文章原始出处:)     博客园:http://www.cnblogs.com    农民伯伯: http://over140.cnblogs.com    正文  一、效果图    1.1 默...

随便推点

PHP Startup: Unable to load dynamic library ‘imagick’ 【解决】无需复制dll到bin目录,windows下配置imagick扩展(Nginx)_火星灵魂的博客-程序员秘密

重点是设置完windows系统环境变量后,要重启或注销系统后,php才能正常识别imagick扩展。经过测试,php7.3、7.4、8.0此方法均适用,8.1未测试。

POJ1006_爱吃紫菜汤的懒小猪的博客-程序员秘密

生理周期Time Limit: 1000MS Memory Limit: 10000KTotal Submissions: 139919 Accepted: 44896Description人生来就有三个生理周期,分别为体力、感情和智力周期,它们的周期长度为23天、28天和33天。每一个周期中有一天是高峰。在高峰这天,人会在相

Android应用开发-小巫程序员秘密client之显示博文具体内容_weixin_33691817的博客-程序员秘密

Android应用开发-小巫程序员秘密客户端之显示博文具体内容 上篇博文给大家介绍的是怎样嵌入有米广告而且获取收益,本篇博客打算讲讲关于怎样在一个ListView里显示博文的具体信息。这个可能是童鞋们比較困惑的,由于一篇博客可能有标题、摘要、图片、代码等等元素组成,我们要怎么在一个界面中显示这些内容而且依照自己的指定的方式显示呢,别急,以下会告诉大家。   又一次整理一下一篇博文可能有以下元...

java项目tkmybatis整合_spring-boot如何最精简整合tkmybatis_海v尔v前v员工的博客-程序员秘密

tkmybatis最精简整合,最精简整合指的是手动导入最精简的自动配置类ImportTkMybatis.java代码如下package com.litong.spring.boot.mybatis.tk;import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;import org.springfr...

正则 RegExp_曹政鑫婕_曹政鑫婕的博客-程序员秘密

正则 RegExp1. 创建正则表达式1.1 通过构造方法创建var reg = new RegExp(/today/);1.2 字面量的形式创建var reg = /tommorw/;2. 字符类2.1 边界符正则表达式中的边界符(位置符)用来提示字符所处的位置,主要有两个字符–精确匹配边界符说明^表示匹配行首的文本(以谁开始)$表示匹配行尾的文本(以谁结束)2.2 括号元字符说明{}大括号量词符. 里面表示重复次数

java.lang.UnsatisfiedLinkError: /mnt/jdk1.8/jre/lib/amd64/libawt_xawt.so: libXrender.so.1_能量守恒洛的博客-程序员秘密

AWT is not properly configured on this server. Perhaps you need to run your container with "-Djava.awt.headless=true"? See also: https://wiki.jenkins-ci.org/display/JENKINS/Jenkins+got+java.awt.headl...

推荐文章

热门文章

相关标签