ARM day2、day3 汇编

一、汇编学习:可以向上理解软件、向下感知硬件

二、符号(注释)

@注释
#注释(放在行首表示注释一行)
/*    */注释
#+数字立即数
一种标号(比如main:        loop:)
.text        .end+换行固定格式

三、ARM指令格式和立即数

ARM指令构成

ARM 指令包含操作码和一些其他的信息,只剩下8 位存放数据

具体来说,一个 ARM 指令通常由以下部分组成:

  1. 操作码(Opcode):这指定了指令的基本操作,例如 ADD、MOV、SUB 等。
  2. 条件码(Condition):这指定了该指令在什么条件下执行。
  3. 寄存器索引(Register Index):这指定了要操作的寄存器。
  4. 位移量(Offset):这是一个相对于某个基址的偏移量,常用于内存操作。
  5. 立即数(Immediate):这是一个直接嵌入到指令中的数值。

其中,操作码、条件码、寄存器索引和位移量总共占据了大部分的指令位数,因此,一个 ARM 指令中只有少部分(通常为 8 位)是用来表示立即数的。

例如,一个 ARM 指令可能是这样的格式:

Opcode    Condition   Register1  Register2  Offset/Displacement   #0

一般指令格式

操作码  目的操作数   源操作数  

mov      r0,        #5   
mov      r0,           r1 

立即数的优点取指的时候,可以直接读到cpu  不需要单独去内存读取,速度快
立即数的缺点不能是任意的32位数字,有局限,且只能放在指令右边

 四、如何判断立即数合法

转化为二进制编码,观察第一个1和最后一个1之间的位数(包含这两个1)

1、将数据转换为 二进制编码   4 个一组 
2、数1 的位数, 如果超过8 个 那就不是立即数
3、如果数据中有连续  大于等于 24 个 0 ,通过循环位移 偶数位, 使其高位全部为0 
4、找到 高位1 去掉前边偶数个0 
5、找到低位的1, 去掉末尾偶数个0 
6、剩下的位数小于等于8 那么就是立即数,否则 不是 

eg1:0xF000 000F

1111  0000 0000 0000 0000 0000 0000  1111 -- 1111 1111合法

eg2:0x123

... 0000    0001 0010 0011 -- 01 0010 0011不合法

eg3:0x234

....     0010 0011 0100合法

eg4:0x3F0

...      0011 1111 0000合法

五、伪指令

伪指令不是指令

伪指令和指令的根本区别编译后,是否生成机器码(伪指令不会生成)
伪指令的意义

指导编译的过程(如果需要执行伪指令,必须先翻译成在指令)

比如.text  .end 也是伪指令

伪指令和编译器相关我们用到是gnu工具链,因此我们学习的是gnu 环境下的汇编伪指令
常用伪指令

    ldr  //大范围地址的加载指令
    adr  //小范围地址的加载指令
    adrl //中范围地址的加载指令
    nop  //空操作

    ldr (load register) 将内存内容加载进入通用寄存器 
    str (store register) 将寄存器内容存入内存空间

eg:

ldr r0, =0x12345678

num : .word   0x15300000     //int  num = 0x15300000 

buf1: .byte 1, 2, 3, 4        //char  buf1[4] = {1,2,3,4}; 

六、指令--搬移、偏移指令

mov

搬移

mov r2, r1   // r2 = r1

mov r0, #7   //r1  = 7 

mvn

取反搬移

mvn r0, r1   // r0 = ~r1

ldr向寄存器存入非立即数可以用伪指令
LSL左移位
LSR右移位
ASL算术左移位(位数不够补符号位)
ASR算术右移位(位数不够补符号位)
ROR循环移位
RRX带扩展的循环右移
偏移指令总结    mov r0,r2,  lsr #3   //r0 = r2  >> 3 
    mov r1 ,r0,lsl #1       //r1 = r0 << 1 
    add   r2, r1,r0,lsr #2  // r2 = r1 + r0 >> 2 
        
        LSL '逻辑左移' (Logical   shift  left)
        LSR '逻辑右移'(Logical   shift  right)
        ASL '算术左移' (Arithmet  shift  left )
        ASR '算术右移'(Arithmet  shift right )
        ROR '循环右移'
        RRX '带扩展的循环右移'
重要例子

