国庆假期作业6

news2024/10/6 8:39:04

一、ARM的工作模式

1、非特权模式

        user模式:非特权模式,大部分任务执行在这种模式

2、特权模式

        异常模式:

        FIQ : 当一个快速(fast) 中断产生时将会进入这种模式

        IRQ : 当一个通用(normal) 中断产生时将会进入这种模式

        Supervisor(svc) :当复位或软中断指令执行时将会进入这种模式

        Abort : 当存取异常时将会进入这种模式

        Undef : 当执行未定义指令时会进入这种模式        

        非异常模式:

        System : 使用和User模式相同寄存器集的特权模式

二、汇编语言的相关语法

1、汇编语言的组成部分

1.伪操作:不参与程序的执行,但是用于告诉编译器程序该怎么编译
.text 
.global  .end   .if  .else  .endif  .data

2.汇编指令
编译器将一条汇编指令编译成一条机器码,在内存里一条指令占4字节内存,一条指令可以实现一个特定的功能

3.伪指令
不是指令,看起来像是一条指令,可以实现和指令类似的功能。一条伪指令实际上可能是由多条指令共同实现

4.注释
单行注释:   @
多行注释   /*  */
条件编译
     .if 0
       指令段
      .else
        指令段
      .endif

2.汇编指令的介绍

1.基本数据操作指令
    数据搬移指令   =
    数据移位指令   << >>  
    数据算数运算指令   + - * /
    位运算指令    &   | ~  ^
    数据比较指令
2.跳转指令
3.内存读写指令
4.状态寄存器读写指令
5.软中断指令

3.汇编指令的基本语法格式

    指令的基本格式:
<opcode>{<cond>}{s}  <Rd>,  <Rn>,  <shifter_operand>
    解释:
    
<opcode>:指令码
     {<cond>}:条件码
     {s}:状态位,如果在指令后面加上s,则运算的结果会影响CPSR的条件位
     <Rd>:目标寄存器
     <Rn>:第一操作寄存器  只能是寄存器
     <shifter_operand>:第二操作数,可以是寄存器,也可以是立即数
  按照指令码将第一操作寄存器和第二操作数进行运算,将运算后的结果保存在目标寄存器
  
注意:      
1.一条汇编指令一般占一行
2.汇编不区分大写小写                         

三、汇编指令

1.数据搬移指令

<opcode>{<cond>}{s}  <Rd>,  <shifter_operand>
解释:
    
<opcode>:指令码
     {<cond>}:条件码
     {s}:状态位,如果在指令后面加上s,则运算的结果会影响CPSR的条件位
     <Rd>:目标寄存器
     <shifter_operand>:第一操作数,可以是寄存器,也可以是立即数
  按照指令码将第一操作数运算后的结果保存在目标寄存器
  
指令码功能:
    mov:将第一操作数的值保存在目标寄存器
    mvn:将第一操作数的值按位取反,将结果保存在目标寄存器

2、移位指令

2.1 格式以及指令码

格式:<opcode>{<cond>}{s}  <Rd>,  <Rn>,  <shifter_operand>
解释:将第一操作寄存器的数值移位第二操作数指定的位数,将结果保存在目标寄存器中

指令码:
LSL:左移运算  低位补0
LSR:右移运算   高位补0
ROR:循环右移:低位移出的值补到高位

2.2 示例

1.左移
        mov r0,#0XFF
    lsl r1,r0,#0X4  @将R0的值左移4位保存在r1寄存器  R1结果:0XFF0
 2.右移
 mov r0,#0XFF
lsr r1,r0,#0X4  @将R0的值右移4位保存在r1寄存器  R1结果:0XF
3.循环右移
mov r0,#0XFF
ror r1,r0,#0X4  @将R0的值循环右移4位保存在r1寄存器  R1结果:0XF000000F
4.c风格写法
mov r0,#0XFF
ror r1,r0,#(0X1<<2)  @将R0的值循环右移4位保存在r1寄存器  R1结果:0XF000000F

3.位运算指令

3.1 格式以及功能码

格式:<opcode>{<cond>}{s}  <Rd>,  <Rn>,  <shifter_operand>
解释:将第一操作寄存器和第二操作数进行位运算,将结果保存在目标寄存器中

