2023/9/27 -- ARM

【汇编语言相关语法】

1.汇编语言的组成部分

1.伪操作:不参与程序的执行,但是用于告诉编译器程序该怎么编译
.text 
.global  .end   .if  .else  .endif  .data2.汇编指令
编译器将一条汇编指令编译成一条机器码,在内存里一条指令占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.数据搬移指令

1.1 格式

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

1.2 示例

1.3 立即数的概念

定义:能够直接当作指令的一部分参与到指令的执行过程中的数据就是立即数.立即数由一个0-255范围内的数循环右移偶数位获得。

在指令的32为中将低12位预留保存立即数的数据

如何判断一个数据是不是立即数:在0-255范围内找一个数,让它循环右移偶数位(一个0-15范围内的数*2得到),如果能够得到这个数据,则这个数就是一个立即数。循环右移:最低位移出去的数补到最高位0000 0000 0000 0000 0000 0000 0000 1010 右移两位: 0000 0000 0000 0000 0000 0000 0000 0010循环右移两位: 100000 0000 0000 0000 0000 0000 0000 10ex:0X104: 0000 0000 0000 0000 0000 0001 0000 0100循环右移2位-》000000 0000 0000 0000 000000 0100 0001   -》0x41换句话说,将0x41循环右移30位得到0X104,所以,0X104是一个立即数
0X101:0000 0000 0000 0000 0000 0001 0000 0001
0X101找不到一个0-255范围内的数循环右移得到它,所以0X101不是立即数

1.4 将非立即数保存至寄存器中

伪指令:LDR 目标寄存器,=数值将指定的数据放在目标寄存器中ex:LDR r1,=0X12345678

2.移位指令

2.1 格式以及指令码

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

2.2 示例

1.左移mov r0,#0XFFlsl r1,r0,#0X4  @将R0的值左移4位保存在r1寄存器  R1结果:0XFF02.右移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 不同为1bic:按位清零指令,想将哪一位设置为0,只需要用bic指令给这一位运算一个1即可

3.2 示例

1.and:
mov r0,#0XFFand r1,r0,#0XF0  @R1结果为0XF02.ORR:mov r0,#0XFForr r1,r0,#0XF000  @R1结果为0XF0FF
3.EOR:ldr r0,=0xf0f0EOr 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 -》0XF00F4.BICldr r0,=0xFFBIC 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,其他位不变 @先清0BIC 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,#1mov r2,#2add r3,r1,r2@r3=r1+r2ex:mov r1,#0XFFFFFFFEmov r2,#2addS r3,r1,r2@r3=r1+r2  @运算的结果影响到条件位
2.SUBmov r1,#0XFFFFFFFEmov r2,#2sub r3,r1,r2@r3=r1-r2ex2:mov r1,#0XFFFFFFFEmov r2,#2subs r3,r2,r1@r3=r2-r1 
3.ADC
mov r1,#0XFFFFFFFE
mov r2,#2ADDS r3,r2,r1 @r3=r1+r2 ADC R4,R2,#3  @R4=R2+3+cpsr(C位)  6 4.sbc:减法运算考虑条件位
mov r1,#0XFFFFFFFEmov r2,#2SUBS r3,r2,r1 @r3=R2-R1    4sbC 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,#3mov r2,#4cmp 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,#3mov r2,#4b fun1 @程序跳转mul r5,r1,r2stop:b stop  fun1:add r4,r1,r2.endbl:跳转时影响LR寄存器的值.text
.global  _start_start:mov r1,#3mov r2,#4bl fun1 @程序跳转mul r5,r1,r2stop:b stop  fun1:add r4,r1,r2mov pc,lr @程序返回.end

【任务】

实现1-100的累加

.text
.globl _start_start:  MOV R0,#0MOV R1,#1MOV R2,#100FUN:	CMP R1,R2ADDNE R0,R0,R1ADDNE R1,R1,#1BNE FUN		stop:b stop
.end

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

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

相关文章

【C++设计模式之原型模式:创建型】分析及示例

简介 原型模式&#xff08;Prototype Pattern&#xff09;是一种创建型设计模式&#xff0c;它允许通过复制已有对象来生成新的对象&#xff0c;而无需再次使用构造函数。 描述 原型模式通过复制现有对象来创建新的对象&#xff0c;而无需显式地调用构造函数或暴露对象的创建…