tst  r0, #0x8    @判断某个数的某几位 是否为 0
    @ movne  r11, #1
    moveq  r11, #1   @当上一条判断结果相等时  执行 mov
    movne  r12, #2   @当上一条判断结果不相等时执行mov 

tst  r0, #0x8    表示判断r0的第三位(8的二进制1000,也就是从右往左的第四位(0 1 2 3))是否为0

eq  ne表示相等/不相等

 搬移

练习:a) r0 = 16b) r0 = r1/16c) r1 = r2 *2d) r0 = -4e) r1 = r0/2答:   mov r0, #16 	mov r1, #32mov r2,r1, LSR #4mov r2, #4mov r3, r2, LSL #1	mov r0, #-4 	mov r1,r0, ASR #1 

偏移(移位)

.text   @基本格式的头
@搬移指令 mov r0, #3			@搬移指令:   r0   = 3 ; #3 立即数 ldr r0, =0xfff00000 @ldr 伪指令   r0   = 0xfff mov r1,r0			@搬移指令	  r1   = r0 @移位mov  r0, #0x4	mov  r1, r0,  LSL #1 @r1=r0 << 1 , 逻辑左移: 高位移除部分舍去,低位不够补0ldr  r0, =0xffffffffmov  r2, r0, LSR #1  @r2=r0 >>1  逻辑右移,低位移除部分舍去, 高位部分不够补 0mov  r3, r0, ASR #1  @r3 = r0 >> 1  算术右移,低位移除部分舍去 高位不够 补 符号位ldr  r0, =0x7000000f mov  r4,r0, ROR #1	  @r4 = r0 >>1 , 循环右移, 低位移除部分补到 高位 ldr  r0, =0xff0000ffmvn  r5,r0			  @r5 = ~r0.end    @基本格式的尾巴  通常 该行下边 加空行

七、指令--位操作  AND ORR BIC EOR

and
orr
bic

按位清零(比如说0x4 就表示第2位(从0开始数)清零)

bic  r0,r1,#0x4  //r0  = r1 &(~0x4  )

eor异或
.text   @基本格式的头@逻辑指令mov r0, #6mov r1, #5and r2, r0,r1	@r2 = r1 & r0orr r3, r0,r1	@r3 = r1 | r0eor	r4, r0,r1	@r4 = r1 ^ r0 ldr  r0,=0x12345678bic  r1, r0, #0xffbic  r2,r0, #0xf0000000tst  r0, #0x8	@判断某个数的某几位 是否为 0@ movne  r11, #1moveq  r11, #1   @当上一条判断结果相等时  执行 movmovne  r12, #2   @当上一条判断结果不相等时执行mov @使能中断和快速中断(设置cpsr的值)mrs r0, cpsr  @ r0 = cpsrbic r1, r0, #0xc0msr cpsr, r1  @cpsr = r1.end    @基本格式的尾巴  通常 该行下边 加空行

 八、指令--比较指令、测试指令

用法注意:  

        cmp

        moveq

        movne

cmp

cmp   r1, r0           //改变 cpsr 的 NZ 

moveq  r2, #0    //相当于  if (r1 == r0)  r2 = 0(这是两行代码)

cmn
关系符号

eq ==

ge >=

gt >

le <=

lt <

ne !=

tst

实质是做 与运算, 通常用于 测试某一位或几位是0 还是1 结果 CPSR  'Z'  位来判断, Z 位位 1 表明结果为0 

tst  r0,  #0x10  //测试 第4位是否为 0,  if((r0  &(0x10)) == 0)
//00010000

teq

实质是异或运算  测试两个 数是否相等,如果两个数相等或者异或结果 为 0  修改 cpsr 的z 位 判断

teq r0, r1   // if((r0 ^ r1 ) == 0) 

.text   @基本格式的头
@比较指令/*int  a = 5;if(a >= 5)a =  0else a = 100*//*mov r0, #5cmp r0, #5   		@比较指令 , 比较 r0 和 5 movge   r0 , #0		@当cmp的结果 >= 时, r0 = 0 movlt	r0, #100	@当cmp的结果 是 < 时, r0 = 100*/.end    @基本格式的尾巴  通常 该行下边 加空行

九、指令--算术指令 :ADD ADC SUB SBC RSB RSC

add

相加

