ARM底层汇编基础指令

汇编语言的组成

  • 伪操作
    • 不参与程序执行,但是用于告诉编译器程序怎么编译
    • .text .global .end .if .else .endif .data
  • 汇编指令
    • 编译器将一条汇编指令编译成一条机器码,在内存里一条指令占4字节内存,一条指令可以实现一个特定的功能
  • 伪指令
    • 不是指令,看起来像是一条指令,可以实现和指令类似的功能。一条伪指令实际上可能是由多条指令共同实现
  • 注释
    • 单行注释:@
    • 多行注释:/* */
  • 条件编译
.if 0
@text
.else
@text
.endif

汇编指令的介绍

  • 基本数据操作指令
    • 数据搬移指令:=
    • 数据位移指令:<< >>
    • 数据算数运算指令:+ - * /
    • 位运算指令:$ |~ ^
    • 数据比较指令:
  • 跳转指令
  • 内存读写指令
  • 状态寄存器读写指令
  • 软中断指令

汇编指令的基本语法格式

基本格式: <opcode>{cond}{s} Rd,Rn,#oprand2
解释:opcode:指令码cond:条件码指令不加条件码,指令默认无条件执行指令加条件码,指令有条件执行s:状态位指令不加s,指令执行的结果不会影响CPSR寄存器指令加s,指令执行的结果会影响CPSR寄存器Rd:目标寄存器Rn:第一操作寄存器#oprand2:第二操作数1)立即数2)有效数:将一个数取反之后,变成立即数3)寄存器4)经过移位的寄存器注意事项:
1)汇编指令中不区分大小写
2)汇编指令不需要以;号结尾
3)<opcode>{cond}{s}:需要连在一起写
4)Rd,Rn,#oprand2:需要用逗号分隔开
5) <opcode>{cond}{s}和Rd,Rn,#oprand2需要用空格分隔开

数据搬移指令

  • 指令码:mov mvn
  • 格式:<opcode>{cond}{s} Rd,#oprand2
@代码1:mov r0,#0xf @ r0 = 0xfmov r1,#0xff@ mov r2,#0xfff @ error@ mov r3,#0xffff @ error@ mov r4,#0xfffff @ errormov r5,#0xffffffmov r6,#0xfffffffmov r7,#0xffffffff/*------------------ ------------------ ---------------*/
@ 代码2:mvn r5,#0xff  @ 0xff按位取反之后,赋值给r5mov r0,#0xff000000 @ 0xff 8mov r1,#0x1f800000 @ 0x7e  10mov r2,#0x00ffffff   @ ~r2 = 0xff000000mov r3,#0x0fffffff   @ ~r3 = 0xf0000000mov r4,#0xffffffff   @ ~r4 = 0x00000000

立即数判断

在这里插入图片描述

  • 立即数就是队#号后面的这个数有要求
  • 首先要从你判断的这个数中间找到0~0xff之间的数(需要将要判断的这个数所有的1包含)
  • 将找到的这个0~0xff之间的数,循环右移偶数位(低位移出,补到高位)
  • 如果能够得到你要判断的那个数,说明你这个数是一个立即数

示例代码

要判断的数:0xf0000 0000 0000 0000 0000 0000 0000 1111
找到0~0xff: 0xf0000 0000 0000 0000 0000 0000 0000 1111
循环右移位数:0
是否为立即数:是要判断的数:0xff0000 0000 0000 0000 0000 0000 1111 1111
找到0~0xff: 0xff
循环右移位数:0
是否为立即数:是要判断的数:0xfff0000 0000 0000 0000 0000 1111 1111 1111 
找到0~0xff: 不能
循环右移位数:
是否为立即数:不是要判断的数:0xf000000f1111 0000 0000 0000 0000 0000 0000 1111
找到0~0xff: 0xff0000 0000 0000 0000 0000 0000 1111 1111
循环右移位数:4
是否为立即数:是要判断的数:0xff0000001111 1111 0000 0000 0000 0000 0000 0000
找到0~0xff: 0xff0000 0000 0000 0000 0000 0000 1111 1111         
循环右移位数:8
是否为立即数:是要判断的数:0x1fe000000001 1111 1110  0000 0000 0000 0000 0000
找到0~0xff: 0xff0000 0000 0000 0000 0000 0000 1111 1111            
循环右移位数:11
是否为立即数:不是要判断的数:0x1f8000000001 1111 1000  0000 0000 0000 0000 0000
找到0~0xff: 0x7e0000 0000 0000 0000 0000 0000 0111 1110
循环右移位数:10
是否为立即数:是