指令码:
    and:与 与0清0 与1不变
    orr:或  或1置1 或0不变
    eor:异或  相同为0 不同为1
    bic:按位清零指令,想将哪一位设置为0,只需要用bic指令给这一位运算一个1即可

3.2 示例

1.and:
mov r0,#0XFF
    and r1,r0,#0XF0  @R1结果为0XF0
 2.ORR:
     mov r0,#0XFF
    orr r1,r0,#0XF000  @R1结果为0XF0FF
3.EOR:
    ldr r0,=0xf0f0
    EOr r1,r0,#0XFF  @R1结果为0XF00F
0000 0000 0000 0000 0000 0000 1111 1111
0000 0000 0000 0000 1111 0000 1111 0000
结果:0000 0000 0000 0000 1111 0000 0000 1111 -》0XF00F

4.BIC
 ldr r0,=0xFF
    BIC r0,r0,#(0x1<<5)  @将R0的值第5位清0 @R0结果为0XDF

3.3 练习

LDR r1,=0X12345678  @将0X12345678存放在r1寄存器
0001 0010 0011 0100 0101 0110 0111 1000
1.将R1寄存器的第4位清0,其他位不变
        and r1,r1,#(~(0X1<<4))
    或者BIC R1,R1,#(0x1<<4)
2.将r1寄存器第7位置1,其他位不变
orr r1,r1,#(0X1<<7)
3.将r1寄存器[31:28]清0,其他位不变
and r1,r1,#(~(0Xf<<28))
    或者BIC R1,R1,#(0xF<<28)
4.将r1寄存器[7:4]置1,其他位不变
orr r1,r1,#(0XF<<4)
5.将r1寄存器[15:11]设置为10101,其他位不变 
    @先清0
    BIC R1,R1,#(0X1F<<11)
    @再置位
    orr r1,r1,#(0X15<<11)

4.算数运算指令

4.1 格式以及指令码

格式:<opcode>{<cond>}{s}  <Rd>,  <Rn>,  <shifter_operand>
解释:将第一操作寄存器的值和第二操作数进行算数运算,结果保存在目标寄存器中

add:加法运算
adc:进行加法运算时需要考虑CPSR的条件位
sub:减法运算
sbc:进行减法运算时需要考虑CPSR的条件位
mul:乘法运算

4.2 示例

1.ADD:加法
  ex1:  mov r1,#1
      mov r2,#2
     add r3,r1,r2@r3=r1+r2
  ex:
      mov r1,#0XFFFFFFFE
    mov r2,#2
    addS r3,r1,r2@r3=r1+r2  @运算的结果影响到条件位
2.SUB
        mov r1,#0XFFFFFFFE
    mov r2,#2
    sub r3,r1,r2@r3=r1-r2
 ex2:
         mov r1,#0XFFFFFFFE
    mov r2,#2
    subs r3,r2,r1@r3=r2-r1 
3.ADC
mov r1,#0XFFFFFFFE
mov r2,#2
    ADDS r3,r2,r1 @r3=r1+r2 
    ADC R4,R2,#3  @R4=R2+3+cpsr(C位)  6 
 
4.sbc:减法运算考虑条件位
mov r1,#0XFFFFFFFE
    mov r2,#2
      SUBS r3,r2,r1 @r3=R2-R1    4
    sbC R4,R1,#3  @R4=R1-3-CPSR(C位取反)

4.3 64位数据进行算数运算

原则:
一个 64位数保存在两个寄存器
高32位运算,低32位运算
     mov r1,#0XFFFFFFFE  @保存第一个数据的低32位
    mov r2,#2@保存第一个数据的高32位
    mov r3,#3 @保存第二个数据的低32位
    mov r4,#4 @保存第2数据的高32位
    @低32位运算要求影响条件位
    ADDS R5,R1,R3@R5保存运算后结果的低32位
    ADC R6,R2,R4@R6寄存器保存运算结果的高32位,需要考虑条件位
    

5.比较指令

格式:
    cmp 第一操作数,第二操作寄存器
    比较两个数据
