day2 ARM基础

@ 
.text
.globl _start
_start:mov  r0,#0  mov  r1,#0  addfunc:add  r0,r0,#1	 @r0自增1adds r1,r1,r0  @R1实现1~100累加cmp r0,#100		@	判断r0是否到100bleq loop       @r0等于100 进入死循环       blne addfunc    @r0等于100跳转至循环累加
loop:b loopstop:b stop.end

【汇编工程创建】

1.汇编工程的创建步骤

参考汇编环境搭建PDF

2.汇编工程的编译

3.配置编辑器编码为UTF-8

4.示例汇编代码分析

.text @声明当前内容为文本段内容 .global _start @声明_start的内容为全局内容 _start: mov r1,#1 @将1保存在r1寄存器 loop: b loop @程序跳转到loop标签 .end @程序结束

5.程序的调试

map.lds文件是一个链接脚本文件 链接脚本的作用:当程序在编译的最后一个阶段-链接阶段中按照链接脚本的规定,链接不同的文件生成可执行文件

OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm") /*指定输出elf格式的适用于32位机器的镜像,镜像内部的数据按照小端存储方式 */ OUTPUT_ARCH(arm)/*生成的镜像架构是ARM架构的 */ ENTRY(_start)/* 程序执行的入口是_start*/ SECTIONS /* 内部指定了不同内容在内存中的存储位置*/ { . = 0x00000000; /*当前程序起始地址为0X0*/ . = ALIGN(4);/*程序中的指令遵循4字节对齐*/ .text : /*指定文本段的存储地址*/ { ./Objects/start.o(.text) /*将start.o的内容放在文本段最开始*/ *(.text)/*其他的文件保存位置由链接器自己决定*/ } . = ALIGN(4); .rodata : /*规定只读代码段的存储规则*/ { *(.rodata) } . = ALIGN(4); .data : { *(.data) } . = ALIGN(4); __bss_start = .; /*指定.bss段的起始位置*/ .bss : { *(.bss) } __bss_end__ = .;/* 指定.data段的起始位置*/ }

【汇编语言的相关语法】

1.汇编文件中的内容

1.伪操作:在汇编程序中不占用存储空间,但是可以在程序编译时起到引导和标识作用 .text .global .glbal .if .else .endif .data .word.... 2.汇编指令:每一条汇编指令都用来标识一个机器码,让计算机做一个指令运算 数据处理指令 数据搬移指令 算数运算指令 数据移位指令 位运算指令 数据比较指令 跳转指令 内存读写指令 状态寄存器传送指令 CPSR 软中断指令 3.伪指令:不是汇编指令,但是也可以让处理器做一些数据处理,通常一条伪指令会由多条汇编指令联合实现 4.注释 单行注释: @ ; 多行注释: /* */ 条件注释 .if 1/0 指令段1 .else 指令段2 .endif

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

指令的基本格式: <opcode> {<cond>} {s} <Rd>, <Rn>, <shifter_operand> <opcode>:指令的操作码 cond:条件码后缀 s:指令的执行结果将会影响CPSR中的条件标志位。 <Rd>:目标寄存器,指令的运算结果保存在目标寄存器中 <Rn>:第一操作寄存器,只能是寄存器 <shifter_operand> :第二操作数,既可以是寄存器编号,又可以是立即数 意义:让第一操作寄存器中的值和第二操作数按照指令操作码进行运算,并且将运算的结果保存在目标寄存器中 注意: 1.一般一条汇编指令就占据一行代码 2.汇编不区分大小写 3.操作数前面要跟一个#

【汇编的指令】

1.数据搬移指令

1.1 基本格式

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

1.2 示例

2. 立即数的概念

2.1 概念

定义:可以直接当作指令的一部分去执行的数据叫做立即数。立即数是通过一个0-255之间的数字循环右移偶数位获取

循环右移:低位移除,补到高位

2.2 立即数的判断

如何判断一个数据是不是立即数: 只要让这个数据或者这个数据按位取反的值循环右移偶数位,能够得到一个0-255范围内的数字就说明这个数是立即数 ex: 1. 0X104-> 0000 0000 0000 0000 0000 0001 0000 0100 0X104循环右移两位-》00 0000 0000 0000 0000 0000 0001 0000 01->0x41 0X41是一个0-255范围内的数据 0x104是0X41循环右移30位得到的数据,所以,0X104是立即数 2.0x101-> 0000 0000 0000 0000 0000 0001 0000 0001 0X101找不到一个0-255范围内的数字寻魂右移偶数位得到它,所以它不是立即数 3.0XFFFFFFFE ->1111 1111 1111 1111 1111 1111 1111 1110 0XFFFFFFFE也找不到0-255范围内的数字循环右移偶数位得到它,但是它的取反值0X1是一个立即数,所以0XFFFFFFFE也是一个立即数

