ARMday02(汇编语法、汇编指令)
汇编语法
汇编文件中的内容
1.伪操作:在汇编程序中不占用存储空间,但是可以在程序编译时起到引导和标识作用 .text .global .glbal .if .else .endif .data .word....
2.汇编指令:每一条汇编指令都用来标识一个机器码,让计算机做一个指令运算
数据处理指令
数据搬移指令
算数运算指令
数据移位指令
位运算指令
数据比较指令
跳转指令
内存读写指令
状态寄存器传送指令 CPSR
软中断指令
3.伪指令:不是汇编指令,但是也可以让处理器做一些数据处理,通常一条伪指令会由多条汇编指令联合实现
4.注释
单行注释: @ ;
多行注释: /* */
条件注释 .if 1/0 指令段1 .else 指令段2 .endif
汇编指令的基本语法格式
指令的基本格式: <opcode> {<cond>} {s} <Rd>, <Rn>, <shifter_operand>
<opcode>:指令的操作码
cond:条件码后缀
s:指令的执行结果将会影响CPSR中的条件标志位。
<Rd>:目标寄存器,指令的运算结果保存在目标寄存器中
<Rn>:第一操作寄存器,只能是寄存器
<shifter_operand> :第二操作数,既可以是寄存器编号,又可以是立即数
意义:让第一操作寄存器中的值和第二操作数按照指令操作码进行运算,并且将运算的结果保存在目标寄存器中
注意:
1.一般一条汇编指令就占据一行代码
2.汇编不区分大小写
3.操作数前面要跟一个#

汇编指令
数据搬移指令
<opcode> {<cond>} {s} <Rd>, <shifter_operand>
解释:
<opcode>:指令的操作码
cond:条件码后缀
s:指令的执行结果将会影响CPSR中的条件标志位。
<Rd>:目标寄存器,指令的运算结果保存在目标寄存器中
<shifter_operand> :第一操作数,既可以是寄存器编号,又可以是立即数
指令码:
mov:将操作数直接搬移到目标寄存器中
mvn:将操作数按位取反之后搬移到目标寄存器中

立即数的概念
定义:可以直接当作指令的一部分去执行的数据叫做立即数。立即数是通过一个0-255之间的数字循环右移偶数位获取(循环右移:低位移除,补到高位)
立即数的判断
如何判断一个数据是不是立即数: 只要让这个数据或者这个数据按位取反的值循环右移偶数位,能够得到一个0-255范围内的数字就说明这个数是立即数
如何将一个非立即数保存在寄存器中
利用伪指令ldr即可完成非立即数的操作
格式: ldr 目标寄存器名,=数据

移位操作指令
格式: <opcode> {<cond>} {s} <Rd>, <Rn>, <shifter_operand>
解释:将第一操作寄存器的数值移位第二操作数位,将结果保存在目标寄存器中
指令码:
lsl:左移运算,最高位移出,最低位补0
lsr:右移运算,最低位移出,最高位补0
ror:循环右移:最低位移出,补到最高位
位运算指令
与、或、异或、按位清0
格式: <opcode> {<cond>} {s} <Rd>, <Rn>, <shifter_operand>
指令码:
and:进行按位与
orr:进行按位或
eor:按位异或
bic:按位清0
算数运算指令
格式: <opcode>{<cond>}{s} <Rd>, <Rn>, <shifter_operand>
指令码: add:加法运算 Rd=Rn+shifter_operand
adc:进行加法运算时考虑CPSR的C位 Rd=Rn+shifter_operand+CPSR[c]
sub:减法运算 Rd=Rn-shifter_operand
sbc:进行减法运算时考虑CPSR的c位 Rd=Rn-shifter_operand-!CPSR[c]
RSB :逆向减法Rd=shifter_operand-Rn
RSC:带借位的逆向减法指令 Rd = shifter_operand – Rn - !CPSR[c]
mul:乘法运算 Rd=Rn*shifter_operand
进行64位算数运算
MOV R1,#0xfffffffe @第一个数据的低32位
mov r2,#0x00000004 @第一个数据的高32位
MOV R3,#0x00000005 @第二个数据的低32位
mov r4,#0x00000004 @第二个数据的高32位
加法:
低32位: adds r5,r1,r3
高32位: adc r6,r2,r4
数据比较指令
格式: cmp <Rn>, <shifter_operand>
比较指令的本质: 拿第一操作寄存器和第二操作数进行减法运算,并且减法运算的结果会影响到CPSR的条件位
可以根据比较指令之后的条件位的数值进行不同的运算,相当于c里的选择语句 这里需要对CPSR的条件位进行判断,我们依赖条件位的助记词{cond}后缀实现