add r2, r1,#3     //r2 = r1 + 4 

adds

会改变条件位的相加(配合adc使用)

adds  r0, r1, r2   //  r0 = r1 + r2  &&  (cpsr ) v c 

CPSR:进位 -- c置为1    溢出 -- v置为1

补充--溢出:在两个正数相加时,如果结果超过了机器所能表示的最大正数,那么就发生了上溢。同样地,在两个负数相加时,如果结果小于机器所能表示的最小负数,那么就发生了下溢

adc

带进位的加法(常用于64位加法,配合adds使用)

adc  r0, r1, r2  //r0 = r1 + r2  + (cpsr)  c

sub

相减

sub r1, r2, r3 

subs

影响cpsr的条件位 

没有借位 时 cpsr  'c' 位 置1  当有借位 c = 0 

sbcsbc  带借位的减法
rsbrsb   逆向减法
rsb r1,r2, r3  //r1  = r3 - r2 
mul

乘法指令 

mul r2, r0, r1  // r2 = r0 * r1 

练习:64位加减法(高32位 低32位)

.text   @基本格式的头@算术指令mov r0, #10mov r1, #5add r2, r0, r1 	@r2 = r0 + r1 ldr  r0, =0xff000000ldr  r1, =0xf0000000@add  r2, r0, r1    @(不带进位加法)adds  r2, r0, r1  @r2 = r0 + r1 , 如果有进位 那么会修改cpsr的进位值mov r3, #1mov r4, #1adc r5,r3,r4    	@r5 = r3 + r4 + 进位值@64 bit 两个数的加法  r0, r1 表示被加数, r2, r3表示加数 @64 bit 两个数的减法 ldr r0, =0xffffffff			@低32 bitldr r1, =0x1				@高32bitldr  r2,=0x1				@低32bit ldr	 r3,=0x5				@高32bit adds  r4, r0, r2adc   r5, r1, r3subs  r6, r2,r0sbc   r7, r3,r1@add  r2, r0, r1 			@不带进位 不能计算 64 bit .end    @基本格式的尾巴  通常 该行下边 加空行

十、条件码(eq、ne、lt小于、gt大于)

十一、跳转

b 类似 goto 
    bl  跳转之前 先保存 下一条指令的地址
    bl: lr(r14) = pc (r15) -4    (由cpu 帮我们执行 )

练习:函数跳转

int  main(void )
{
    
    int ret = 0;
    func1(2);
    while(1) ; 
}
func1(int a)
{
    if(a == 2)  return func2(a)
        else   return func3 (a)        
}

func2(int a)
{
    return a+3;       
}
func3(int a)
{
    return a-1; 
}    

.text   @基本格式的头@跳转练习main:mov r0, #0mov r1, #2bl func1main_end:b  main_end  	@死循环func1:cmp r1, #2bleq  func2blne  func3
func1_end:func2:add r1, #3b func2_end
func2_end:mov pc, lrfunc3:@.....字节补充一下
func3_end:.end    @基本格式的尾巴  通常 该行下边 加空行

练习:1加到100

.text   @基本格式的头@跳转指令 /*mov  r0, #1mov  r1, #10b  t			@跳转指令, 跳到 t 后执行 add  r2, r0, r1t:	sub r3, r0, r1@b  t */@实现 1-100的累加 和 /*for(int i=1; i<=100; i++){static int sum += i; }*/mov r0, #0    	@类似 sum 累加和mov r1, #1		@类似 i   循环变量
loop:@循环计算cmp r1, #100bgt	loop_end	@这句 相当于 判断 i 大于 100 跳出循环 add r0,r1		@相当于 sum += i; add r1, #1		@相当于 i++b loop			@继续下次循环loop_end:@结束 mov r12,r0   @把计算结果 放到 r12 .end    @基本格式的尾巴  通常 该行下边 加空行

练习:延时1s

.text   @基本格式的头@跳转指令 @实现延时 1 sldr r0, = 0x1f1fffff   @具体多少为 1秒 需要计算
loop:cmp r0, #0beq  loop_endsub r0,#1b loop
loop_end:mov r12, #0.end    @基本格式的尾巴  通常 该行下边 加空行

十二、修改ARM状态和模式 ???