cmp命令本质:实际上就是比较的两个数进行减法运算,并且减法运算的结果会影响到CPSR寄存器的条件位
通常比较指令完毕之后会使用条件码进行判断,根据判断的结果做不同的逻辑
mov r1,#3
        mov r2,#4
        cmp r1,r2  @比较两个数
        SUBHI r3,r1,r2  @如果r1>r2 进行减法运算
        MULEQ r3,r1,r2@如果两数相等,进行乘法运算
        ADDCC R3,R1,R2@如果r1<r2  ,进行加法运算

6. 跳转指令

格式:
<opcode>{<cond>} 标签
功能:跳转到指定的标签下

指令码:
b:跳转时不影响LR寄存器的值

ex:.text
.global  _start
    
_start:
        mov r1,#3
        mov r2,#4
        b fun1 @程序跳转
        mul r5,r1,r2
    
stop:
    b stop  

fun1:
    add r4,r1,r2

    
    
.end
    

bl:跳转时影响LR寄存器的值

.text
.global  _start
    
_start:
        mov r1,#3
mov r2,#4
        bl fun1 @程序跳转
        mul r5,r1,r2
    
stop:
    b stop  

fun1:
    add r4,r1,r2
    mov pc,lr @程序返回

    
    
.end
    

7.单寄存器内存读写指令

向内存中写:
str:向内存中写一个字(4字节)的数据
strh:向内存写半个字(2字节)的数据
strb:向内存写一个字节的数据
从内存读:
ldr:从内存读取一个字的数据
ldrh:从内存读取半个字的数据
ldrb:从内存读取一个字节的数据
 mov r1,#0XFFFFFFFF
    ldr r2,=0X40000000
    @向内存写入
    str r1,[r2]
    @从内存读
    ldr r3,[r2]

8.批量寄存器的内存读写方式

mov r1,#1
    mov r2,#2
    mov r3,#3
    mov r4,#4
    mov r5,#5
    ldr r6,=0X40000000
    stm r6,{r1,r2,r3,r4,r5}  @将r1-r6寄存器的值写道r6指向的连续内存中
    ldm r6,{r7,r8,r9,r10,r11}@从r6指向的连续内存中读取数据保存到r7-r11寄存器中

四、栈内存读写

1、栈的类型

增栈:压栈结束后,栈顶往地址大的方向增长
减栈:压栈结束后,栈顶往地址小的方向增长
空栈:压栈结束后,栈顶区域没有有效数据
满栈:压栈结束后,栈顶区域存放有效数据

空增栈(EA)/空减栈(ED)/满增栈(FA)/满减栈(FD)
ARM使用的栈是满减栈

2、满减栈压栈的出栈操作

ex1:
  ldr sp,=0X40000020 @指定顶地址
    mov r1,#1
    mov r2,#2
    mov r3,#3
    mov r4,#4
    mov r5,#5
    push {r1-r5} @压栈
    pop {r6-r10}  @将栈顶元素数值出栈
ex2:
    ldr sp,=0X40000020 @指定顶地址
    mov r1,#1
    mov r2,#2
    mov r3,#3
    mov r4,#4
    mov r5,#5
    STMDB sp!,{r1-r5} @压栈
    LDMIA sp!,{r6-r10}  @将栈顶元素数值出栈
EX3:
    ldr sp,=0X40000020 @指定顶地址
    mov r1,#1
    mov r2,#2
    mov r3,#3
    mov r4,#4
    mov r5,#5
    STMfd sp!,{r1-r5} @压栈
    LDMfd sp!,{r6-r10}  @出栈
4.栈实例---叶子函数的调

3、栈实践,叶子函数的调用过程

.text  
.global _start 
            

_start:
    ldr sp,=0X40000020 @初始化栈
    b main
main:
    mov r1,#1
    mov r2,#2
    bl func
    add r3,r1,r2
    b main

func:
@压栈保护现场
    stmfd sp!,{r1,r2}
    mov r1,#3
    mov r2,#4
    sub r4,r2,r1
    @出栈恢复现场
    ldmfd sp!,{r1,r2}
    mov pc,lr  @返回main函数
    
    
wh: 
    b wh  
    
.end 
    

4、非叶子函数的调用过程

.text  
.global _start 
            

_start:
    ldr sp,=0X40000020 @初始化栈
    b main
main:
    mov r1,#1
    mov r2,#2
    bl func
    add r3,r1,r2
    b main

