【嵌入式开发——ARM】2ARM汇编指令

intel和ARM公司都有自己的指令集,也就是说对应的汇编格式是不同的,不过好在目前基本很少在汇编语言层面编程了,最次也是在C语言级编程,要不说C语言是高级语言呢,很多人觉得难,无非是指针觉得头疼,但其实指针是个极其好用而且不难的工具,其本质就是地址,这也帮助C语言天然契合嵌入式,对指针有困惑的同学,可以翻看我之前的博客,专门有一篇介绍指针。

虽然我们编程用的是C语言,实际在编译代码时,最终还是要先转为汇编再最终得到相应的二进制执行码,不过我们不用感知,这是编译器做的工作,但懂些汇编语言还是很有必要的,无论是帮助深刻理解嵌入式芯片,还是未来有机会来波汇编和C的混合编程,都是很有帮助的;下面介绍ARM架构使用的汇编指令。

1 ARM汇编指令集

指令与伪指令(汇编)
指令:就是CPU机器指令助记符,经过变异后会得到一串10组组成的机器码,可以由CPU读取执行;汇编指令=操作码+操作数;
伪指令:本质上不是指令(只不过和指令一起写在代码中),它是编译环境提供的,目的是用来指导编译过程,经过编译后伪指令最终不会生成机器码;
伪指令作用一般是:
仅在编译过程中起控制作用,不产生可执行目标代码;与机器指令代码无一一对应关系,只能被编译器识别,编译完成后,目标程序中不再出现伪指令。

宏指令
同样还是由编译器厂商提供
基本格式:label 指令;
label 是一个标签,要顶格写;指令 可以是汇编指令或伪指令;;是行注释
如 label EQU 数值
ARM官方指令风格一般大写,如LDR R0, [R1];GNU风格,指令一般用小写字母,Linux中常用,如:Idr r0, [r1]。

LDR/STR架构
ARM采用RISC架构,CPU本身不能直接读取内存,需要先将内存中内容加载到CPU通用寄存器中才能被CPU处理;
LDR指令将内存内容加载到通用寄存器;
STR指令将寄存器内容存到内存空间中;
LDR/STR组合用来实现ARM CPU和内存交换数据。

2 寻址方式

ARM指令格式
{}{s} , {, }
opcode: 操作码,是指令助记符,如MOV ADD SUB…
cond: condition条件,如果省略不写,表示该指令无条件(必须)执行
s: status表示该指令执行结果是否影响xPSR标志位
Rd: register destination 结果寄存器
Rn: 第一个运算操作寄存器
opcode2: 第二个运算操作数

