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 = 16
    b) r0 = r1/16
    c) r1 = r2 *2
    d) r0 = -4
    e) r1 = r0/2
 答:   
	mov r0, #16 	
	mov r1, #32
	mov r2,r1, LSR #4
	mov r2, #4
	mov 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 , 逻辑左移: 高位移除部分舍去,低位不够补0

	ldr  r0, =0xffffffff
	mov  r2, r0, LSR #1  @r2=r0 >>1  逻辑右移,低位移除部分舍去, 高位部分不够补 0

	mov  r3, r0, ASR #1  @r3 = r0 >> 1  算术右移,低位移除部分舍去 高位不够 补 符号位
	
	ldr  r0, =0x7000000f 
	mov  r4,r0, ROR #1	  @r4 = r0 >>1 , 循环右移, 低位移除部分补到 高位 
	
	ldr  r0, =0xff0000ff
	mvn  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, #6
	mov r1, #5
	and r2, r0,r1	@r2 = r1 & r0
	orr r3, r0,r1	@r3 = r1 | r0
	eor	r4, r0,r1	@r4 = r1 ^ r0 
	
	ldr  r0,=0x12345678
	bic  r1, r0, #0xff
	bic  r2,r0, #0xf0000000
	
	tst  r0, #0x8	@判断某个数的某几位 是否为 0
	@ movne  r11, #1
	moveq  r11, #1   @当上一条判断结果相等时  执行 mov
	movne  r12, #2   @当上一条判断结果不相等时执行mov 
	
	@使能中断和快速中断(设置cpsr的值)
	mrs r0, cpsr  @ r0 = cpsr
	bic r1, r0, #0xc0
	msr 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 =  0
			else 
			a = 100
		
	*/
	/*
	mov r0, #5
	cmp 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, #10
	mov r1, #5
	add r2, r0, r1 	@r2 = r0 + r1 
	 
	ldr  r0, =0xff000000
	ldr  r1, =0xf0000000
	@add  r2, r0, r1    @(不带进位加法)
	
	adds  r2, r0, r1  @r2 = r0 + r1 , 如果有进位 那么会修改cpsr的进位值

	mov r3, #1
	mov r4, #1
	adc r5,r3,r4    	@r5 = r3 + r4 + 进位值

	@64 bit 两个数的加法  r0, r1 表示被加数, r2, r3表示加数 
	@64 bit 两个数的减法 
	ldr r0, =0xffffffff			@低32 bit
	ldr r1, =0x1				@高32bit
	
	ldr  r2,=0x1				@低32bit 
	ldr	 r3,=0x5				@高32bit 
	
	adds  r4, r0, r2
	adc   r5, r1, r3
	
	subs  r6, r2,r0
	sbc   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, #0
	mov r1, #2
	bl func1

main_end:
	b  main_end  	@死循环
	
func1:
	cmp r1, #2
	bleq  func2
	blne  func3
func1_end:

func2:
	add r1, #3
	b func2_end
func2_end:
	mov pc, lr

func3:

@.....字节补充一下
func3_end:

	

.end    @基本格式的尾巴  通常 该行下边 加空行

练习:1加到100

.text   @基本格式的头
	@跳转指令 
	/*
	mov  r0, #1
	mov  r1, #10
	
	b  t			@跳转指令, 跳到 t 后执行 
	add  r2, r0, r1
	
t:	
	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, #100
	bgt	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 s
	ldr r0, = 0x1f1fffff   @具体多少为 1秒 需要计算
loop:
	cmp r0, #0
	beq  loop_end

	sub r0,#1
	b 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 ,其余为0
	
	tst r0, r1				@判断 r0中的J和 T 是否为 0 
	biceq  r0, #0x1f		@把 mode 清0 
	orreq  r0, #0x10		@把mode 变为 user模式: 10000
	msr  cpsr, r0  			@cpsr = r0
	 	
.end    

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

spingboot 集成identityserver4身份验证

一、新建项目&#xff1a;com.saas.swaggerdemo 详情见&#xff1a;spring-boot2.7.8添加swagger-CSDN博客 在之前项目基础上添加如下依赖 <dependency><groupId>com.nimbusds</groupId><artifactId>nimbus-jose-jwt</artifactId><version&…

java版微信小程序商城 免 费 搭 建 java版直播商城平台规划及常见的营销模式有哪些?电商源码/小程序/三级分销

涉及平台 平台管理、商家端&#xff08;PC端、手机端&#xff09;、买家平台&#xff08;H5/公众号、小程序、APP端&#xff08;IOS/Android&#xff09;、微服务平台&#xff08;业务服务&#xff09; 2. 核心架构 Spring Cloud、Spring Boot、Mybatis、Redis …

7.5 MySQL对数据的基本操作(❤❤❤)

7.5 MySQL对数据的基本操作 1. 提要2. 数据添加2.1 insert语法2.2 insert 子查询2.3 ignore关键字 3. 数据修改3.1 update语句3.2 update表连接 4. 数据删除4.1 delete语句4.2 delete表连接4.3 快速删除数据表全部数据 1. 提要 2. 数据添加 2.1 insert语法 2.2 insert 子查询 …

Java实现在线编辑预览office文档

文章目录 1 在线编辑1.1 PageOffice简介1.2 前端项目1.2.1 配置1.2.2 页面部分 1.3 后端项目1.3.1 pom.xml1.3.2 添加配置1.3.3 controller 2 在线预览2.1 引言2.2 市面上现有的文件预览服务2.2.1 微软2.2.2 Google Drive查看器2.2.3 阿里云 IMM2.2.4 XDOC 文档预览2.2.5 Offic…

8个Python必备的PyCharm插件

大家好&#xff0c;在PyCharm中浏览插件列表并尝试很多人推荐的插件后&#xff0c;总结了几个瑰宝插件&#xff0c;它们各自以独特的方式帮助开发者快速、简便、愉悦地开发&#xff0c;接下来将逐个介绍它们。 1. Key Promoter X 【下载链接】&#xff1a;https://plugins.je…

Enzo Life Sciences--DNA损伤酶联免疫检测试剂盒DNA damage ELISA kit

——用于肿瘤、细胞凋亡和氧化应激研究中DNA损伤的快速检测 细胞暴露于氧化和环境应激经常导致基因组DNA的分解或氧化&#xff0c;评价基因组DNA完整性或评估氧化DNA存在的测定法经常用作验证凋亡或DNA损伤开始的手段。8-羟基-2 -脱氧鸟苷(8-OHdG)是一种修饰的核苷碱基&#xf…

vba设置excel单元格背景色

vba设置excel单元格背景色位蓝色 Sheet1.Cells(hang, 2).Interior.Color RGB(0, 0, 255) 参考链接 【VBA】给单元格设置背景色_vba 将一行底色置绿色-CSDN博客https://blog.csdn.net/s_h_m114_2/article/details/105787093 参考2 知乎 VBA--单元格的背景色设置 特此…

potplayer在投屏中的使用

视频播放完成之后自动停止 配置/语言/其他->收尾处理->播放完当前后停止 任务栏控制播放 快捷键 Enter 屏幕->全屏 CtrlEnter 屏幕->全屏(拉伸) CtrlShiftEnter 屏幕->全屏(其他显示器) AltEnter 屏幕->全屏 CtrlAltEnter 屏幕->全屏(保持比例) Space…

flink1.15 维表join guava cache和mysql方面优化

优化前 mysql响应慢,导致算子中数据输出追不上输入,导致显示cpu busy:100% 优化后效果两个图对应两个时刻: - - -- 优化前 select l.id,JSON_EXTRACT(r.msg,$$.key1) as msgv (select id,uid from tb1 l where id?) join (select uid,msg from tb2) r on l.uidr.uid;-- 优化…

STC51+TLC2543+ADXL335+proteus

51单片机解析adxl335振动检测蜂鸣器报警课设 通过按键调整振动检测阈值 传感器介绍 TLC2543&#xff1a;12 位精密模数转换器&#xff0c;原理图与引脚功能描述如下所示&#xff1a; 引脚功能1~9、11、12模拟量输入通道10GND电源地13REF-为负基准电压端14REF为正基准电压端…

腾讯云服务器入门教程——从0到1新手必看

腾讯云服务器入门教程包括云服务器CPU内存带宽配置选择&#xff0c;选择云服务器CVM或轻量应用服务器&#xff0c;云服务器创建后重置密码、远程连接、搭建程序环境、部署Web网站应用等&#xff0c;腾讯云服务器网txyfwq.com分享从0到1腾讯云服务器入门教程&#xff1a; 腾讯云…

记录在PyCharm中编辑配置自己的项目环境或路径

我们在复现或则跑项目时往往会遇到“设置参数” # 设置参数 ap argparse.ArgumentParser() ap.add_argument("-i", "--image", requiredTrue, help"path to input image") ap.add_argument("-t", "--template", requiredT…

【已解决】c语言const/指针学习笔记

本博文源于笔者正在复习const在左与在右&#xff0c;指针优先级、a,&a,*a的区别。 1、const在左与在右 int const *p const int *p int * const p int const * const p const int * const p* 在const右边&#xff0c;指向的数据不可以改变&#xff0c;可以改变地址 * 在c…

史上最全的数据科学与艺术

1.背景介绍 数据分析是一种将数据转化为价值的艺术和科学。它涉及到大量的数学、统计、编程、数据库、机器学习等多个领域的知识。数据分析的目的是从数据中提取有用的信息&#xff0c;以便做出明智的决策。 数据分析的艺术体现在数据分析师需要具备丰富的经验和洞察力&#…

SAP 客制化增强查找

相信各位在做日常的实施和运维中&#xff0c;经常会遇到这样一种情况&#xff0c;系统出现了非常规问题&#xff0c; 每次哼哧哼哧看半天源码&#xff0c;各种打watch point, 最后发现是以前别人写的增强导致的&#xff0c; 真的非常浪费时间。 那么我就想&#xff0c;有没有…

苹果手机自动重启是什么原因?本文帮你解决问题!

苹果手机是许多用户信赖和喜爱的手机品牌之一&#xff0c;但有时候它可能也会出现一些问题&#xff0c;其中比较常见的就是手机自动重启。那么&#xff0c;苹果手机自动重启是什么原因呢&#xff1f;今天&#xff0c;小编将在本文为您分析可能的原因&#xff0c;并提供相对应的…

什么情况下物理服务器会运行出错?

​  物理服务器&#xff0c;也称为裸机服务器&#xff0c;一般可以提供高性能计算水平和巨大的存储容量。然而&#xff0c;它们也难免会遇到一些问题。运行出错时&#xff0c;可能会导致停机和数据丢失。在这篇文章中&#xff0c;介绍了常见的物理服务器在一些情况下显示出错…

【蓝桥杯日记】第一篇——如何搭建系统环境

目录 前言 环境相关文件 学生机环境-Web应用开发环境&#xff08;第十五届大赛&#xff09; 学生机环境-Java编程环境&#xff08;第十五届大赛&#xff09; 学生机环境-C/C编程环境&#xff08;第十五届大赛&#xff09; 学生机环境-Python编程环境 &#xff08;第十五届…

【AD-3D预览-颜色更换和模型操作】AD打开3D预览模式,PCB板子显示蓝色,如何更改为绿色

问题&#xff1a;AD软件的3D预览模式中&#xff0c;PCB的颜色和其他不一样&#xff0c;显示的是蓝色&#xff0c;而且正面可以看到走线&#xff0c;背面看不到 原因&#xff1a; 这是因为选择的查看模式不一样所导致的。 备注&#xff1a;此处的菜单工具栏&#xff0c;可以在…

企业为什么要选择软件定制开发?

引言&#xff1a;定制开发的兴起 在商业竞争日益激烈的今天&#xff0c;企业领导者们面临着一个重要的抉择&#xff1a;是选择通用软件解决方案&#xff0c;还是探寻更贴合企业需求的定制开发路径&#xff1f; 在企业决策软件解决方案时&#xff0c;通用软件和软件定制开发各…