func:
@压栈保护现场
    stmfd sp!,{r1,r2,lr}
    mov r1,#3
    mov r2,#4
    bl fun1
    sub r4,r2,r1
    @出栈恢复现场
    ldmfd sp!,{r1,r2,lr}
    mov pc,lr  @返回main函数
fun1:
@压栈保护现场
    stmfd sp!,{r1,r2}
    mov r1,#4
    mov r2,#5
    mul r5,r1,r2
    @出栈恢复现场
    ldmfd sp!,{r1,r2}
    mov pc,lr
    
    
wh: 
    b wh  
    
.end 
    

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

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

相关文章

物联网系统中物模型定义的简要说明

物模型由若干条“参数”组成,参数按描述的功能类型不同,又分为属性、方法和事件。 标准参数 为了实现设备功能的统一理解。 说的直白一些的理解&#xff0c;可以这样去理解&#xff1a; 属性&#xff0c;就是定义的由设备端规律性的定期上报的数据。 事件&#xff0c;就是定…

【在凸多边形的图像中查找顶点】估计具有已知顶点数的像素化凸多边形角点研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

2.2.3.1vim + ctags + cscope + taglist

在window下,我们一般用Source Insight来查看代码而在linux下,使用vim来查看代码,vim是一个简单的文本浏览/编辑器,它可以通过插件的形式,搭建一个完全的类Source Insight环境,通过快捷键的形式,快速查看、定位变量/函数,本文就是基于vim,通过ctags+cscope+taglist+Ner…

剑指offer——JZ77 按之字形顺序打印二叉树 解题思路与具体代码【C++】

一、题目描述与要求 按之字形顺序打印二叉树_牛客题霸_牛客网 (nowcoder.com) 题目描述 给定一个二叉树&#xff0c;返回该二叉树的之字形层序遍历&#xff0c;&#xff08;第一层从左向右&#xff0c;下一层从右向左&#xff0c;一直这样交替&#xff09; 数据范围&#x…

【计算机视觉|人脸建模】学习从4D扫描中获取的面部形状和表情的模型

本系列博文为深度学习/计算机视觉论文笔记&#xff0c;转载请注明出处 标题&#xff1a;Learning a model of facial shape and expression from 4D scans 链接&#xff1a;Learning a model of facial shape and expression from 4D scans | ACM Transactions on Graphics Pe…

【网络】抓包工具Wireshark下载安装和基本使用教程

&#x1f341; 博主 "开着拖拉机回家"带您 Go to New World.✨&#x1f341; &#x1f984; 个人主页——&#x1f390;开着拖拉机回家_Linux,大数据运维-CSDN博客 &#x1f390;✨&#x1f341; &#x1fa81;&#x1f341; 希望本文能够给您带来一定的帮助&#x1…

Qt + FFmpeg 搭建 Windows 开发环境

Qt FFmpeg 搭建 Windows 开发环境 Qt FFmpeg 搭建 Windows 开发环境安装 Qt Creator下载 FFmpeg 编译包测试 Qt FFmpeg踩坑解决方法1&#xff1a;换一个 FFmpeg 库解决方法2&#xff1a;把项目改成 64 位 后记 官方博客&#xff1a;https://www.yafeilinux.com/ Qt开源社区…

小程序入门笔记(一) 黑马程序员前端微信小程序开发教程

微信小程序基本介绍 小程序和普通网页有以下几点区别&#xff1a; 运行环境&#xff1a;小程序可以在手机的操作系统上直接运行&#xff0c;如微信、支付宝等&#xff1b;而普通网页需要在浏览器中打开才能运行。 开发技术&#xff1a;小程序采用前端技术进行开发&#xff0c;…

Interference Signal Recognition Based on Multi-Modal Deep Learning

系统结构 基于决策的融合实际上是用损失函数监督融合模型 其中 N N N是训练样本的数量 体会 作者未解释公式4的 t i t_i ti​的含义且不公布代码

[尚硅谷React笔记]——第3章 React应用(基于React脚手架)

目录&#xff1a; react脚手架创建项目并启动react脚手架项目结构一个简单的Hello组件样式的模块化功能界面的组件化编码流程&#xff08;通用&#xff09;组件的组合使用-TodoList 1.react脚手架 xxx脚手架: 用来帮助程序员快速创建一个基于xxx库的模板项目 包含了所有需…