立即数寻址
ADD R0, R0, #0x3F ; #后面的数值就是立即数
寄存器寻址
MOV R0, R1; R0=R1
寄存器移位寻址
MOV R0, R1, LSL #3; R1数值左移三位再赋给R0
寄存器间接寻址
LDR R0, [R1]; 相当于指针操作,把R1地址指向的内容,赋给R0
基址变址寻址
LDR R1, [R2, #4]; R2是基址,加上4,再取内容给R1,R1 = *(R2+4)
多寄存器寻址
LDMIA R1!, {R2-R7, R12}; 将R1指向的单元的数据依次读到R2-R7, R12中
STMIA R1!, {R2-R7,R12}; 将寄存器R2-R7, R12的值保存到R0指向的存储单元中
堆栈寻址
STMFD SP!, {R2-R7, LR}; 将寄存器列表中的寄存器(R2到R7,LR)存入堆栈
相对寻址(跳转相关)
BL NEXT

指令后缀
同一指令经常附带不同后缀,变成不同的指令,如:
B(byte)功能不变,操作长度变为8位;LDRB R1,R2;按Byte读取R2内容给R1
H(half Word)功能不变,长度变为16位;
!如果指令地址表达式中不含!后缀,则基址寄存器中的地址不会发生变化,指令中含有则变化

多指令流水线,为了加速处理器的执行效率,ARM采用多级流水线,以3级流水线为例:
PC ---- 取指
PC-4 ---- 译码
PC-8 ---- 执行

3 常用ARM指令

1.数据处理指令
数据传输:MOV MON
算数指令:ADD SUB RSB ADC SBC RSC
逻辑指令:AND OR EOR BIC
比较指令:CMP CMN TST TEQ
乘法指令:MVL MLA UMULL UMLAL SUMLL SMLAL
前导零计数:CLZ

2.CPSR访问指令
MRS用来读CPSR,MSR用来写CPSR

3.跳转指令
B & BL & BX
B:直接跳转
BL:跳转前把返回地址存到LR中
BX:跳转同时转换为ARM模式,一般用于异常处理的跳转

4.访存指令
LDR/STR & LDM/STM &SWP
单字/半字/字节访问 LDR/STR
多字节批量访问 LDM/STM
SWP R1, R2, [R0] 将R0指向的存储器中断 字数据传输到R1,同时将R2中的数据传输到R0所指向的内存单元
SWP R1, R1, [R0] 该指令将R0所指向的数据与R1中的数据互换

5.软中断指令
swi:一般用来实现操作系统中的系统调用

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/10331.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

ctfshow-web入门-反序列化(web265-web270)

目录 1、web265 2、web266 3、web267 4、web268 5、web269 6、web270 1、web265 很简单的一个判断,满足 $this->token$this->password; 即可 由于 $ctfshow->tokenmd5(mt_rand()) 会将 token 随机为一个 md5 值,我们使用 & 绕一下&am…

【STL】queue,stack的底层实现

在前面的介绍中我们已经知道了queue和stack是一个容器适配器,它并没有被划分到容器的行列,它只是对其他容器的再封装,在STL中queue和stack默认使用的容器是deque 在数据结构的学习中,我们知道stack和queue可以使用顺序表和链表实现…

Tomcat安装和配置(超详细)

一、Tomcat安装准备 1、tomcat下载 1.1、百度网盘链接下载 链接:https://pan.baidu.com/s/1uceOKe_QcpSQ6yhNxi4T5g?pwd1234 提取码:1234 1.2、官网在线下载 Tomcat官网:https://tomcat.apache.org/download-80.cg…

Ozone调试WSL系统的STM32编译文件配置

文章目录 背景步骤Ozone新建工程流程配置Ozeon找到WSL的代码文件ozone字体调整快速在Ozone中定位到代码文件参考 背景 在使用WSL进行嵌入式软件开发的时候,在debug方面,比较好用的工具有Ozone,那在Windows下调试需要配置和注意的点&#xff…

洛谷 P2239 [NOIP2014 普及组] 螺旋矩阵

本文由Jzwalliser原创,发布在CSDN平台上,遵循CC 4.0 BY-SA协议。 因此,若需转载/引用本文,请注明作者并附原文链接,且禁止删除/修改本段文字。 违者必究,谢谢配合。 个人主页:blog.csdn.net/jzw…

python通过usb连接标签打印机-开源的

背景: 最近接到了一个新需求,单位想做一个ERP系统,想把打印机一起兼容进去,实现自动化打印工作。主要我是做爬虫的没接触过这些,就到网上搜索了很多先关资料,最终发现,一大堆全都是什么VIP的才能…

Codeforces Round 984 (Div. 3)

题目链接 A. Quintomania 题意 思路 模拟即可 示例代码 void solve() {int n;cin >> n;vector<int>arr(n);fer(i, 0 ,n) cin >> arr[i];fer(i, 1, n){if(abs(arr[i] - arr[i - 1]) ! 5 && abs(arr[i] - arr[i - 1]) ! 7){cout << "N…

【2】GD32H7xx 串口Idle + DMA接收不定长数据

目录 1. IDLE中断相关介绍2. D-Cache与DMA同时使用2.1 I-Cache与D-Cache2.2 D-Cache与DMA同时使用时的数据一致性问题2.2.1 CPU读取DMA写入到SRAM的数据2.2.2 DMA读取CPU写入到SRAM的数据 3. Uart Idle DMA收发程序4. 程序测试 1. IDLE中断相关介绍 在 GD32H7xx MCU 中&#…

python数据结构基础(8)

今天来使用python实现二叉树,二叉树中每个节点都是Node类对象,通过Tree类中的add()方法逐个向二叉树中加入树节点,构成完全二叉树或者非完全二叉树,代码如下: class Node(object):"""树节点类&#xff0c;用于构建二叉树。Attributes:- val: 节点存储的值。- r…

IEEE 1588:电信网络的精确时间协议 (PTP)

IEEE 1588&#xff1a;电信网络的精确时间协议 IEEE 1588 PTP 概述PTP 协议特征同步类型IEEE 1588 PTP 角色IEEE 1588 PTP 的工作原理PTP 设备类型PTP 消息类型事件消息一般信息 PTP 时钟类规范PTP 配置文件 https://www.techplayon.com/ieee-1588-precision-time-protocol-ptp…

深度学习基础—了解词嵌入

引言 上图是使用one-hot向量表示词向量的一种方式&#xff0c;这种表示方式优点是方面简洁&#xff0c;但是缺点也很明显&#xff0c;就是词与词之间独立性太强&#xff0c;没有关联&#xff0c;这样使得算法对相关词的泛化能力不强。 举个例子&#xff0c;假如我们已经学习到了…

实战:索引的命中机制

在 SQL Server 中,查询是否能命中索引(即是否能使用 Index Seek)取决于多个因素,包括索引的结构、查询条件的排列、和数据库优化器的策略。以下是一些常见的命中索引和不能命中索引的情况,及其详细解释: 一、命中索引的情况 1. 前导列匹配(典型的命中索引场景) 索引结…

Mac 安装protobuf2.5.0

文章目录 一、修改platform_macros.h二、编译protobuf三、配置环境变量四、测试 一、修改platform_macros.h platform_macros.h的目录位置为/Users/xxxx/protobuf-2.5.0/src/google/protobuf/stubs 在platform_macros.h中增加如下代码 #elif defined(__arm64__) #define GOOG…

ubuntu24.04安装matlab失败

又是摸鱼摆烂的一天&#xff0c;好难过&#xff5e; 官方教程&#xff1a;https://ww2.mathworks.cn/help/install/ug/install-products-with-internet-connection.html 问题描述&#xff1a;https://ww2.mathworks.cn/matlabcentral/answers/2158925-cannot-install-matlab-r2…

python使用turtle画图快速入门,轻松完成作业练习

turtle介绍 turtle是一个绘图库&#xff0c;可以通过编程进行绘图。其模拟了一个乌龟在屏幕上的运动过程。该库通常用于给青少年学习编程&#xff0c;当然&#xff0c;也可以使用其进行作图。 在一些学校中&#xff0c;可能在python学习的课程中&#xff0c;要求完成turtle绘…

智能 AI 视觉识别系统打造高效流量统计方案

智能AI视觉算法解决方案&#xff0c;涵盖客流人数统计、车流量统计、牲畜养殖场计数、物品点包计数、超员报警、火焰识别报警及驾驶行为报警等功能。可精准统计商场、车站等地客流&#xff0c;区分车型统计车流量并预警拥堵&#xff0c;准确计数牲畜及物品&#xff0c;检测工厂…

UVa514 解析:火车车厢重排序问题的模拟栈实现

来源:UVa514 铁轨 Rails。 这是一个火车车厢重排序的问题,通过模拟栈操作的算法实现。这种算法非常适用于具有栈结构特性的问题,比如括号匹配、货物堆放、编译器中语法检查。本文给出了C++的两种代码实现和Python的一种实现。 题目描述 某城市有一个火车站,铁轨铺设如图。…

ENSP OSPF和BGP引入

路由协议分为&#xff1a;内部网关协议和外部网关协议。内部网关协议用于自治系统内部的路由&#xff0c;包括&#xff1a;RIP和OSPF。外部网关协议用于自治系统之间的路由&#xff0c;包括BGP。内部网关协议和外部网关协议配合来共同完成网络的路由。 BGP:边界网关路由协议(b…

华为OD机试真题-矩形绘制

题目描述 实现一个简单的绘图模块&#xff0c;绘图模块仅支持矩形的绘制和擦除 当新绘制的矩形与之前的图形重善时&#xff0c;对图形取并集 当新擦除的矩形与之前的图形重善时&#xff0c;对图形取差集 给定一系列矩形的绘制和擦除操作&#xff0c;计算最终图形的面积。下…

Android下的系统调用 (syscall),内联汇编syscall

版权归作者所有&#xff0c;如有转发&#xff0c;请注明文章出处&#xff1a;https://cyrus-studio.github.io/blog/ 什么是系统调用 (syscall) 系统调用是操作系统提供给应用程序的一组接口&#xff0c;允许用户空间程序与内核进行交互。 在 Android&#xff08;基于 Linux …