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,#0XFF
    lsl r1,r0,#4  @ 将r0的值左移4位结果放到r1中 R1==0XFF0
    lsr r2,r0,#4  @将r0的值右移4位结果放到r2中 R2==0XF
    ror 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,#0XFF
    and r1, r0,#0XF  @r1==0XF
    orr r2,r0,#0XF00  @r2==0XFFF
    eor r3,r0,#0XF  @R3==0XF0
    bic r4,r0,#0X14 @R4==0XEB       
stop:
    b stop   
.end  

在这里插入图片描述

(5. 练习

LDR r0,=0X12345678
 0001 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,#1
     mov r1,#3
    add r2,r0,r1 @将r0+r1的结果存放r2寄存器
2.加法2:
    MOV r0,#0XFFFFFFFE
    mov r1,#3
    adds r2,r0,r1 @将r0+r1的结果存放r2寄存器,+s结果进位就会影响到CPSR的c位

3.减法运算
MOV r0,#3
    mov r1,#0XFFFFFFFE
    subs 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,#3
    mov 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,#3
    mov r4,#4
    mov 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  

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Revit中如何创建水的效果及基坑?

一、Revit中如何创建水的效果? 我们在创建建筑的时候会遇上小池塘啊小池子之类的装饰景观&#xff0c;Revit又不像专业的3D软件那样可以有非常真实的水的效果&#xff0c;那么我们该如何简单创建水呢?下面来看步骤&#xff1a; 1、 在水池位置创建一块楼板&#xff0c;并将该…

【DevOps】Atlassian插件开发指南

本文以Bamboo插件开发为例&#xff0c;记录一下插件开发过程。 一、简介 Atlassian Bamboo 6.9.1 是一款持续集成和持续交付&#xff08;CI/CD&#xff09;工具&#xff0c;支持使用插件扩展其功能。如果需要开发自己的 Bamboo 插件并添加到 Bamboo 中&#xff0c;则可以参考…

sqli-labs 堆叠注入 解析

打开网页首先判断闭合类型 说明为双引号闭合 我们可以使用单引号将其报错 先尝试判断回显位 可以看见输出回显位为2&#xff0c;3 尝试暴库爆表 这时候进行尝试堆叠注入&#xff0c;创造一张新表 ?id-1 union select 1,database(),group_concat(table_name) from informatio…

mac端好用的多功能音频软件 AVTouchBar for mac 3.0.7

AVTouchBar是来自触摸栏的视听播放器&#xff0c;将跳动笔记的内容带到触摸栏&#xff0c;触摸栏可显示有趣的音频内容&#xff0c;拥有更多乐趣&#xff0c;以一种有趣的方式播放音乐&#xff0c;该软件支持多种音频播放软件&#xff0c;可在Mac上自动更改音乐~ 音频选择-与内…

javascript实现久久乘法口诀表、document、write、console、log

文章目录 正序乘法口诀表倒序乘法口诀表logconsoledocumentwrite 正序乘法口诀表 function multiplicationTable() {for (let i 1; i < 9; i) {let val ;for (let j 1; j < i; j) {document.write(j * i (i * j) &nbsp );val ${j}*${i}${i * j} ;}consol…

【Linux】进程间通信——管道/共享内存

文章目录 1. 进程间通信2. 管道匿名管道命名管道管道的特性管道的应用&#xff1a;简易的进程池 3. System V共享内存共享内存的概念共享内存的结构共享内存的使用代码实现 1. 进程间通信 进程间通信&#xff08;Inter-Process Communication&#xff0c;简称IPC&#xff09;是…

跨网络的通信过程、路由的作用以及默认网关

如下网络拓扑图&#xff0c;交换机0所在的网段为192.168.1.0/24&#xff0c;交换机1所在网段为192.168.2.0/24&#xff0c;且各自有2台主机&#xff1a; 假设PC0&#xff08;192.168.1.10/32&#xff09;要跟PC4&#xff08;192.168.2.11/32&#xff09;通信&#xff0c;如何实…

基于 chinese-roberta-wwm-ext 微调训练 6 分类情感分析模型

一、模型和数据集介绍 1.1 预训练模型 chinese-roberta-wwm-ext 是基于 RoBERTa 架构下开发&#xff0c;其中 wwm 代表 Whole Word Masking&#xff0c;即对整个词进行掩码处理&#xff0c;通过这种方式&#xff0c;模型能够更好地理解上下文和语义关联&#xff0c;提高中文文…

DuiLib中的list控件以及ListContainerElement控件

文章目录 前言1、创建list控件2、创建 ListContainerElement 元素&#xff0c;并添加到 List 控件中,这里的ListContainerElement用xml来表示3、在 ListContainerElement 元素中添加子控件 1、List控件2、ListContainerElement控件 前言 在 Duilib 中&#xff0c;List 控件用于…

Python 集合 add()函数使用详解,集合添加元素

「作者主页」&#xff1a;士别三日wyx 「作者简介」&#xff1a;CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者 「推荐专栏」&#xff1a;小白零基础《Python入门到精通》 add函数使用详解 1、元素的顺序2、可以添加的元素类型3、添加重复的元素4、一次只…

Python爬虫学习笔记:1688商品详情API 开发API接口文档

1688API接口是阿里巴巴集团推出的一种开放平台&#xff0c;提供了丰富的数据接口、转换工具以及开发资源&#xff0c;为开发者提供了通用的应用接口及大量数据资源&#xff0c;支持开发者在1688上进行商品搜索、订单管理、交易报表及物流等方面的操作。 1688API接口主要包含以…

Unity游戏源码分享-单车骑行游戏

Unity游戏源码分享-单车骑行游戏 项目地址&#xff1a;https://download.csdn.net/download/Highning0007/88057717

MySQL之DML和DDL

1、显示所有职工的基本信息&#xff1a; 2、查询所有职工所属部门的部门号&#xff0c;不显示重复的部门号。 3、求出所有职工的人数。 4、列出最高工和最低工资。 5、列出职工的平均工资和总工资。 6、创建一个只有职工号、姓名和参加工作的新表&#xff0c;名为工作日期表。 …

react报错信息

报错信息 render函数里dom不能直接展示obj对象 取变量记得要有{} https://segmentfault.com/q/1010000009619339 这样在写的时候就已经执行方法了&#xff0c;所以此处用箭头函数&#xff08;&#xff09;》{}才会在点击时执行或者 遍历数据使用map来遍历&#xff0c;使用forea…

TCP和UDP的区别

连接&#xff1a;TCP 是面向连接的传输层协议&#xff0c;传输数据前先要建立连接&#xff1b;UDP 是不需要连接&#xff0c;即刻传输数据。首部开销&#xff1a;TCP 首部长度较长&#xff0c;首部在没有使用「选项」字段时是 20 个字节&#xff0c;如果使用了「选项」字段则会…

概率论的学习和整理17:EXCEL的各种期望,方差的公式

目录 1 总结 1.1 本文目标总结方法 1.2 总结一些中间关键函数 2 均值和期望 2.1 求均值的公式 2.2 求随机变量期望的公式 2.3 求随机变量期望的朴素公式 3 方差 3.1 确定数的方差 3.2 统计数的方差公式 3.3 随机变量的方差公式 3.4 EXCEL提供的直接计算方差的公式 …

CentOS目录详解

在centos中&#xff0c;最顶层的目录称作根目录&#xff0c; 用/表示。/目录下用户可以再创建目录&#xff0c;但是有一些目录随着系统创建就已经存在&#xff0c;接下来重点介绍几个常用目录。 /bin&#xff08;binary&#xff09;包含了许多所有用户都可以访问的可执行文件&a…

PostgreSQL MVCC的弊端优化方案

我们之前的博客文章“我们最讨厌的 PostgreSQL 部分”讨论了大家最喜欢的 DBMS 多版本并发控制 (MVCC) 实现所带来的问题。其中包括版本复制、表膨胀、索引维护和真空管理。本文将探讨针对每个问题优化 PostgreSQL 的方法。 尽管 PostgreSQL 的 MVCC 实现是 Oracle 和 MySQL 等…

如何在Appium中使用AI定位

当我们在写自动化测试脚本的时候&#xff0c;传统情况下一定要知道元素的属性&#xff0c;如id、name、class等。那么通过AI的方式定位元素可能就不需要知道元素的属性&#xff0c;评价人对元素的判断来定位&#xff0c;比如&#xff0c;看到一个搜索框&#xff0c;直接使用ai:…

【无标题】使用html2canvas和jspdf生成的pdf在不同大小的屏幕下文字大小不一样

问题&#xff1a;使用html2canvas和jspdf生成的pdf在不同大小的屏幕下文字大小不一样&#xff0c;在mac下&#xff0c;一切正常&#xff0c;看起来很舒服&#xff0c;但是当我把页面放在扩展屏幕下&#xff08;27寸&#xff09;&#xff0c;再生成一个pdf&#xff0c;虽然排版一…