当前位置: 首页 > news >正文

ARM 汇编基础

一、ARM架构

ARM芯片属于精简指令集计算机(RISC:Reduced Instruction Set Computing),它所用的指令比较简单,有如下特点:

  • 对内存只有读、写指令
  • 对于数据的运算是在CPU内部实现
  • 使用RISC指令的CPU复杂度小一点,易于设计

比如对于a=a+b这样的算式,需要经过下面4个步骤才可以实现:

在这里插入图片描述

细看这几个步骤,有些疑问:

  • 读a,那么a的值读出来后保存在CPU里面哪里?
  • 读b,那么b的值读出来后保存在CPU里面哪里?
  • a+b的结果又保存在哪里?

我们需要深入ARM处理器的内部。简单概括如下,我们先忽略各种CPU模式(系统模式、用户模式等等)。

算术逻辑单元(Arithmetic&logical Unit)是中央处理器(CPU)的执行单元,是所有中央处理器的核心组成部分。
在这里插入图片描述


CPU运行时,先去Flash上取得指令,再执行指令:

  • 把内存a的值读入CPU寄存器R0
  • 把内存b的值读入CPU寄存器R1
  • 把R0、R1累加,存入R0
  • 把R0的值写入内存a

怎么理解Flash上的指令?看下一节。


一个片上系统的最小组成部分如下:

在这里插入图片描述


二、 汇编指令

当前只介绍5条汇编指令:

  • 读内存:Load,LDR
  • 写内存:Store,STR
  • 加减法:ADD, SUB
  • 入栈:PUSH,实质上就是写内存STR
  • 出栈:POP,实质上就是读内存LDR
  • 跳转:BL,即 Branch And Link

在这里插入图片描述


其他知识:

  • CPU内部有 R0、R1、……、R15 共16个寄存器
  • 某些寄存器有特殊作用
    • R13,别名SP,栈寄存器,保存着栈的地址
    • R14,别名LR,返回地址,保存着函数的返回地址
    • R15,别名PC,程序计数器,也就是当期程序运行到哪了

在这里插入图片描述