2.3 如何将一个非立即数保存在寄存器中

利用伪指令ldr即可完成非立即数的操作 格式: ldr 目标寄存器名,=数据

3.移位操作指令

3.1 指令格式以及指令码

格式: <opcode> {<cond>} {s} <Rd>, <Rn>, <shifter_operand> 解释:将第一操作寄存器的数值移位第二操作数位,将结果保存在目标寄存器中 指令码: lsl:左移运算,最高位移出,最低位补0 lsr:右移运算,最低位移出,最高位补0 ror:循环右移:最低位移出,补到最高位

3.2 示例

.text .global _start _start: mov r0,#0XFF lsl r1,r0,#4 @0XFF左移四位结果保存到r1 0XFF0 lsr r2,r0,#4 @0XFF右移移四位结果保存到r2 0XF ror r3,r0,#4 @0XFF循环右移四位结果保存到r3 0XF000000F loop: b loop .end

4.位运算指令

4.1 相关指令功能以及规则

与、或、异或、按位清0

与:与0清0 与1不变

初值

运算值

结果

1

0

0

1

1

1

0

1

0

0

0

0

或:或1置1 或0不变

初值

运算值

结果

1

0

1

1

1

1

0

1

1

0

0

0

异或:相同为0,不同为1

初值

运算值

结果

1

0

1

1

1

0

0

1

1

1

1

0

按位清0:想要哪位清0,只需要和1进行运算即可

初值

运算值

结果

1

1

0

0

1

0

1

0

1

0

0

0

4.2 位运算指令码以及格式

格式: <opcode> {<cond>} {s} <Rd>, <Rn>, <shifter_operand> 指令码: and:进行按位与 orr:进行按位或 eor:按位异或 bic:按位清0

4.3 示例

.text .global _start _start: mov r0,#0XFF and r1,r0,#(~(0X1<<4)) @第四位清0 0xEF orr r2,r0,#(0X1<<9) @第9位置1 0X2FF eor r3,r0,#0XF @0xf0 bic r4,r0,#(0X1<<4)@第四位清0 0xEF loop: b loop .end

4.4 练习

LDR R0,=0X12345678 @在r1里存放0X12345678 1.将R0寄存器第4位清0,其他位不变 and r0,r0,#(~(0X1<<4))) 或者 bic r0,r0,#(0X1<<4) 2.将R0寄存器第7位置1,其他位不变 orr r0,r0,#(0X1<<7) 3.将R0寄存器第[31:28]位清0,其他位不变 and r0,r0,#(~(0Xf<<28))) 或者 bic r0,r0,#(0Xf<<28) 4.将R0寄存器第[7:4]位置1,其他位不变 orr r0,r0,#(0XF<<4) 5.将R0寄存器第[15:11]位设置为10101,其他位不变 思想:想要将一个数据的哪几位设置为不同的数值,先将这几位清0,在给上指定的位数 先将[15:11]清0:bic r0,r0,#(0X1f<<11) 在给[15:11]设置为10101:orr r0,r0,#(0X15<<11)

5.算数运算指令

5.1 指令码以及格式

格式: <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

5.2 示例代码

加法

.text .global _start _start: mov r0,#0XFFFFFFFE mov r1,#3 adds r2,r0,r1 @0X1,运算的结果影响到条件位 adc r3,r1,r2 @r3=r1+r2+CPSR[c] loop: b loop .end

减法:

.text .global _start _start: mov r0,#0XFFFFFFFE mov r1,#3 subs r2,r1,r0 @减法不借位,c位置1,借位,c位清0 mov r3,#6 sbc r4,r3,r1 @r4=r3-r1-!CPSR[c] loop: b loop .end

5.3 进行64位算数运算

思想:让低32位和高32位进行分别运算,每一个64位的数高32位和低32位数值保存在两个寄存器中

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 减法: 低32位: subs r5,r3,r1 高32位: sbc r6,r4,r2

6.数据比较指令

6.1 语法

格式: cmp <Rn>, <shifter_operand> 比较指令的本质: 拿第一操作寄存器和第二操作数进行减法运算,并且减法运算的结果会影响到CPSR的条件位 可以根据比较指令之后的条件位的数值进行不同的运算,相当于c里的选择语句 这里需要对CPSR的条件位进行判断,我们依赖条件位的助记词{cond}后缀实现

6.2 示例

.text .global _start _start: MOV R1,#4 MOV R2,#4 CMP R1,R2 addeq r3,r1,r2 @if(r1==r2) r3=r1+r2 subne r4,r1,r2 @if(r1!==r2) r4=r1-r2 loop: b loop .end

7.跳转指令

一般实现程序的跳转有两种方式:

1.直接修改PC的值 2.通过跳转指令 跳转指令:

1.b label 解释:跳转到label标签所在代码,此时跳转,lr寄存器不保存返回地址

