0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

学习STM32时为什么要学习汇编?

单片机与嵌入式 来源:单片机与嵌入式 2023-01-12 09:37 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

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

为什么学习汇编?

性能

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

分析问题

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

帮助理解硬件

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

LDR指令

为了便于理解下文,先介绍下LDR指令,其格式如下:

LDR{条件}   目的寄存器     <存储器地址>

作用:将 存储器地址 所指地址处连续的4个字节(1个字)的数据传送到目的寄存器中。LDR指令的寻址方式比较灵活,实例如下:

LDR R0[R1]   ;将存储器地址为R1的字数据读入寄存器R0
LDR R0[R1,R2]   ;将存储器地址为R1+R2的字数据读入寄存器R0
LDR R0[R1,#8]    ;将存储器地址为R1+8的字数据读入寄存器R0
LDR R0[R1],R2      ;将存储器地址为R1的字数据读入寄存器R0,并将R1+R2的值存入R1
LDR R0[R1],#8      ;将存储器地址为R1的字数据读入寄存器R0,并将R1+8的值存入R1
LDR R0[R1,R2]!    ;将存储器地址为R1+R2的字数据读入寄存器R0,并将R1+R2的值存入R1
LDR R0[R1,LSL #3]     ;将存储器地址为R1*8的字数据读入寄存器R0
LDR R0[R1,R2,LSL #2]   ;将存储器地址为R1+R2*4的字数据读入寄存器R0
LDR R0[R1,R2,LSL #2]!;将存储器地址为R1+R2*4的字数据读入寄存器R0,并将R1+R2*4的值存入R1
LDR R0[R1],R2LSL #2     ;将存储器地址为R1的字数据读入寄存器R0,并将R1+R2*4的值存入R1
LDR R0LabelLabel为程序标号,Label必须是当前指令的-4~4KB范围内。

要注意的是:

LDR Rd[Rn]#0x04   ;这里Rd不允许是R15

另外LDRB 的指令格式与LDR相似,只不过它是将存储器地址中的8位(1个字节)读到目的寄存器中。LDRH的指令格式也与LDR相似,它是将内存中的16位(半字)读到目的寄存器中。

LDR R0,=0xff

这里的LDR不是arm指令,而是伪指令。这个时候与MOVE很相似,只不过MOV指令后的立即数是有限制的。这个立即数必须是0X00-OXFF范围内的数经过偶数次右移得到的数,所以MOV用起来比较麻烦,因为有些数不那么容易看出来是否合法。

如何在KEIL下阅读汇编

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

20e67afa-91a3-11ed-bfe3-dac502259ad0.png

看光标,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);


return0;
}


//main.h
#defineRCC_APB2ENR(*(unsignedint*)0x40021018)
#defineGPIOB_CRL(*(unsignedint*)0x40010c00)
#define GPIOB_ODR (*(unsigned int *)0x40010c0c)

汇编窗口往上翻,确实很多语句,先看这几行代码的汇编:

211205ee-91a3-11ed-bfe3-dac502259ad0.jpg

先说最常用的两句汇编:

LDR r0,[r1]    r0 = *r1


STR  r0,[r1]    *r1 = r0


MOV r0,r1    r1->r0拷贝

212fff86-91a3-11ed-bfe3-dac502259ad0.jpg

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

r0 = * 0x0800 017c

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

214a7258-91a3-11ed-bfe3-dac502259ad0.png

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

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的操作。再分析下一句 :

21653e76-91a3-11ed-bfe3-dac502259ad0.jpg

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

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

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

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

217a446a-91a3-11ed-bfe3-dac502259ad0.jpg

***0x40010c00|=0x20
0x4001 0c0c &= ~(0x02)*

最终,可以看到C语句被翻译成了意料之中的汇编语句,自己的意图被机器准确的理解了。

相关推荐

STM32F10x中,一些专业术语

嵌入式开发RTOS的优势在哪?

嵌入式开发中更接近底层的汇编与C语言


审核编辑 :李倩


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • STM32
    +关注

    关注

    2313

    文章

    11210

    浏览量

    375302
  • C语言
    +关注

    关注

    183

    文章

    7649

    浏览量

    146423
  • 机器语言
    +关注

    关注

    0

    文章

    36

    浏览量

    11079

原文标题:学习STM32时为什么要学习汇编?

文章出处:【微信号:单片机与嵌入式,微信公众号:单片机与嵌入式】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    学习STM32单片机,从菜鸟到牛人应该怎么走?

    第一步 编程及硬件基础知识 1.掌握C语言基础 作为STM32的主要编程语言,C语言的基础知识是必不可少的。建议通过书籍、在线课程或者教学视频系统地学习C语言的基础知识,包括语法、数据类型
    发表于 05-11 15:38

    强化学习会让自动驾驶模型学习更快吗?

    [首发于智驾最前沿微信公众号]在谈及自动驾驶大模型训练时,有的技术方案会采用模仿学习,而有些会采用强化学习。同样作为大模型的训练方式,强化学习有何不同?又有什么特点呢? 什么是强化学习
    的头像 发表于 01-31 09:34 944次阅读
    强化<b class='flag-5'>学习</b>会让自动驾驶模型<b class='flag-5'>学习</b>更快吗?

    自动驾驶中常提的模仿学习是什么?

    当谈及自动驾驶模型学习时,经常会提到模仿学习的概念。所谓模仿学习,就是模型先看别人怎么做,然后学着去做。自动驾驶中的模仿学习,就是把人类司机在各种路况下的行为做成范例,记录下看到了什么
    的头像 发表于 01-16 16:41 2261次阅读

    学习单片机快速方法

    那么多钱去养那些优化代码的程序员还不如买一套新的硬件。我现在也是用C语言编程的。 汇编几乎不用。知道怎么使用开发软件之后,你就可以按照学习板的教程进行编程练习。练习分模块进行,比如流水灯模块,你
    发表于 01-14 07:42

    机器学习和深度学习中需避免的 7 个常见错误与局限性

    无论你是刚入门还是已经从事人工智能模型相关工作一段时间,机器学习和深度学习中都存在一些我们需要时刻关注并铭记的常见错误。如果对这些错误置之不理,日后可能会引发诸多麻烦!只要我们密切关注数据、模型架构
    的头像 发表于 01-07 15:37 411次阅读
    机器<b class='flag-5'>学习</b>和深度<b class='flag-5'>学习</b>中需避免的 7 个常见错误与局限性

    分享一个嵌入式开发学习路线

    链”,能独立做简单硬件项目。这一阶段的学习同样对学历没有特殊要求。 STM32单片机学习:掌握STM32的核心外设使用,如GPIO、UART、SPI/I2C、ADC等,能看懂最小系统板
    发表于 12-04 11:01

    汇编语言还有必要学习

    1、嵌入式操作系统需要汇编语言 2、实时性要求非常高的地方,需要汇编语言,比如FFT算法。 3、汇编语言做运算那叫一个痛苦,下面是一段双字节乘法,浮点数就更难搞
    的头像 发表于 11-25 11:46 865次阅读
    <b class='flag-5'>汇编</b>语言还有必要<b class='flag-5'>学习</b>吗

    学习物联网怎么入门?

    随着物联网技术的不断发展,越来越多的人开始关注学习这一领域。但是对于初学者来说,物联网似乎是一个庞杂的概念,学习起来很困难。因此,从哪里开始学习物联网成为了一个比较普遍的问题。   首先,了解物
    发表于 10-14 10:34

    科普|通信射频接头学习

    科普|通信射频接头学习
    的头像 发表于 08-19 17:09 1124次阅读
    科普|通信射频接头<b class='flag-5'>学习</b>

    PID控制算法学习笔记资料

    用于新手学习PID控制算法。
    发表于 08-12 16:22 7次下载

    ARM入门学习方法分享

    的关键。一旦你掌握了ARM的基本概念和汇编语言,你可以开始进行一些简单的ARM项目。你可以尝试编写一些简单的程序,如LED闪烁、按键输入等,以加强你的实践能力。 五、学习硬件知识:深入理解ARM架构
    发表于 07-23 10:21

    开源电机驱动,免费直播学习!

    开源电机驱动,免费直播学习!
    的头像 发表于 06-13 10:07 2123次阅读
    开源电机驱动,免费直播<b class='flag-5'>学习</b>!

    DeepSeeK学习资料

    104页DeepSeeK学习资料(清华)
    发表于 06-08 09:57 3次下载

    电子硬件工程师如何从零开始学习?(文末免费分享从零开始学习资料)

    经常有用户咨询,如何学习和提升电子硬件能力,有没有适合小白学习的资料等等;电子硬件工程师是一个结合理论、实践和创新能力的职业,需要掌握电路设计、元器件选型、PCB设计、嵌入式系统、测试调试等多方面
    的头像 发表于 06-04 07:36 2920次阅读
    电子硬件工程师如何从零开始<b class='flag-5'>学习</b>?(文末免费分享从零开始<b class='flag-5'>学习</b>资料)

    STM32单片机学习进阶路线】FreeRTOS嵌入式开发指南:从入门到智能循迹避障小车项目实战(含文档代码)

    STM32学习路径一般是先掌握裸机开发,再进阶学习RTOS。简单的功能可通过裸机实现,而复杂产品则需借助RTOS来完成。随着RTOS应用场景日益增多,尤其在物联网快速发展的推动下,越来越多企业在
    的头像 发表于 05-29 11:46 1672次阅读
    【<b class='flag-5'>STM32</b>单片机<b class='flag-5'>学习</b>进阶路线】FreeRTOS嵌入式开发指南:从入门到智能循迹避障小车项目实战(含文档代码)