要读内存:读内存哪个地址?读到的数据保存在哪里?读多少字节?

  • LDR R0, [R1, #0x00]
    • 源地址:R1+0x00,注意:不是读R1,是把R1的值当做内存的地址
    • 目的:R0,CPU的寄存器
    • 长度:4字节,LDR指令就是读4字节,LDRH是读2字节,LDRB是读1字节

在这里插入图片描述


要写内存:写内存哪个地址?从哪里得到数据?写多少字节?

  • STR R0, [R1, #0x00]
    • 目的地址:R1+0x00,注意:不是写R1,是把R1的值当做内存的地址
    • 源:R0,CPU的寄存器
    • 长度:4字节,STR指令就是读4字节,STRH是读2字节,STRB是读1字节
      在这里插入图片描述

加减法指令,不涉及内存操作,只在 CPU 寄存器上操作。

在这里插入图片描述


入栈:把CPU的寄存器的值,写到内存上

  • PUSH {R3, LR}

    • 源:CPU的寄存器R3、LR的值
    • 目的:内存,内存哪里?使用CPU的 SP(stack pointer)寄存器指定内存地址
    • 长度:大括号里所有寄存器的数据长度,每个寄存器4字节
    • 注意:低编号的寄存器,保存在内存的低地址处 ,即:高标号寄存器写入高地址的栈里,低标号寄存器写入低地址的栈里
    • 执行结果如下

    在这里插入图片描述

在这里插入图片描述


出栈:把内存中的数值,写到CPU的寄存器

  • POP {R3, PC}
    • 源:内存,内存哪里?使用CPU的 SP(stack pointer)寄存器指定内存地址

    • 目的:CPU的寄存器R3、PC的值

    • 长度:大括号里所有寄存器的数据长度,每个寄存器4字节

    • 注意:内存的低地址处的数据,写到CPU低编号的寄存器,即:高标号寄存器的内容来自高地址的栈,低标号寄存器的内容来自低地址的栈

    • 执行结果如下

      在这里插入图片描述

在这里插入图片描述


LR(R14)寄存器

  • 子程序的返回地址:从子程序返回后,主程序继续执行的指令的地址称为子程序的返回地址
  • LR也叫链接寄存器,用于存放子程序的返回地址。在要进入子程序之前,先将子程序的返回地址存入LR

在这里插入图片描述


相关文章:

  • CyberSploit:1
  • 【云原生 | 从零开始学istio】五、istio灰度发布以及核心资源
  • 数据结构篇-树与森林
  • fastdfs添加storage节点
  • java计算机毕业设计学生勤工助学管理系统源程序+mysql+系统+lw文档+远程调试
  • WebShell箱子简介与原理
  • 部署vue项目到阿里云服务器
  • Elasticsearch:Top metrics 聚合
  • C#重启 --- 语言基础
  • Word控件Spire.Doc 【文本】教程(7) ;C#获取Word文档中内容控件的别名、标签和ID
  • SpringCloud Gateway网关为认证中心和用户微服务构建统一的认证授权入口
  • 阿里云云边一体容器架构创新论文被云计算顶会 ACM SoCC 录用
  • 字节青训营抖音APP
  • DES加密算法是怎么实现的?
  • 面试题 17.04. 消失的数字
  • 【comparator, comparable】小总结
  • 【跃迁之路】【641天】程序员高效学习方法论探索系列(实验阶段398-2018.11.14)...
  • ERLANG 网工修炼笔记 ---- UDP
  • Gradle 5.0 正式版发布
  • js面向对象
  • leetcode46 Permutation 排列组合
  • Rancher如何对接Ceph-RBD块存储
  • underscore源码剖析之整体架构
  • vue-router的history模式发布配置
  • 阿里云购买磁盘后挂载
  • 安装python包到指定虚拟环境
  • 大整数乘法-表格法
  • 发布国内首个无服务器容器服务,运维效率从未如此高效
  • 工作中总结前端开发流程--vue项目
  • 基于Android乐音识别(2)
  • 聊聊flink的TableFactory
  • 前端每日实战:61# 视频演示如何用纯 CSS 创作一只咖啡壶
  • 前嗅ForeSpider中数据浏览界面介绍
  • 它承受着该等级不该有的简单, leetcode 564 寻找最近的回文数
  • CMake 入门1/5:基于阿里云 ECS搭建体验环境
  • 关于Android全面屏虚拟导航栏的适配总结
  • 如何通过报表单元格右键控制报表跳转到不同链接地址 ...
  • ​VRRP 虚拟路由冗余协议(华为)
  • ​低代码平台的核心价值与优势
  • # 数论-逆元
  • #android不同版本废弃api,新api。
  • $Django python中使用redis, django中使用(封装了),redis开启事务(管道)
  • (C#)Windows Shell 外壳编程系列9 - QueryInfo 扩展提示
  • (C语言)球球大作战
  • (Matalb时序预测)PSO-BP粒子群算法优化BP神经网络的多维时序回归预测
  • (NO.00004)iOS实现打砖块游戏(十二):伸缩自如,我是如意金箍棒(上)!
  • (PWM呼吸灯)合泰开发板HT66F2390-----点灯大师
  • (独孤九剑)--文件系统
  • (二十三)Flask之高频面试点
  • (附源码)spring boot校园拼车微信小程序 毕业设计 091617
  • (官网安装) 基于CentOS 7安装MangoDB和MangoDB Shell
  • (剑指Offer)面试题41:和为s的连续正数序列
  • (教学思路 C#之类三)方法参数类型(ref、out、parmas)
  • (免费领源码)Python#MySQL图书馆管理系统071718-计算机毕业设计项目选题推荐
  • (亲测)设​置​m​y​e​c​l​i​p​s​e​打​开​默​认​工​作​空​间...