ex:

.text .global _start

_start: MOV R1,#4

MOV R2,#4

CMP R1,R2

beq addfunc

bne subfunc

addfunc:

       add r3,r1,r2

         b loop

subfunc: sub r4,r1,r2 @if(r1!==r2) r4=r1-r2 b loop loop: b loop .end

2. bl label 解释:跳转到label标签所在代码,此时跳转,lr寄存器保存返回地址 ex: .text .global _start _start: MOV R1,#4 MOV R2,#4 CMP R1,R2 bleq addfunc blne subfunc addfunc: add r3,r1,r2 mov pc,lr @程序返回 subfunc: sub r4,r1,r2 @if(r1!==r2) r4=r1-r2 mov pc,lr @程序返回 loop: b loop .end

3. bx 地址 跳转到地址对应的的指令位置,此时跳转LR不保存返回地址 .text .global _start _start: MOV R1,#4 MOV R2,#4 MOV R3,#4 MOV R4,#4 MOV R5,#4 MOV R6,#4 bx r3 @跳转到地址为4的指令位置 loop: b loop .end 4.blx 地址 跳转到地址对应的的指令位置,此时跳转LR保存返回地址 .text .global _start _start: MOV R1,#4 MOV R2,#4 MOV R3,#4 MOV R4,#4 MOV R5,#4 blx r3 @跳转到地址为4的指令位置 MOV R6,#4 loop: b loop .end

任务

1.复习今日内容

2.实现1-100,累加

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

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

相关文章

同样是PM,产品经理和项目经理有啥不一样?

大家好&#xff0c;我是老原。身边有很多人都问&#xff1a; “干几年的技术可以做到项目经理&#xff1f;” “我要从项目经理转型到产品经理吗&#xff1f;” “产品经理和项目经理&#xff0c;哪个发展前&#xff08;钱&#xff09;景更好” …… 不难发现&#xff0c;…

Microsoft Dynamics 365 CE 扩展定制 - 7. 安全

在本章中,我们将介绍以下内容: 构建累积安全角色配置业务单元层次结构基于分层位置配置访问配置和分配字段级安全组建团队并共享设置访问团队对静止数据进行加密以满足FIPS 140-2标准管理Dynamics 365在线SQLTDE加密密钥简介 Dynamics 365是一个强大的平台,具有超过10年的良…

python数据结构和算法基础(第一节,数据结构和算法基础)

01.算法引入 02.时间复杂度和大o表示法 2.1时间复杂度与大o表示法 引入&#xff1a; 2.1时间复杂度与大o表示法 pycharm中&#xff0c;快速多行注释&#xff0c;ctrl/ 2.2最坏时间复杂度与计算规则 2.3常见时间复杂度与大小关系 03.python列表和字典 3.1代码执行时间测量木…

初步了解ORM框架之一Mybatis

ORM&#xff08;对象关系映射&#xff09;框架是现代软件开发中不可或缺的一部分。它们简化了将对象模型映射到关系数据库的过程&#xff0c;提供了更加便捷和高效的数据库操作方式&#xff0c;常见有&#xff1a;Hibernate、JPA&#xff08;Java Persistence API&#xff09;、…

Git 内容学习

一、Git 的理解 Git是一个分布式版本控制系统&#xff08;Distributed Version Control System&#xff0c;简称 DVCS&#xff09;&#xff0c;用于对项目源代码进行管理和跟踪变更。分为两种类型的仓库&#xff1a;本地仓库和远程仓库。 二、Git 的工作流程 详解如下&#x…

没有经验可以做人事资源工作吗?我来教你!

做人力资源不一定非要是人力专业&#xff0c;这个问题相必大家都知道。但是非人力资源专业想快速上手HR工作&#xff0c;也并不是一件容易的事情。 如何做才能快速了解这个行业&#xff0c;熟悉HR工作的一些基础操作呢&#xff1f; 了解HR行业 首先&#xff0c;你需要了解HR行…

webgoat-Broken Access ControlI 访问控制失效

Insecure Direct Object References 直接对象引用 直接对象引用是指应用程序使用客户端提供的输入来访问数据和对象。 例子 使用 GET 方法的直接对象引用示例可能如下所示 https://some.company.tld/dor?id12345 https://some.company.tld/images?img12345 https://some.…

Camtasia2024破解版电脑屏幕录制剪辑软件

屏幕录制剪辑 TechSmith Camtasia for Mac v2021是 TechSmith 公司所开发出一款专业屏幕录像和编辑&#xff0c; Camtasia Studio2024版是由TechSmith公司官方进行汉化推出的最新版本,除2023版以下版本均没有官方汉化。 同时TechSmith公司打击第三方贩卖Camtasia Studio汉化的…

Android 双向滑动