ctfshow web入门 php特性 web131-web135

1.web131 和上题一样差不多&#xff0c;正则最大回溯次数绕过 import requests url"" data{f:very*250000360Dctfshow } rrequests.post(url,datadata) print(r.text)2.web132 通过扫描发现robots.txt,访问/admin发现源码 &&和||都是短路运算符 只要满足co…

【LittleXi】【MIT6.S081-2020Fall】Lab: locks

【MIT6.S081-2020Fall】Lab: locks 【MIT6.S081-2020Fall】Lab: locks内存分配实验内存分配实验准备实验目的1. 举一个例子说明修改前的**kernel/kalloc.c**中如果没有锁会导致哪些进程间竞争(races)问题2. 说明修改前的kernel/kalloc.c中锁竞争contention问题及其后果3. 解释a…

使用Jest测试Cesium源码

使用Jest测试Cesium源码 介绍环境Cesium安装Jest安装Jest模块包安装babel安装Jest的VSC插件 测试例子小结 介绍 在使用Cesium时&#xff0c;我们常常需要编写自己的业务代码&#xff0c;其中需要引用Cesium的源码&#xff0c;这样方便调试。此外&#xff0c;目前代码中直接使用…

状态机-状态规划(309. 买卖股票的最佳时机含冷冻期)

class Solution {public int maxProfit(int[] prices) {int n prices.length;if(n 0 || n 1)return 0;int f[][] new int[n][2]; //f[i][0 || 1]表示持有/未持有 第i只股票f[0][0] 0;f[0][1] 0 - prices[0];for(int i 1; i < n;i){f[i][0] Math.max(f[i - 1][0],f[i…

专题一:双指针【优选算法】

双指针应用场景&#xff1a; 数组划分、数组分块 目录 一、移动0 二、复写0 从后向前 三、快乐数 链表带环 四、盛水最多的容器 单调性双指针 五、有效三角形个数 单调性双指针 六、和为s的两个数字 七、三数之和 细节多 需再练 一、移动0 class Solution { public:void move…

前端 | AjaxAxios模块

文章目录 1. Ajax1.1 Ajax介绍1.2 Ajax作用1.3 同步异步1.4 原生Ajax 2. Axios2.1 Axios下载2.2 Axios基本使用2.3 Axios方法 1. Ajax 1.1 Ajax介绍 Ajax: 全称&#xff08;Asynchronous JavaScript And XML&#xff09;&#xff0c;异步的JavaScript和XML。 1.2 Ajax作用 …

SPI 通信协议

1. SPI通信 1. 什么是SPI通信协议 2. SPI的通信过程 在一开始会先把发送缓冲器的数据&#xff08;8位&#xff09;。一次性放到移位寄存器里。 移位寄存器会一位一位发送出去。但是要先放到锁存器里。然后从机来读取。从机的过程也一样。当移位寄存器的数据全部发送完。其实…

【Unity3D编辑器开发】Unity3D编辑器开发基础性框架结构【全面总结】

推荐阅读 CSDN主页GitHub开源地址Unity3D插件分享简书地址我的个人博客 大家好&#xff0c;我是佛系工程师☆恬静的小魔龙☆&#xff0c;不定时更新Unity开发技巧&#xff0c;觉得有用记得一键三连哦。 一、前言 嗨&#xff0c;大家好&#xff0c;我是恬静的小魔龙。 同学们…

open62541学习:文件传输

作为一种通信协议&#xff0c;文件传输是非常重要的。例如传输执行程序&#xff0c;图片&#xff0c;配置文件等等。文件传输的机制和类型在 OPC UA 中已经存在很长时间了。FileType &#xff08;作为ObjectType&#xff09;和ImageType长期以来一直是内置模型的一部分&#xf…

Linux:TCP三握四挥简析

文章目录 1. 前言2. 背景3. TCP连接的建立和断开3.1 TCP协议状态机3.2 TCP的三握四挥3.2.1 TCP 连接建立的三次握手过程分析3.2.1.1 服务端和客户端套接字的创建3.2.1.2 服务端进入 LISTEN 状态3.2.1.3 服务端在 LISTEN 状态等待客户端的 SYN 请求3.2.1.4 客户端向服务端发送 S…