单片机核心学习:(四)第1个程序深度解析

本文详细介绍了嵌入式开发中的C语言与汇编知识,包括进制转换、位操作、汇编与反汇编、机器码的理解。探讨了字节序的概念,展示了不同芯片的反汇编示例,并解析了C函数与汇编的交互,通过实例阐述了编程过程中的关键步骤和技巧。
摘要由CSDN通过智能技术生成

目录

一、编程知识 - 进制

1、方向引入

2、如何快速转换二进制、八进制、十六进制?

3、在C语言中,怎么表示八进制、十进制、十六进制?

二、编程知识 - 字节序 - 位操作

1、字节序

2、位操作

2.1 逻辑移位

2.2 取反

2.3 位与

2.4 位或

2.5 置位

2.6 清位

2.7 把某几位设置为某值

三、编程知识 - 汇编 - 反汇编 - 机器码

1、程序处理的4个步骤

2、KEIL下怎么反汇编

3、GCC下反汇编

4、机器码与汇编

4.1 STM32F103反汇编

4.2 STM32MP157反汇编

4.3 IMX6ULL反汇编

4.4 机器码与汇编示例

4.5 解析LDR伪指令

4.5 总结

四、编程知识 - C与汇编深入分析

1、汇编怎么调用C函数

1.1 直接调用

1.2 想传参数怎么办?

2、C函数的反汇编码阅读

3、Flash上的内容

3.1 反汇编示例

3.2 烧写在Flash上的内容

3.3 启动流程

五、纯汇编点灯

1、程序流程图

2、delay函数流程图

3、写程序

4、代码


一、编程知识 - 进制

n进制:逢n进1

1、方向引入

(1) 二进制

  • 晶体管只有两个状态① ON:1 ② OFF:0
  • 数据使用多个晶体管表示。
  • 如:8bit数据
  • 用二进制描述,吻合硬件状况。

(2)更方便的描述一个值

  • 八进制:3bit一组(001,100,000),在八进制里用1位表示(这一位取值范围0~7)
  • 十六进制:4bit一组(0110,0000),在十六进制里用1位表示(这一位取值范围0~15)

2、如何快速转换二进制、八进制、十六进制?

8421 ---> 二进制权重

1111  =  1*2^3+1*2^2+1*2^1+1*2^0

         =  1*8+1*4+1*2+1*1

(1)二进制转八进制、十六进制

例如:0b01101110101(0b代表二进制)

① 二进制转八进制

              2 1    4 2 1    4 2 1    4 2 1 

八进制:0 1,1 0 1,1 1 0,1 0 1

上下相乘  1         5         6         5

最后答案:1565

② 二进制转十六进制

                  4 2 1    8  4 2 1    8 4 2 1  

十六进制:0 1 1, 0 1 1 1 ,0 1 0 1

上下相乘        3            7             5

最后答案:375

(2)十六进制转二进制

例如:0xABC1(0X代表十六进制)

            0x      A        B        C        1

                     10       11      12      01

8421凑数:8421   8421   8421  8421

                   1010    1011   1100  0001

3、在C语言中,怎么表示八进制、十进制、十六进制?

int a = 96;       // 十进制

int a = 0140;   // 0开头,八进制

int a = 0x60;   // 0x开头,十六进制

二、编程知识 - 字节序 - 位操作

1、字节序

假设int a = 0x12345678;

  • 16进制数中每位数值占据4 bit;在内存中,是以8个bit作为1byte
  • 因此0x12345678中每两位作为1byte, 其中0x78是低byte,0x12是高byte。

在内存中的存储方式有两种:

  • 0x12345678的低位(0x78)存在低地址,即方式1,叫做小字节序(Little endian);
  • 0x12345678的高位(0x12)存在低地址,即方式2,叫做大字节序(Big endian);
  • 一般的arm芯片都是小字节序,有些处理器,可以置某个寄存器,让整个系统使用大字节序或小字节序。

2、位操作

2.1 逻辑移位

在嵌入式开发中,我们只涉及逻辑移位:不关心符号位,都是补 0 算术移位,需要分有符号型值和无符号型值:

  • 对于无符号型值,算术移位等同于逻辑移位。

  • 对于有符号型值 ,算术左移等同于逻辑左移;算术右移补的是符号位,正数补0,负数补1。

2.1.1 逻辑左移

int a = 0x123;  int b = a<<2;  // b=0x48C

2.1.2 逻辑右移

int a = 0x123;  int b = a>>2; // b=0x48

2.2 取反

unsigned int   a = 0x123;
unsigned int   b = ~a;   // b的每一位,都是a对应位的取反

2.3 位与


                
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值