跳转指令
一般实现程序的跳转有两种方式: 1.直接修改PC的值 2.通过跳转指令
1.b label 解释:跳转到label标签所在代码,此时跳转,lr寄存器不保存返回地址
2. bl label 解释:跳转到label标签所在代码,此时跳转,lr寄存器保存返回地址
3. bx 地址 跳转到地址对应的的指令位置,此时跳转LR不保存返回地址
4.blx 地址 跳转到地址对应的的指令位置,此时跳转LR保存返回地址
今日任务:
.text
.globl _start
/*累加1-100*/
_start:mov r0,#0@summov r1,#0@累加的值mov r2,#12@标记位add r1, r1,#1add r0,r0,r1cmp r1,#100beq stopbne continuefuncontinuefun:bx r2stop:b stop
.end
another
.text
.globl _start
/*累加1-100*/
_start:mov r0,#0@summov r1,#0@累加的值continuefun:add r1, r1,#1add r0,r0,r1cmp r1,#100beq stopbne continuefunstop:b stop
.end
相关文章:
ARMday02(汇编语法、汇编指令)
汇编语法 汇编文件中的内容 1.伪操作:在汇编程序中不占用存储空间,但是可以在程序编译时起到引导和标识作用 .text .global .glbal .if .else .endif .data .word.... 2.汇编指令:每一条汇编指令都用来标识一个机器码,让计算机做…...
docker容器中运行jar 出现invalid or corrupt jarfile
1,背景: 在本地java开发完毕之后,想要打包成docker镜像,方便安装。由于本地没有docker环境,也懒得装了。有一台测试的linux机器可以使用,所以先在本地打包生成xxx.jar,然后拷贝到有docker环境的…...
PHP+MySQL人才招聘小程序系统源码 带完整前端+后端搭建教程
在当今竞争激烈的人才市场中,招聘平台的需求日益增长。传统的招聘平台往往需要投入大量的人力物力进行维护和管理,这对于许多中小企业来说是一个沉重的负担。因此,开发一个简单易用、高效便捷的招聘平台显得尤为重要。 PHP是一种流行的服务器…...
MongoDB常用的语句
mongodb 可视化工具: Robo3T。 DataGrip,对mongodb的日期格式不友好。 MongoDB常用的语句: 注意,凡是涉及到日期类型的,最好都用这种格式 ISODate(“2023-03-27T16:00:00.000Z”) MongoDB倒序,查询&am…...
MIPSsim模拟器 使用说明
(一) 启动模拟器 双击MIPSsim.exe,即可启动该模拟器。模拟器启动时,自动将自己初始化为默认状态。所设置的默认值为: u所有通用寄存器和浮点寄存器为全0; u内存清零; u流水寄存器为全0ÿ…...
javascript用localStorage存储用户搜索词记录,并在搜索框下展显搜索词记录
//首先是storage的一封装 //storage.js文件 function storage(){//设置storage密钥this.ms"mystorage";}//以下为函数的原型方法//获得localStorage值storage.prototype.getLocalfunction(key){//先检查设置的localStorage的密钥var mydatalocalStorage.getItem(thi…...
20231108在Ubuntu22.04下编译安装cmake-3.27.7.tar.gz
20231108在Ubuntu22.04下编译安装cmake-3.27.7.tar.gz 2023/11/8 17:28 缘起,编译cv180zb的时候提示说cmake的版本低! OBJCOPY platform/generic/firmware/payloads/test.bin OBJCOPY platform/generic/firmware/fw_dynamic.bin OBJCOPY platfor…...
如此理解sed会简单
缘由 以前总觉得sed的语法过于难懂,用的时间都不一定会想起来怎么用。 每次都需要先查找帮助,然后才能应用,但随后又忘 😦 直到今天通过man sed链接到sed官网上对sed的介绍,才明白它竟然是如此的简单明了࿰…...
数据库-MySQL之数据库必知必会1-9章
检索数据 1.检索不重复的行 从 Customers 表中检索所有的 ID select DISTINCT cust_id from Customers;DISTINCT表示去掉重复的行 2.限制结果-分页 SELECT语句返回所有匹配的行,它们可能是指定表中的每个行。为了返回第一行或前几行,可使用LIMIT子句。…...
Selenium+Python自动化测试环境搭建
selenium python 自动化测试 —— 环境搭建 关于 selenium Selenium 是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作一样。支持的浏览器包括IE(7、8、9)、Mozilla Firefox、Mozilla Suite等。 Selenium 框架底层使用JavaS…...
k8s存储卷 PV和PVC
目录 emptyDir存储卷 hostPath存储卷 nfs共享存储卷 PVC 和 PV 生命周期 一个PV从创建到销毁的具体流程如下: 静态pvc 动态pvc 3、定义PVC 4、测试访问 搭建 StorageClass NFS,实现 NFS 的动态 PV 创建 1、在stor01节点上安装nfs࿰…...
【架构】后端项目经典分层架构介绍
文章目录 前言分层架构项目实践示例项目结构 其他知识 前言 开发后端项目时,我们最常见的一种架构模式就是分层架构 。 所谓的分层架构,就是把系统自上而下分为多个不同的层,每一层都有特定的功能和职责,且只和自己的直接上层与…...
二叉树的中序遍历
一、题目。 给定一个二叉树的根节点 root ,返回 它的 中序 遍历 。 示例 1: 输入:root [1,null,2,3] 输出:[1,3,2] 示例 2: 输入:root [] 输出:[] 示例 3: 输入:…...
什么是代理IP池?真实测评IP代理商的IP池是否真实?
代理池充当多个代理服务器的存储库,提供在线安全和匿名层。代理池允许用户抓取数据、访问受限制的内容以及执行其他在线任务,而无需担心被检测或阻止的风险。代理池为各种在线活动(例如网页抓取、安全浏览等)提高后勤保障。 读完…...
接收表单数据
如果您尝试按下提交按钮,浏览器将显示“Method Not Allowed”错误。这是因为到目前为止,前一节中的登录视图函数完成了一半的工作。它可以在网页上显示表单,但是还没有逻辑来处理用户提交的数据。这是Flask-WTF使工作变得非常简单的另一个领域…...
串口通信(11)-CRC校验介绍算法
本文为博主 日月同辉,与我共生,csdn原创首发。希望看完后能对你有所帮助,不足之处请指正!一起交流学习,共同进步! > 发布人:日月同辉,与我共生_单片机-CSDN博客 > 欢迎你为独创博主日月同…...
什么是Java虚拟机(JVM),它的作用是什么?
什么是Java虚拟机(JVM) Java虚拟机(Java Virtual Machine,JVM)是Java平台的关键组成部分,它是一种在不同操作系统上运行Java程序的虚拟计算机。 JVM的作用是执行Java字节码(Java bytecode&#…...
力扣876:链表的中间结点
力扣876:链表的中间结点 题目描述: 给你单链表的头结点 head ,请你找出并返回链表的中间结点。 如果有两个中间结点,则返回第二个中间结点。 示例 1: 输入:head [1,2,3,4,5] 输出:[3,4,5]…...
三菱FX3U系列—原点回归指令
目录 一、简介 二、指令形式 1、原点指令[ZRN/DZRN] 2、带搜索的原点回归指令[DSZR] 三、回归指令运行过程 1、ZRN原点回归运行过程 2、带搜索的原点回归运行过程 四、特殊辅助继电器 五、特殊输出模块 六、总结 一、简介 用于将电机或伺服驱动器控制的轴回到预定的原…...
ES常用查询命令
一、基本命令 1、获取所有_cat命令 curl -X GET localhost:9200/_cat 2、获取es集群服务健康状态 curl -X GET localhost:9200/_cat/health?v epoch: 时间戳的 Unix 时间戳格式,表示快照生成的时间。 timestamp: 可读性更强的时间戳格式,表示快照生…...
如何在 Go 方法中正确修改切片类型
Go 中切片是引用类型但本身按值传递,若要在方法内修改原始切片,必须使用指针接收者并直接赋值给解引用后的接收者(test append(test, x)),而非重新赋值指针变量。 go 中切片是引用类型但本身按值传递,…...
Qianfan-OCR入门必看:Apache 2.0协议下商用部署与微调合规操作指南
Qianfan-OCR入门必看:Apache 2.0协议下商用部署与微调合规操作指南 1. 项目概述 Qianfan-OCR是百度千帆推出的开源端到端文档智能多模态模型,基于4B参数的Qwen3-4B语言模型构建。作为Apache 2.0协议下的开源项目,它提供了完整的商用授权和微…...
Dify医疗环境零信任配置全图解:从患者ID加密到API网关mTLS双向认证,含12个生产级YAML模板
第一章:Dify医疗安全配置的合规基线与威胁建模在医疗AI应用落地过程中,Dify平台的安全配置必须严格遵循《GB/T 35273—2020 信息安全技术 个人信息安全规范》《HIPAA Security Rule》及《医疗器械软件注册审查指导原则》等多维合规要求。合规基线并非静态…...
从生物神经元到人工神经网络:演化与深度学习革命
1. 从生物神经元到人工神经网络的演化之路"我们正在用硅基电路模拟碳基智慧的本质。"——Geoffrey Hinton1943年,当Warren McCulloch和Walter Pitts在《数学生物物理学通报》上发表那篇开创性论文时,他们可能没想到自己正在为一场持续至今的认…...
激活函数可视化对比:用Python和Matplotlib亲手绘制sigmoid、tanh、ReLU及其梯度图
激活函数可视化实战:用Python绘制并解析神经网络核心组件 在深度学习的世界里,激活函数如同神经网络的"灵魂",它们决定了神经元是否应该被激活以及激活到什么程度。对于初学者来说,理解这些函数的特性往往停留在数学公式…...
STM32F4时钟配置避坑指南:从HAL库的HAL_RCC_OscConfig到180MHz超频实战
STM32F4时钟配置避坑指南:从HAL库的HAL_RCC_OscConfig到180MHz超频实战 对于嵌入式开发者而言,STM32F4系列微控制器的时钟系统就像是一台精密的瑞士钟表,每一个齿轮的咬合都需要精确计算。当项目需求从常规的168MHz跃升至180MHz时,…...
ROS1 Melodic下,slam_toolbox地图序列化与反序列化实战:拯救建图中断,实现地图增量更新
ROS1 Melodic下slam_toolbox地图序列化与反序列化实战:工程救急与效率革命 当你花费三小时构建的仓库地图因程序崩溃而消失,或是环境布局调整导致原有地图失效时,那种从头再来的绝望感每个SLAM开发者都深有体会。slam_toolbox的序列化功能正是…...
Entity Framework Core 10原生向量搜索实战(含Azure SQL PGVector双路径部署手册)
第一章:Entity Framework Core 10向量搜索扩展概览与核心价值Entity Framework Core 10正式引入原生向量搜索支持,标志着ORM框架首次在查询层深度集成语义检索能力。该扩展并非简单封装向量数据库API,而是将向量相似度计算(如余弦…...
智能送餐车的设计(有完整资料)
资料查找方式:特纳斯电子(电子校园网):搜索下面编号即可编号:T1632305M设计简介:本设计是基于STM32的智能送餐桌,主要实现以下功能:1.实现送餐车的移动、菜品点餐,菜品上…...
终极Windows安装指南:如何用MediaCreationTool.bat轻松绕过硬件限制
终极Windows安装指南:如何用MediaCreationTool.bat轻松绕过硬件限制 【免费下载链接】MediaCreationTool.bat Universal MCT wrapper script for all Windows 10/11 versions from 1507 to 21H2! 项目地址: https://gitcode.com/gh_mirrors/me/MediaCreationTool.…...