GestureDetector //系统 GestureDetectorCompat //AndroidX 较旧机型有更好的支持 code package com.example.myapplication.viewimport android.animation.ObjectAnimator import android.content.Context import android.graphics.Canvas import android.graphics.Paint im…

K8s:部署 CNI 网络组件+k8s 多master集群部署+负载均衡及Dashboard k8s仪表盘图像化展示管理

目录 1 部署 CNI 网络组件 1.1 部署 flannel 1.2 部署 Calico 1.3 部署 CoreDNS 2 负载均衡部署 3 部署 Dashboard 1 部署 CNI 网络组件 1.1 部署 flannel K8S 中 Pod 网络通信&#xff1a; ●Pod 内容器与容器之间的通信 在同一个 Pod 内的容器&#xff08;Pod 内的容…

《网络协议》01. 基本概念

title: 《网络协议》01. 基本概念 date: 2022-08-30 09:50:52 updated: 2023-11-05 15:28:52 categories: 学习记录&#xff1a;网络协议 excerpt: 互联网、网络互连模型&#xff08;OSI&#xff0c;TCP/IP&#xff09;、计算机通信基础、MAC 地址、ARP & ICMP、IP & 子…

以华为为例:GTM岗位主要是做什么的?如何做好GTM工作?

如何让产品上市以后卖得更好&#xff1f;这是一个系统工程。 许多公司在学习华为&#xff08;尤其是做消费者业务&#xff0c;通俗地说就是2C业务的公司或产品&#xff09;&#xff0c;设立GTM相关的岗位。我们来看一下&#xff0c;GTM岗位主要做些什么&#xff0c;如何才能胜…

后端除了增删改查还有什么?

大家好&#xff0c;我是伍六七。 刚工作 3、5 年的 Java 程序猿们&#xff0c;在日常工作中开始得心应手&#xff0c;基本上没有什么问题能难倒我们。 这个时候&#xff0c;我们很容易陷入迷茫当中&#xff0c;不知道怎么继续提升自己&#xff1f;怎么才能进阶资深、专家、总…

关键字驱动自动化测试框架搭建详解

前言 那么这篇文章我们将了解关键字驱动测试又是如何驱动自动化测试完成整个测试过程的。关键字驱动框架是一种功能自动化测试框架&#xff0c;它也被称为表格驱动测试或者基于动作字的测试。关键字驱动的框架的基本工作是将测试用例分成四个不同的部分。首先是测试步骤&#…

vite和webpack的区别

Vite&#xff0c;一个基于浏览器原生 ES imports 的开发服务器。利用浏览器去解析 imports&#xff0c;在服务器端按需编译返回&#xff0c;完全跳过了打包这个概念&#xff0c;服务器随起随用。同时不仅有 Vue 文件支持&#xff0c;还搞定了热更新&#xff0c;而且热更新的速度…

dockerfile避坑笔记(VMWare下使用Ubuntu在Ubuntu20.04基础镜像下docker打包多个go项目)

一、docker简介 docker是一种方便跨平台迁移应用的程序&#xff0c;通过docker可以实现在同一类操作系统中&#xff0c;如Ubuntu和RedHat两个linux操作系统中&#xff0c;实现程序的跨平台部署。比如我在Ubuntu中打包了一个go项目的docker镜像&#xff08;镜像为二进制文件&am…

pytorch直线拟合

目录 1、数据分析 2、pytorch直线拟合 1、数据分析 直线拟合的前提条件通常包括以下几点&#xff1a; 存在线性关系&#xff1a;这是进行直线拟合的基础&#xff0c;数据点之间应该存在一种线性关系&#xff0c;即数据的分布可以用直线来近似描述。这种线性关系可以是数据点…

Go Gin中间件

Gin是一个用Go语言编写的Web框架&#xff0c;它提供了一种简单的方式来创建HTTP路由和处理HTTP请求。中间件是Gin框架中的一个重要概念&#xff0c;它可以用来处理HTTP请求和响应&#xff0c;或者在处理请求之前和之后执行一些操作。 以下是关于Gin中间件开发的一些基本信息&am…

小程序https证书

小程序通常需要与服务器进行数据交换&#xff0c;包括用户登录信息、个人资料、支付信息等敏感数据。如果不使用HTTPS&#xff0c;这些数据将以明文的方式在网络上传输&#xff0c;容易被恶意攻击者截获和窃取。HTTPS通过数据加密来解决这个问题&#xff0c;确保数据在传输过程…

策略模式在数据接收和发送场景的应用

在本篇文章中&#xff0c;我们介绍了策略模式&#xff0c;并在数据接收和发送场景中使用了策略模式。 背景 在最近项目中&#xff0c;需要与外部系统进行数据交互&#xff0c;刚开始交互的系统较为单一&#xff0c;刚开始设计方案时打算使用了if else 进行判断&#xff1a; if(…