伪指令(将非立即数保存至寄存器中)

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

移位操作指令

  • 格式:<opcode>{cond}{s} Rd,Rn,#oprand2
  • 指令码
    • lsl:逻辑左移 高位移出,低位补0
    • lsr:逻辑右移 低位移出,高位补0
    • asr:算数右移 有符号数右移,低位移出,高位补符号位
    • ror:循环右移 低位移出,补到高位

示例

	mov r0,#0xff@1.将0xff逻辑右移4位,并存入r1寄存器中lsr r1,r0,#0x4  @ r1 = r0 >> 4 =  0xf@ 0000 0000 0000 0000 0000 0000 1111 1111@ 0000 0000 0000 0000 0000 0000 0000 1111@2.将r1逻辑左移4位,并存入r2寄存器中lsl r2,r1,#0x4  @ r2 = r1 << 4 = 0xf0@ 0000 0000 0000 0000 0000 0000 0000 1111@ 0000 0000 0000 0000 0000 0000 1111 0000ldr r3,=0x800000f0@将r3寄存器中的值,算数右移4位,并存入r4寄存器中asr r4,r3,#0x4  @ r4 = 0xf800000f@ 1000 0000 0000 0000 0000 0000 1111 0000@ 1111 1000 0000 0000 0000 0000 0000 1111@将r4寄存器中的值,循环右移4位,并存入r5寄存器中ror r5,r4,#0x4  @ r5 = 0xff800000@ 1111 1000 0000 0000 0000 0000 0000 1111@ 1111 1111 1000 0000 0000 0000 0000 0000

位运算指令

  • 格式:<opcode>{cond}{s} Rd,Rn,#oprand2
  • 口诀:看到清零用& 看到置1用|
and:按位与(&)------>与0清0,与1不变
orr:按位或(|) ------>或0不变,或1置1
eor:按位异或(^) ------>异或0不变,异或1取反
bic:按位清除  ------> 哪一位写1,对应的位进行清0

示例

ldr r0,=0x12345678	@ 1> 将R0寄存器中的第[4]位清0,保持其他位不变bic r1,r0,#(0x1 << 4)and r1,r0,#(~(0x1 << 4))@ 2> 将R0寄存器中的第[7]位置1,保持其他位不变orr r2,r0,#(0x1 << 7)@ 3> 将R0寄存器中的第[31:28]位清0,保持其他位不变bic r0,#(0xf << 28)and r0,#(~(0xf << 28))@ 4> 将R0寄存器中的第[7:4]位置1,保持其他位不变orr r0,#(0xf << 4)@ 5> 将R0寄存器中的第[15:11]位修改为10101,保持其他位不变@ 先置1,在清0orr r0,#(0x1f << 11)and r0,#(~(0x1 << 12))and r0,#(~(0x1 << 14))@ 先清0,在置1 ----->重点掌握and r0,r0,#(~(0x1f << 11))orr r0,r0,#(0x15 << 11)

算数运算指令

指令码:add adc sub sbc mul
基本格式: <opcode>{cond}{s} Rd,Rn,#oprand2
add: 普通加法指令
adc:带进位加法指令
sub:普通减法指令
sbc:带借位减法指令
mul:乘法指令  格式:<opcode>{cond}{s} Rd,Rn   

示例

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位取反)

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位,需要考虑条件位

比较指令

指令码:cmp
基本格式: <opcode>{cond} Rn,#oprand2
1)比较指令没有目标寄存器
2)比较指令本质做减法运算
3)比较指令的执行结果会影响CPSR寄存器的NZCV位,不需要加s
4)比较指令需要和条件码搭配使用
5)前面所有学习的指令都属于无条件指令,比较指令属于有条件执行/*比较两个数大小第一个数比第二个数大:第一个数减第二个数第一个数比第二个数小:第二个数减第一个数*/mov r0,#0x3mov r1,#0x4cmp r0,r1subhi r0,r0,r1  @ r0 = r0 - r1subcc r1,r1,r0  @ r1 = r1 - r0