.text   @基本格式的头@判断 当前工作状态是否 是ARM 状态 ,如何切换到 user 模式或其他模式 mrs  r0, cpsr  				@r0 = cpsr mov r1, #0x20  				@0010 0000   T 位    orr  r1, r1, #0x1000000 	@J 位, 结果r1把 T位和 J位置为1 ,其余为0tst r0, r1				@判断 r0中的J和 T 是否为 0 biceq  r0, #0x1f		@把 mode 清0 orreq  r0, #0x10		@把mode 变为 user模式: 10000msr  cpsr, r0  			@cpsr = r0.end    

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

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

相关文章

2024 年 SEO 您需要了解的 8 个关键 SEO 趋势

SEO的未来正趋向于更加以用户为中心、合乎道德和技术先进的方法。 为什么&#xff1f; 人工智能 &#xff08;AI&#xff09; 和机器学习在搜索引擎中的兴起使他们能够更好地理解用户意图并提供更相关的结果Google 将经验、专业知识、权威性和可信度 &#xff08;E-E-A-T&…

安全基础~web攻防特性1

文章目录 知识补充ASP安全Aspx安全分析与未授权访问php特性&web89~97靶场练习ctfshow 知识补充 使用thinkphp开发的框架&#xff0c;其首页访问指向public目录&#xff0c;指向其中的index.php文件 指向的index.php打开网页后是如下情况&#xff0c;代码如下 定义应用目…

计算机网络——第三层:网络层

1. IP数据报 1.1 IPV4数据报 1.1.1 IPv4数据报的结构 如图按照RFC 791规范显示了一个IPv4数据包头部的不同字段 IPv4头部通常包括以下部分&#xff1a; 1.1.1.1 版本&#xff08;Version&#xff09; 指明了IP协议的版本&#xff0c;IPv4表示为4。 1.1.1.2 头部长度&#x…

【机器学习入门】机器学习基础概念与原理

*&#xff08;本篇文章旨在帮助新手了解机器学习的基础概念和原理&#xff0c;不深入讨论算法及核心公式&#xff09; 目录 一、机器学习概念 1、什么是机器学习&#xff1f; 2、常见机器学习算法和模型 3、使用Python编程语言进行机器学习实践 4、机器学习的应用领域 二…

nxp s32k144芯片使用J-LINK程序刷写

1.nxp s32k144 (1)打开软件&#xff1a;J-Flash V6.30j (2)新建工程&#xff1a;file->new project (3)选择芯片型号和 target interface (4)可以保存芯片和接口配置 (5)打开程序&#xff1a;File->open data file &#xff08;6&#xff09;程序刷写&#xff1a;T…

Linux下安装Mysql【CentOS7 】

Linux下安装Mysql 一、Linux下安装Mysql-5.7.41【tar包下载安装】1.1.首先检查是否已经安装过mysql1.2.下载Linux版本的Mysql-5.71.3.解压缩1.4.安装执行 rpm 安装包需要先下载 openssl-devel 插件1.5.安装 Mysql5.7 执行 rpm 安装包1.6.Mysql相关操作命令1.7.查看Mysql-5.7 临…

Hadoop集群配置及测试

Hadoop集群配置及测试 NameNode与SecondaryNameNode最好不在同一服务器 ResourceManager较为消耗资源&#xff0c;因而和NameNode与SecondaryNameNode最好不在同一服务器。 配置文件 hadoop102hadoop103hadoop104HDFSNameNodeDataNodeDataNodeSecondaryNameNodeDataNodeYAR…

快速上手的 AI 工具-文心一言

简介 最近正打得火热的AIGC概念&#xff0c;相信大家肯定也都多少接触到了&#xff0c;那么AIGC概念股到底是什么呢&#xff1f;我个人最近也看了一些平台如&#xff1a;文心一言、通义千问、讯飞星火、豆包等等&#xff01;各位朋友也千万不要错过啦&#xff0c;真是各有各的特…

VC++中使用OpenCV读取图像、读取本地视频、读取摄像头并实时显示

VC中使用OpenCV读取图像、读取本地视频、读取摄像头并实时显示 最近闲着跟着油管博主murtazahassan&#xff0c;学习了一下LEARN OPENCV C in 4 HOURS | Including 3x Projects | Computer Vision&#xff0c;对应的Github源代码地址为&#xff1a;Learn-OpenCV-cpp-in-4-Hour…