013-第二代上位机开发环境搭建

第二代上位机开发环境搭建 文章目录 第二代上位机开发环境搭建项目介绍虚拟机安装Debian 10文件传输远程调试VNCrsync下载安装验证 配置远程调试环境配置远程设备配置 kitsCompilers配置Qtversions配置kits 测试 总结一下 关键字&#xff1a; Qt、 Qml、 关键字3、 关键字4…

Python常用功能的标准代码

后台运行并保存log 1 2 3 4 5 6 7 8 9 nohup python -u test.py > test.log 2>&1 & #最后的&表示后台运行 #2 输出错误信息到提示符窗口 #1 表示输出信息到提示符窗口, 1前面的&注意添加, 否则还会创建一个名为1的文件 #最后会把日志文件输出到test.log文…

八大排序算法汇总(C语言实现)

本专栏内容为&#xff1a;八大排序汇总 通过本专栏的深入学习&#xff0c;你可以了解并掌握八大排序以及相关的排序算法。 &#x1f493;博主csdn个人主页&#xff1a;小小unicorn ⏩专栏分类&#xff1a;八大排序汇总 &#x1f69a;代码仓库&#xff1a;小小unicorn的代码仓库…

智慧公厕:将科技融入日常生活的创新之举

智慧公厕是当今社会中一项备受关注的创新项目。通过将科技融入公厕设计和管理中&#xff0c;这些公厕不仅能够提供更便利、更卫生的使用体验&#xff0c;还能够极大地提升城市形象和居民生活质量。本文将以智慧公厕领先厂家广州中期科技有限公司&#xff0c;大量的精品案例项目…

React项目部署 - Nginx配置

写在前面&#xff1a;博主是一只经过实战开发历练后投身培训事业的“小山猪”&#xff0c;昵称取自动画片《狮子王》中的“彭彭”&#xff0c;总是以乐观、积极的心态对待周边的事物。本人的技术路线从Java全栈工程师一路奔向大数据开发、数据挖掘领域&#xff0c;如今终有小成…

Ubuntu无法引导启动的修复

TLDR&#xff1a;使用Boot-Repair工具。 Boot-Repair Boot-Repair是一个简单的工具&#xff0c;用于修复您在Ubuntu中可能遇到的常见启动问题&#xff0c;例如在安装Windows或其他Linux发行版后无法启动Ubuntu时&#xff0c;或者在安装Ubuntu后无法启动Windows时&#xff0c;…

Postman使用实例

Postman使用实例 实体类Emp package com.example.springboot_postman.pojo;import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor;import javax.persistence.*; import j…

C++设计模式-原型(Prototype)

目录 C设计模式-原型&#xff08;Prototype&#xff09; 一、意图 二、适用性 三、结构 四、参与者 五、代码 C设计模式-原型&#xff08;Prototype&#xff09; 一、意图 用原型实例指定创建对象的种类&#xff0c;并且通过拷贝这些原型创建新的对象。 二、适用性 当…

012-第二代硬件选型

第二代硬件选型 文章目录 第二代硬件选型项目介绍重新换平台缘由X86 && Arm 架构切换 ARM Linux 硬件选型系统确定Qt 版本确定总结一下 关键字&#xff1a; Qt、 Qml、 Arm、 X86、 linux 项目介绍 欢迎来到我们的 QML & C 项目&#xff01;这个项目结合了 QM…

IntelliJ IDEA配置Cplex12.6.3详细步骤

Cplex12.6.3版IntelliJ IDEA配置详细步骤 一、Cplex12.6.3版下载地址二、Cplex安装步骤三、IDEA配置CPLEX3.1 添加CPLEX安装目录的cplex.jar包到项目文件中3.2 将CPLEX的x64_win64文件夹添加到IDEA的VM options中 四、检查IDEA中Cplex是否安装成功卸载Cplex 一、Cplex12.6.3版下…

Seata 源码篇之AT模式启动流程 - 下 - 04

Seata 源码篇之AT模式启动流程 - 下 - 04 全局事务提交分支事务全局提交全局事务回滚分支事务全局回滚小结 本系列文章: Seata 源码篇之核心思想 - 01Seata 源码篇之AT模式启动流程 - 上 - 02Seata 源码篇之AT模式启动流程 - 中 - 03 上一篇文章&#xff0c;我们看了Seata AT…