在这里插入图片描述

跳转指令

指令码:b 
格式:b {cond} 标签
b指令码:有去无回,不会保存函数的返回地址到LR寄存器中-------------------b loop------------------- loop:-------------------
/****************************************************/
指令码: bl
格式:bl{cond} 标签
bl指令码:有去有回,会保存函数的返回地址到LR寄存器中-------------------bl loop-------------------  ----->会保存函数的返回地址到LR寄存器中loop:-------------------

示例

mov r0,#0x1mov r1,#0x2bl add_func  @ 跳转到add_func标签下第一条指令执行mov r3,#0x3b stopadd_func:add r0,r0,r1mov pc,lr @手动恢复现场 pc = lr

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

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

相关文章

Hudi第二章:集成Spark(二)

系列文章目录 Hudi第一章&#xff1a;编译安装 Hudi第二章&#xff1a;集成Spark Hudi第二章&#xff1a;集成Spark(二) 文章目录 系列文章目录前言一、IDEA1.环境准备2.代码编写1.插入数据2.查询数据3.更新数据4.指定时间点查询5.增量查询6.删除数据7.覆盖数据 二、DeltaStre…

设计模式8、装饰者模式 Decorator

解释说明&#xff1a;动态地给一个对象增加一些额外的职责。就扩展功能而言&#xff0c;装饰模式提供了一种比使用子类更加灵活的替代方案 抽象构件&#xff08;Component&#xff09;&#xff1a;定义一个抽象接口以规范准备收附加责任的对象 具体构件&#xff08;ConcreteCom…

ELK整合springboot(第二课)

一、创建一个springboot的项目 pom文件如下&#xff1a; <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLo…

Mybatis 二级缓存(使用Redis作为二级缓存)

上一篇我们介绍了mybatis中二级缓存的使用&#xff0c;本篇我们在此基础上介绍Mybatis中如何使用Redis作为二级缓存。 如果您对mybatis中二级缓存的使用不太了解&#xff0c;建议您先进行了解后再阅读本篇&#xff0c;可以参考&#xff1a; Mybatis 二级缓存https://blog.csd…

Codeforces Round 894 (Div. 3) D(数学题好难不会)

题目链接&#xff1a;Codeforces Round 894 (Div. 3) D 题目&#xff1a; 特马决定提高自己制作冰淇淋的技能。他已经学会了如何用两个球把冰淇淋做成圆锥形。 在痴迷冰淇淋之前&#xff0c;特马对数学很感兴趣。因此&#xff0c;他很想知道要制作完全n个不同类型的冰淇淋&am…

Linux 基本语句_4_指针和函数

指针函数 顾名思义&#xff0c;即返回值为指针的函数 int * f (int n){int *p NULL;//空指针return p;//返回一个地址 }函数指针 指向函数的指针&#xff0c;每个函数都有自己的入口地址&#xff0c;函数指针专门指向这些地址#include <stdio.h>int max(int a, int b)…

前端任意修改地图风格颜色

在做地图相关应用时&#xff0c;常常遇到地图风格与UI界面不搭配的问题&#xff0c;如果在制图时就制作多种风格的地图&#xff0c;耗时耗力&#xff0c;超出成本控制。这里推荐一种快捷的方法&#xff0c;可在前端快速更改地图成任意风格&#xff0c;使色调与UI搭配。 先上一张…

【sql注入】如何通过SQL注入getshell?如何通过SQL注入读取文件或者数据库数据?一篇文章告诉你过程和原理。sql注入【二】

前言 本篇博客主要是通过piakchu靶场来讲解如何通过SQL注入漏洞来写入文件&#xff0c;读取文件。通过SQL输入来注入木马来getshell等&#xff0c;讲解了比较详细的过程&#xff1b; 如果想要学习SQL注入原理以及如何进行SQL注入&#xff0c;我也写了一篇详细的SQL注入方法及…

Apache Flume

Flume 1.9.0 Developer Guide【Flume 1.9.0开发人员指南】 Introduction【介绍】 摘自&#xff1a;Flume 1.9.0 Developer Guide — Apache Flume Overview【概述】 Apache Flume is a distributed, reliable, and available system for efficiently collecting, aggregati…