顺序表(C/C++)

本篇将讲解一些关于顺序表的内容&#xff0c;顺序表分为静态顺序表和动态顺序表&#xff0c;其中经常用到的为动态顺序表&#xff0c;所以本篇将以动态顺序表为重点给出一些关于动态顺序表的操作。 因为顺序表的实现逻辑较为简单&#xff0c;对于代码的讲解大多以注释给出。 1…

PLSQL去除一个字符串中的数字

PLSQL去除一个字符串中的数字 SQL Select regexp_replace(abc1234ABC678aaad590AAA, [0-9], ) As 去数字后From dual;效果

11.2 PCL从ROS获取激光雷达的点云数据及处理

这部分内容结合了前面的内容。其实很简单&#xff0c;分三步走就可以&#xff1a;首先是通过ROS打开激光雷达&#xff0c;查看PCL配置需要的信息。然后是用PCL通过ROS发布的topic获取激光雷达的数据。最后将ROS和PCL结合。 实现上面两步的前提是我们已经部署好了ROS环境及PCL环…

python下常用的爬虫模块

目录 一&#xff1a;requests 二&#xff1a;BeautifulSoup 三&#xff1a;Scrapy 四&#xff1a;Selenium 一&#xff1a;requests requests 是一个用于发送 HTTP 请求的 Python 库。它提供了简洁的 API 来发送各种类型的 HTTP 请求&#xff0c;如 GET、POST、PUT、DELETE…

AP8851L 宽电压降压恒压DC-DC 电源管理芯片

产品描述 AP8851L 一款宽电压范围降压型 DC-DC 电源管理芯片&#xff0c;内部集成使能 开关控制、基准电源、误差放大器、过 热保护、限流保护、短路保护等功能&#xff0c; 非常适合在宽输入电压范围具有优良 的负载和线性调整度。 AP8851L 芯片包含每周期的峰值 限流、…

C++力扣题目40--组合总和II

力扣题目链接(opens new window) 给定一个数组 candidates 和一个目标数 target &#xff0c;找出 candidates 中所有可以使数字和为 target 的组合。 candidates 中的每个数字在每个组合中只能使用一次。 说明&#xff1a; 所有数字&#xff08;包括目标数&#xff09;都是…

数据仓库面试题

1 思维导图&数仓常见面试题 2 题目 1. 数据仓库是什么&#xff1f; 数据仓库是一个面向主题的&#xff08;订单、支付、退单等&#xff09;、集成的&#xff08;整合多个信息源的大量数据&#xff09;、非易失的&#xff08;一般不会进行删除和修改操作&#xff09;且随时…

低声下气捧于正,嘉行还“行”不“行”?

随着祝绪丹辞演于正新剧一事愈演愈烈&#xff0c;嘉行传媒又站上了舆论的风口浪尖。 事情的起因是于正的新剧开机&#xff0c;演员阵容和此前透露的有所差别&#xff0c;他声称明明已经与嘉行传媒艺人祝绪丹谈好合作&#xff0c;对方却为了另一部剧的女一号而放了他鸽子。 网…

【Java】十年老司机转开发语言,新小白从学习路线图开始

欢迎来到《小5讲堂》 大家好&#xff0c;我是全栈小5。 这是《Java》序列文章&#xff0c;每篇文章将以博主理解的角度展开讲解&#xff0c; 特别是针对知识点的概念进行叙说&#xff0c;大部分文章将会对这些概念进行实际例子验证&#xff0c;以此达到加深对知识点的理解和掌握…

Elasticsearch各种文档操作

本文来记录下Elasticsearch各种文档操作 文章目录 初始化文档数据查询所有文档匹配查询文档关键字精确查询文档多关键字精确查询文档字段匹配查询文档指定查询字段查询文档 初始化文档数据 在进行各种文档操作之前&#xff0c;我们先进行初始化文档数据的工作 查询所有文档 在 …

SpringMVC参数接收见解4

# 4.参数接收Springmvc中&#xff0c;接收页面提交的数据是通过方法形参来接收&#xff1a; 处理器适配器调用springmvc使用反射将前端提交的参数传递给controller方法的形参 springmvc接收的参数都是String类型&#xff0c;所以spirngmvc提供了很多converter&#xff08;转换…