Linux 学习记录52(ARM篇)

Linux 学习记录52(ARM篇)

在这里插入图片描述

本文目录

  • Linux 学习记录52(ARM篇)
  • 一、汇编语言相关语法
    • 1. 汇编语言的组成部分
    • 2. 汇编指令的类型
    • 3. 汇编指令的使用格式
  • 二、基本数据处理指令
    • 1. 数据搬移指令
      • (1. 格式
      • (2. 指令码类型
      • (3. 使用示例
    • 2. 立即数
      • (1. 一条指令的组成
    • 3. 移位操作指令
      • (1. 格式
      • (2. 指令码类型
      • (3. 使用示例
    • 4. 位运算指令
      • (1. 格式
      • (2. 指令码
      • (3. 运算规则
      • (4. 使用示例
      • (5. 练习
    • 5. 算数运算指令
      • (1. 格式
      • (2. 指令码
      • (3. 使用示例
      • (4. 关于32位的处理器进行64位数据的运算原理
    • 6. 比较指令
      • (1. 概述
      • (2. 比较指令结果的条件码
      • (3. 使用示例
    • 7. 跳转指令
      • (1. 概述
      • (2. 不保存返回地址
      • (3. 跳转之前保存返回地址
  • 练习
    • 1. 实现1-100的累加

一、汇编语言相关语法

1. 汇编语言的组成部分

1.伪操作不参与到程序的执行,但是可以告诉编译器程序应该怎么执行,或者程序中每一个部分有什么含义.text .global  .globl .end  .if .else .endif   
2.汇编指令编译器将一条汇编指令编译成一条机器码,执行指令后可以让ALU做出对应的运算操作,实现特定的功能
3.伪指令不是汇编指令,但是可以起到和汇编指令一样的作用,通常一条伪指令的实现需要多条汇编指令一起完成4.汇编里的注释:单行注释:使用@  其他架构下的汇编单行注释 可能会使用';'多行注释:/**/条件注释:根据if后面的数值真假来去执行不同的指令段,如果为真,执行指令段1,否则执行指令段2.if 数值指令段1.else指令段2.endif                

2. 汇编指令的类型

  1. 基本的数据处理指令
  1. 数据搬移指令
  2. 数据移位指令
  3. 算数运算指令
  4. 位运算指令
  5. 比较指令
  1. 跳转指令
  2. 内存读写指令
  3. 程序状态寄存器读写指令
  4. 软中断指令

3. 汇编指令的使用格式

格式:opcode{cond}{s}  Rd, Rn, shifter_operand解释:
opcode : 指令码  
cond : 条件码  默认汇编指令是无条件执行的,使用条件码之后可以让汇编有条件的执行
s: 状态位  指令的执行结果会影响cpsr的NZCV位   
Rd : 目标寄存器 运行的结果放到目标寄存器
Rn : 第一个操作寄存器,只能是一个寄存器shifter_operand : 第二个操作数 1> 可以是一个普通的寄存器2> 可以是一个立即数3> 可以是经过移位操作的寄存器
opcode{cond}{s} : 连到一起写
Rd, Rn, shifter_operand : 使用逗号隔开
opcode{cond}{s}和Rd, Rn, shifter_operand直接使用空格隔开一条汇编指令占一行;
汇编代码中不严格区分大小写: 

二、基本数据处理指令

1. 数据搬移指令

(1. 格式

opcode{cond}{s}    Rd,       shifter_operand
指令码           目标寄存器      操作数

(2. 指令码类型

1. mov:将操作数搬移到寄存器中
2. mvn:将操作数按位取反后搬移到目标寄存器中

(3. 使用示例

.text   
.global _start
_start:mov r0,#0XFF  @将0XFF搬移到r0寄存器中mvn r1,#0XFF  @将0XFF按位取反结果存放到R1寄存器中stop:b stop   
.end 

在这里插入图片描述
在这里插入图片描述

2. 立即数

能够当作指令的一部分去执行的数据叫做立即数。一个立即数可以通过一个0-255之间的数字进行循环右移得到

如何判断一个数据是不是立即数:
在0-255内找到一个数据,将数据循环右移偶数位,如果能够得到这个数据,就说明这个数据是一个立即数
ex1:0X104->二进制:0000 0000 0000 0000 0000 0001 0000 0100
找到一个0-255范围内的数:0000 0000 0000 0000 0000 0000 0100 0001——》0X41
0x41循环右移30位可以得到0X104,所以0X104就是立即数ex:0X101->二进制:0000 0000 0000 0000 0000 0001 0000 0001

(1. 一条指令的组成

在32位下一条指令大小为32字节

[0:7] "0-255的数据 进行循环右移的数据,通过这个数据循环右移偶数位可以得到第二操作数"
[8:11] "低八位循环右移的偶数位对应拖偶数由这个区间的数值*2得到"
[12:15] "Rd 目标寄存器标识"
[16:19] "Rn 操作寄存器标识"
[20:21] "s 状态位"
[22:25] "opcond 指令码"
[26:27] "001"
[28:31] "cond 条件码"

注意:对于立即数的判断,如果数据mov指令的操作数>0XFFFF0000,则在计算机处理时,按照MVN指令进行判断
在这里插入图片描述

可以使用伪指令
在这里插入图片描述

3. 移位操作指令

(1. 格式

格式:opcode{cond}{s}  Rd, Rn, shifter_operand解释:
opcode : 指令码  
cond : 条件码  默认汇编指令是无条件执行的,使用条件码之后可以让汇编有条件的执行
s: 状态位  指令的执行结果会影响cpsr的NZCV位   
Rd : 目标寄存器 运行的结果放到目标寄存器
Rn : 第一个操作寄存器,只能是一个寄存器shifter_operand : 第二个操作数 

(2. 指令码类型

1. 左移运算 低位补0
2. lsr:右移运算  高位补0
3. ror:循环右移  低位移出的数据补到最高位

(3. 使用示例

.text   
.global _start   _start:mov r0,#0XFFlsl r1,r0,#4  @ 将r0的值左移4位结果放到r1中 R1==0XFF0lsr r2,r0,#4  @将r0的值右移4位结果放到r2中 R2==0XFror r3,r0,#4   @ 将r0的值循环右移4位结果放到r3中 R3==0XF000000F
stop:b stop   
.end  

在这里插入图片描述

4. 位运算指令

(1. 格式

格式:opcode{cond}{s}  Rd, Rn, shifter_operand解释:
opcode : 指令码  
cond : 条件码  默认汇编指令是无条件执行的,使用条件码之后可以让汇编有条件的执行
s: 状态位  指令的执行结果会影响cpsr的NZCV位   
Rd : 目标寄存器 运行的结果放到目标寄存器
Rn : 第一个操作寄存器,只能是一个寄存器shifter_operand : 第二个操作数 

(2. 指令码

1. and:按位与  与0清0,与1不变
2. orr:按位或  或1置1 或0不变
3. eor:按位异或  相同为0 不同为1
4. bic:按位清0  想要哪一位设置为0,只需要将这一位用bic指令和相同位为1的数进行运算

(3. 运算规则

在这里插入图片描述

(4. 使用示例

.text   
.global _start   _start:mov r0,#0XFFand r1, r0,#0XF  @r1==0XForr r2,r0,#0XF00  @r2==0XFFFeor r3,r0,#0XF  @R3==0XF0bic r4,r0,#0X14 @R4==0XEB       
stop:b stop   
.end  

在这里插入图片描述

(5. 练习

LDR r0,=0X123456780001 0010 0011 0100 0101 0110 0111 1000
1.将r0寄存器的第4位清0,其他位不变
bic r0,r0,#(1<<4)
或者
and r0,r0,#(~(1<<4))2.将R0寄存器的第7位置1,其他位不变orr r0,r0,#(1<<7)3.将r0寄存器的第[31:28]0,其他位不变
bic r0,r0,#(0XF<<28)4.将r0寄存器第[7:4]位置1,其他位不变
ORR r0,r0,#(0XF<<4)5.将R0寄存器的第[15:11]位设置为10101,其他位不变
思路:把指定的几位设置为特定的数值,先把这几位清0,在赋值
BIC r0,r0,#(0X1F<<11)@先清0
ORR r0,r0,#(0X15<<11)@再赋值

5. 算数运算指令

(1. 格式

格式:opcode{cond}{s}  Rd, Rn, shifter_operand解释:
opcode : 指令码  
cond : 条件码  默认汇编指令是无条件执行的,使用条件码之后可以让汇编有条件的执行
s: 状态位  指令的执行结果会影响cpsr的NZCV位   
Rd : 目标寄存器 运行的结果放到目标寄存器
Rn : 第一个操作寄存器,只能是一个寄存器shifter_operand : 第二个操作数 

(2. 指令码

1. add :进行加法运算
2. adc:进行加法运算的时候考虑到CPSR的c位 
3. sub:进行减法运算
4. sbc:进行减法运算时考虑到CPSR的C位
5. mul:乘法运算

(3. 使用示例

1.加法1:MOV r0,#1mov r1,#3add r2,r0,r1 @将r0+r1的结果存放r2寄存器
2.加法2:MOV r0,#0XFFFFFFFEmov r1,#3adds r2,r0,r1 @将r0+r1的结果存放r2寄存器,+s结果进位就会影响到CPSR的c位3.减法运算
MOV r0,#3mov r1,#0XFFFFFFFEsubs r2,r0,r1 @将r0-r1的结果存放r2寄存器

(4. 关于32位的处理器进行64位数据的运算原理

原理:一个64位的数据放在两个寄存器中,分别存放这个数据的高64位以及低64位
进行64位数据运算时,将两个64位数据的低32位运算,高32位运算以加法为例子:MOV r0,#0X3  @第一个64位数的低32位 mov r1,#0X1 @第一个数的高32位mov r2,#0XFFFFFFFE @第2个64位数的低32位mov r3,#0X4 @第二个64位数据的高32位adds r4,r0,r2 @两个低32位数运算,结果影响到CPSR的C位adc r5,r1,r3 @两个高32位数据运算,结果存放在r5中,考虑到C位

6. 比较指令

(1. 概述

格式:
opcode Rn, shifter_operand
opcode:比较指令的指令码是cmp
功能:将第一操作寄存器和第二操作数的值进行比较
本质:比较指令的本质就是拿进行比较的两个数值进行减法运算,并且减法运算的结果会影响到CPSR的条件位
我们可以根据条件位的数值进行两个数值的判断,再根据判断的结果做不同的操作
一般比较指令和条件码都是一起使用的

(2. 比较指令结果的条件码

条件码助记符后缀标志含义
0000eqz置位相等
0001nez清零不相等
0010csc置位无符号数大于或等于
0011ccc清零无符号数小于
0100min置位负数
0101pln清零正数或零
0110vsv置位溢出
0111vcv清零未溢出
1000hic置位z清零无符号数大于
1001lsc清零z置位无符号数小于或等于
1010gen等于v带符号数大于或等于
1011ltn不等于v带符号数小于
1100gtz清零且n等于v带符号数大于
1101lez置位或n不等于v带符号数小于或等于
1110al忽略无条件执行

(3. 使用示例

.text   
.global _start   _start:MOV r0,#0X3  mov r1,#0X1 cmp r0,r1  @数值比较@根据比较的结果执行不同的指令addeq  r2,r1,r0  @如果两个数相等,两数相加,将结果保存至r2中subcs r3,r0,r1  @如果r0>=r1,就做减法运算,将结果保存在r3寄存器mulcc r4,r0,r1 @如果r0<r1,就做乘法运算,结果保存在r4寄存器中
stop:b stop   
.end  

在这里插入图片描述

7. 跳转指令

(1. 概述

格式:
opcode{cond} label
功能:跳转到指定的标签下功能码:
1. b :跳转到指定的标签下,返回地址不保存
2.bl:跳转到指定的标签下,返回地址保存至 LR寄存器中

(2. 不保存返回地址

.text   
.global _start   _start:MOV r0,#0X3  mov r1,#0X1 b fun  @跳转到fun标签cmp r0,r1  @数值比较@根据比较的结果执行不同的指令addeq  r2,r1,r0  @如果两个数相等,两数相加,将结果保存至r2中subcs r3,r0,r1  @如果r0>=r1,就做减法运算,将结果保存在r3寄存器mulcc r4,r0,r1 @如果r0<r1,就做乘法运算,结果保存在r4寄存器中
fun:mov r3,#3mov r4,#4
stop:b stop   
.end  

在这里插入图片描述

(3. 跳转之前保存返回地址

.text   
.global _start   
_start:MOV r0,#0X3  mov r1,#0X1 bl fun  @跳转到fun标签,返回地址保存至LR寄存器cmp r0,r1  @数值比较@根据比较的结果执行不同的指令addeq  r2,r1,r0  @如果两个数相等,两数相加,将结果保存至r2中subcs r3,r0,r1  @如果r0>=r1,就做减法运算,将结果保存在r3寄存器mulcc r4,r0,r1 @如果r0<r1,就做乘法运算,结果保存在r4寄存器中
fun:mov r3,#3mov r4,#4mov pc,lr @程序返回
stop:b stop   
.end

在这里插入图片描述

练习

1. 实现1-100的累加

.text   
.global _start   
_start:mov r0,#0 @将r0作为计数器mov r1,#0 @将r1作为和stop:add r0,#1		@累计循环次数cmp r0,#101 	@比较循环次数beq over		@当满足条件时跳转至over处addls r1,r1,r0	@当循环次数小于101时累加b stop  over:				@当循环结束跳转到次处mov r2,r1		@将r1计算的结果赋值给r2
.end  

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[QT编程系列-13]:QT快速学习 - 1- 初识

目录 第1章 QT的介绍 1.1 QT VS MFC 1.2 QT历史 1.3 QT的应用 1.4 QT学习方法 1.5 QT对象树 1.6 2-8定律 1.7 QT优势&#xff1a; 1.8 QT支持的平台 第2章 QT UI是各种控件对象的堆积 第3章 QT UI是各种控件的堆积 第4章 控件窗口的控制 第1章 QT的介绍 1.1 QT V…

回归预测 | MATLAB实现Attention-GRU多输入单输出回归预测(注意力机制融合门控循环单元,TPA-GRU)

回归预测 | MATLAB实现Attention-GRU多输入单输出回归预测----注意力机制融合门控循环单元&#xff0c;即TPA-GRU&#xff0c;时间注意力机制结合门控循环单元 目录 回归预测 | MATLAB实现Attention-GRU多输入单输出回归预测----注意力机制融合门控循环单元&#xff0c;即TPA-G…

GUI-Menu菜单实例(颜色+线型菜单)

运行代码&#xff1a; //GUI-Menu菜单实例&#xff08;颜色线型菜单&#xff09; #include"std_lib_facilities.h" #include"GUI/Simple_window.h" #include"GUI/GUI.h" #include"GUI/Graph.h" #include"GUI/Point.h"struc…

JS-27 前端数据请求方式;HTTP协议的解析;JavaScript XHR、Fetch的数据请求与响应函数;前端文件上传XHR、Fetch;安装浏览器插件FeHelper

目录 1_前端数据请求方式1.1_前后端分离的优势1.2_网页的渲染过程 – 服务器端渲染1.3_网页的渲染过程 – 前后端分离 2_HTTP协议的解析2.1_HTTP概念2.2_网页中资源的获取2.3_HTTP的组成2.4_HTTP的版本2.5_HTTP的请求方式2.6_HTTP Request Header2.7_HTTP Response响应状态码 3…

创建、发布npm包,并且应用在项目里面

实现一个函数去监听dom宽高的变化&#xff0c;并且发布NPM包&#xff0c;然后使用到项目中 步骤 1.5W3H 八何分析法 2.如何监听dom宽高变化 3.如何用vite 打包库 4.如何发布npm 一、NPM包新建过程 查看完整目录 1.生成 package.json npm init生成TS配置文件 tsconfig.js…

第二十一章:CCNet:Criss-Cross Attention for Semantic Segmentation ——用于语义分割的交叉注意力

0.摘要 全图像依赖关系为视觉理解问题提供了有用的上下文信息。在这项工作中&#xff0c;我们提出了一种称为Criss-Cross Network&#xff08;CCNet&#xff09;的方法&#xff0c;以更有效和高效的方式获取这种上下文信息。具体而言&#xff0c;对于每个像素&#xff0c;CCNet…

禁止浏览器自动填充密码功能,设置自动填充背景色。

禁止浏览器自动填充密码功能&#xff0c;设置自动填充背景色 1、禁止浏览器自动填充密码功能2、设置自动填充背景色&#xff08;阴影效果&#xff09; 1、禁止浏览器自动填充密码功能 text设置autocomplete“off” password设置 autocomplete“new-password” 两个一起设置&am…

Python Web框架 Flask 安装、使用

Python Web框架 Flask 安装 安装 Flask 框架 首先需要安装 Flask 框架, 可以通过以下命令安装: [rootlocalhost web]# pip3 install Flask Collecting FlaskDownloading Flask-2.0.3-py3-none-any.whl (95 kB)|██████████████████████████████…

websoket

websoket是html5新特性&#xff0c; 它提供一种基于TCP连接上进行全双工通讯的协议; 全双工通信的意思就是:允许客户端给服务器主动发送信息,也支持服务端给另一个客户端发送信息. Websoket使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。在we…

Appium: Windows系统桌面应用自动化测试(四) 【辅助工具】

[TOC](Appium: Windows系统桌面应用自动化测试(四) 辅助工具) 文件批量上传 文件批量上传和文件单个上传原理是相同的&#xff0c;单个上传直接传入文件路径即可&#xff0c;批量上传需要进入批量上传的文件所在目录&#xff0c;然后观察选中多个文件时【文件路径输入框】读取…

抖音seo源码-源代码开发搭建-开源部署(不加密)

抖音SEO矩阵系统源码开发功能模型是指在抖音平台上提高视频搜索排名的一种算法模型。该功能模型包括多个部分&#xff0c;如内容优化、用户交互、社交化推广等&#xff0c;通过对这些因素的优化和提升&#xff0c;达到提高视频搜索排名的目的。具体实现包括使用关键词、标签等优…

Elasticsearch--查询(nested、join)

nested 嵌套类型 数据的某个值是json、object对象&#xff1b;不再是简单的数据类型&#xff0c;或者简单数据类型的数组&#xff1b;那么还用之前的查询方式就有问题了。因为ES在存储复杂类型的时候会把对象的复杂层次结果扁平化为一个键值对列表 。此时&#xff0c;需要用n…

<Linux开发> linux开发工具-之-I2C TOOLS工具使用

&#xff1c;Linux开发&#xff1e; linux开发工具-之-I2C TOOLS工具使用 &#xff1c;Android开发&#xff1e; Android开发工具- 之-I2C TOOLS工具使用 &#xff1c;Linux开发&#xff1e;驱动开发 -之- Linux I2C 驱动 一 前言 在笔者的另一篇文章 &#xff1c;Android开…

MySQL 第七天作业 nosql作业

作业一&#xff1a;string list hash结构中&#xff0c;每个至少完成5个命令&#xff0c;包含插入 修改 删除 查询&#xff0c;list 和hash还需要增加遍历的操作命令 1、 string类型数据的命令操作&#xff1a; &#xff08;1&#xff09; 设置键值&#xff1a; set key1 re…

Spring Boot集成Redisson实现分布式锁

Spring Boot集成Redisson实现分布式锁 在分布式系统中&#xff0c;为保证数据的一致性和并发访问的安全性&#xff0c;我们经常会使用分布式锁来协调多个节点之间对共享资源的访问。Redisson是一个基于Redis的Java驻内存数据网格&#xff08;In-Memory Data Grid&#xff09;和…

centos 安装pyzbar

需求&#xff1a; 运行程序报错 ImportError: Unable to find zbar shared library 进程&#xff1a; 直接使用yum 安装 yum install python-devel && yum install zbar-devel 有时候会能成功&#xff0c;大多数时候python-devel 能成功但是 zbar-devel 会失败 下载…

TCP四次挥手过程

TCP 断开连接是通过四次挥手方式。 双方都可以主动断开连接&#xff0c;断开连接后主机中的「资源」将被释放&#xff0c; 刚开始双方都处于 establised 状态&#xff0c;假如是客户端先发起关闭请求&#xff0c;过程如下图&#xff1a; 第一次挥手&#xff1a;客户端打算关闭…

Ae 效果:CC Mr. Smoothie

风格化/CC Mr. Smoothie Stylize/CC Mr. Smoothie CC Mr. Smoothie&#xff08;平滑先生&#xff09;效果可以从一个图层上的两个点进行颜色采样&#xff0c;并将这个两点之间的颜色重映射到另一个图层上&#xff0c;可通过控制重映射的平滑度从而创建迷幻的外观效果。 ◆ ◆ …

JVM中的堆和栈到底存储了什么

JVM数据区 先上一张Java虚拟机运行时数据区中堆、栈以及方法区存储数据的概要图&#xff0c;如下所示&#xff1a; 然后我们来具体解析一下堆和栈 堆 堆是存储时的单位&#xff0c;对于绝大多数应用来说&#xff0c;这块区域是 JVM 所管理的内存中最大的一块。线程共享&#…

基于 ChatGPT 的 helm 入门

1. 写在最前面 公司最近在推业务上云&#xff08;底层为 k8s 管理&#xff09;&#xff0c;平台侧为了简化业务侧部署的复杂度&#xff0c;基于 helm 、chart 等提供了一个发布平台。 发布平台的使用使业务侧在不了解 helm 、chart 等工具的时候&#xff0c;「只要点点」就可…