编程每日一练(多语言实现)基础篇:求总数问题

文章目录 一、实例描述二、技术要点三、代码实现3.1 C 语言实现3.2 Python 语言实现3.3 Java 语言实现3.4 JavaScript 语言实现 一、实例描述 集邮爱好者把所有的邮票存放在三个集邮册中&#xff0c;在A册内存放全部的十分之二&#xff0c;在B册内存放不知道是全部的七分之几&…

win11+wsl+git+cmake+x86gcc+armgcc+clangformat+vscode环境安装

一、安装wsl &#xff08;1&#xff09;打开power shell 并运行&#xff1a; Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux Enable-WindowsOptionalFeature -Online -FeatureName VirtualMachinePlatform &#xff08;2&#xff0…

pytorch第一天(tensor数据和csv数据的预处理)lm老师版

tensor数据&#xff1a; import torch import numpyx torch.arange(12) print(x) print(x.shape) print(x.numel())X x.reshape(3, 4) print(X)zeros torch.zeros((2, 3, 4)) print(zeros)ones torch.ones((2,3,4)) print(ones)randon torch.randn(3,4) print(randon)a …

基于Java的汽车票网上预订系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09;有保障的售后福利 代码参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作…

jenkins+newman+postman持续集成环境搭建

一、Newman简介 Newman是一款基于Node.js开发的&#xff0c;可以运用postman工具直接从命令运行和测试postman集合 二、Newman应用 环境准备&#xff1a;js/ cnpm或npm配置好环境&#xff0c;执行如下命令 三、安装newman 验证是否安装成功&#xff0c;命令&#xff1a;newm…

模块化CSS

1、什么是模块化CSS 模块化CSS是一种将CSS样式表的规则和样式定义封装到模块或组件级别的方法&#xff0c;以便于更好地管理、维护和组织样式代码。这种方法通过将样式与特定的HTML元素或组件相关联&#xff0c;提供了一种更具可维护性、可复用性和隔离性的方式来处理样式。简单…

上机实验一 顺序表的基本操作和简单程序 西安石油大学数据结构

上机一 实验名称&#xff1a;顺序表的基本操作和简单程序 题目&#xff1a;设计一个有序顺序表&#xff0c;实现以下操作&#xff1a; 1.将元素x插入表中并保持有序&#xff1b; 2.查找值为x的元素&#xff0c;若找到则将其删除&#xff1b; 3.输出表中所有元素。 要求&a…

腾讯云 Cloud Studio 实战训练营结营活动获奖公示

点击链接了解详情 “腾讯云 Cloud Studio 实战训练营” 是由腾讯云联合 CSDN 推出的系列开发者技术实践活动&#xff0c;通过技术分享直播、动手实验项目、优秀代码评选、有奖征文活动等&#xff0c;让广大开发者沉浸式体验腾讯云开发者工具 Cloud Studio 的同时&#xff0c;实…

云畅科技TMS解决方案助力华菱线缆实现智能货运管理

9月26日下午&#xff0c;湖南华菱线缆股份有限公司TMS物流系统上线启动会成功举办&#xff0c;由云畅科技倾力打造的华菱线缆TMS物流系统正式上线运行&#xff0c;标志着湖南华菱线缆股份有限公司在智能化物流货运管理领域的一次重大突破。 湖南华菱线缆股份有限公司董事兼总经…

【设计模式】六、建造者模式

文章目录 需求介绍角色应用实例建造者模式在 JDK 的应用和源码分析java.lang.StringBuilder 中的建造者模式 建造者模式的注意事项和细节 需求 需要建房子&#xff1a;这一过程为打桩、砌墙、封顶房子有各种各样的&#xff0c;比如普通房&#xff0c;高楼&#xff0c;别墅&…

【C语言次列车ing】No.1站---C语言入门

文章目录 前言一、什么是C语言二、第一个C语言程序三、数据类型四、变量、常量五、字符串转义字符注释 前言 &#x1f467;个人主页&#xff1a;小沈YO. &#x1f61a;小编介绍&#xff1a;欢迎来到我的乱七八糟小星球&#x1f31d; &#x1f4cb;专栏&#xff1a;C语言次列车i…