当前位置: 首页 > news >正文

ARM-汇编指令

一,map.lds文件

链接脚本文件

作用:给编译器进行使用,告诉编译器各个段,如何进行分布

/*输出格式:32位可执行程序,小端对齐*/
OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm")
/*OUTPUT_FORMAT("elf32-arm", "elf32-arm", "elf32-arm")*/
/*输出架构:arm架构*/
OUTPUT_ARCH(arm)
/*入口:_start*/
ENTRY(_start)
/*段*/
SECTIONS
{. = 0x00000000;/*入口地址*/. = ALIGN(4);/*4字节对齐*/.text      :{./Objects/start.o(.text) /*第一个文件存放start.o文件,指定start.o位置*/*(.text) /*其余文件没有要求,编译器随便放*/}. = ALIGN(4);.rodata : /*只读数据段*/{ *(.rodata) }. = ALIGN(4);.data :  /*数据段*/{ *(.data) }. = ALIGN(4);__bss_start = .; .bss : /*.bss段*/{ *(.bss) }__bss_end__ = .;
}

二,汇编

1.汇编指令:编译器将一条编译指令编译生成机器码,占用代码段空间

2.伪指令:伪指令本身不是一条指令,编译器可以将器编译生成多条指令,共同完成一条指令功能

3.伪操作:指导编译器对代码如何进行编译,所有以 . 开头的伪操作,伪操作不占用代码段空间

基本格式:

<opcede>{cond}{s}Rd,Rn,#oprand2

<opcede>指令码

{cond}条件码:1)加条件码:指令有条件执行,2)不加条件码:指令默认无条件执行

{s}:加s,影响CPSR寄存器,不加s,不影响CPSR寄存器

Rd:目标寄存器

Rn:第一操作寄存器

#oprand2:第二操作数

        1)立即数:从判断的数中,找到0~0xff之间的数 ===> 判断的这个数所有1包含,将找到的0~0xff之间的数,循环右移偶数位 ===> 低位移出,补到高位,如果能够得到你要判断的那个数,说明这个数就是立即数

        2)寄存器

        3)有效数:将一个数按位取反之后,如果这个数为立即数,说明这个数为有效数

注意事项:

1.{cond}{s}需要连在一起编写

2.Rd,Rn,#oprand2需要用逗号分隔开

3.{cond}{s}和Rd,Rn,#oprand2需要用空格隔开

4.一条汇编指令占用一行,并且没有分号,不区分大小写

三,指令

1.数据操作指令

1.1数据搬移指令 MOV MVN 

相当于赋值

指令格式:{cond}{s} Rd,#oprand2

mov ====> 将第二操作数进行赋值

mvn ====> 将第二操作数,按位进行取反之后,进行赋值

1.2伪指令 LDR

可用于所有数的赋值

格式:ldr 寄存器,=值 

1.3移位操作指令 LSR LSR ROR ASR

指令格式:{cond}{s} Rd,Rn,#oprand2

lsl:逻辑左移 =====> 特点:无符号数左移,高位移出,低位补0

lsr:逻辑右移 =====> 特点:无符号数右移,低位移出,高位补0

ror:循环右移 =====> 特点:低位移出,补到高位

asr:算数右移 =====> 特点:低位移出,高位补符号位

1.4位运算操作指令 AND ORR EOR BIC

格式:{cond}{s} Rd,Rn,#oprand2

and:按位与 =====> 与0清0,与1不变

orr:按位或 =====> 或0不变,或1置1

eor:按位异或 =====> 异或0不变,异或1取反(相同为0,相异为1)

bic:按位清零 =====> 第二操作哪一位写1,对应位进行清0

1.5算术运算指令 ADD ADC SUB SBC MUL

指令格式:{cond}{s} Rd,Rn,#oprand2

add:普通加法指令

adc:带进位加法指令 ====> CPSR寄存器中C位标志位

sub:普通减法指令

sbc:带借位减法指令

mul:乘法指令 ====> 没有第二操作数,{cond}{s} Rd,Rn

1.6比较指令 CMP

指令格式:{cond} Rn,#oprand2

注意点:

1)比较指令没有目标寄存器

2)比较指令本质做减法运算

3)比较指令的执行结果,会影响CPSR寄存器的NZCV位,并且不需要加s

4)比较指令和条件码搭配使用

5)前面我们所有学习的指令,都是默认无条件执行,比较指令有条件指令

图片已经损坏 :<图片已经损坏 :<

 2.跳转指令 B BL

指令格式:b / bl{cond} 标签 ====> 跳转到标签下,第一条指令执行

b:有去无回,不会保存函数返回地址到LR寄存器中

bl:有去有回,会保存函数返回地址到LR寄存器中

3.特殊功能寄存器指令 MRS MSR

指令格式:

mrs{cond} Rn,cpsr ====> 将CPSR寄存器中的值,读到Rn目标寄存器中

msr{cond} cpsr,Rn ====> 将Rn寄存器中的值,写到CPSR寄存器中

4.内存操作指令

1.单寄存器操作指令 LDR STR

指令格式:

ldr/ldrb/ldrh Rn,[Rm] ===> 将Rm指向内存空间中的数据,读到Rn目标寄存器中

str/strb/strh Rn,[Rm] ===> 将Rn寄存器中的值,写到Rm指向地址空间中

ldr ===> looad 加载 ===> 将内存中值,读到寄存器中

str ===> store 写入 ===> 将寄存器中的值,写到某一块内存空间

r ===> register ===> 4字节

b ===> byte ===> 1字节

h ===> half word ===> 2字节

2.多寄存器操作指令 LDM STM

指令码:ldm stm

指令格式:

stm{cond} Rm,{寄存器列表} ===> 将寄存器列表中数据,写到Rm指向的连续地址空间中

ldm{cond} Rm,{目标寄存器列表} ===> 将Rm指向连续地址空间中内容,读到目标寄存器列表中

备注:1)寄存器列表连续用'-'分隔开 r1-r5

2)寄存器列表不连续用','分隔开 r1,r2,r3,r5

5.栈指针操作指令 SP

栈指针寄存器====> sp

满栈:栈指针指向这块空间有有效数据

空栈:栈指针指向这块空间没有有效数据

增栈:栈指针向高地址方向移动

减栈:栈指针向低地址方向移动

栈种类

满增栈 满减栈 空增栈 空减栈

满增栈:stmfa/ldmfa Full Accending

满减栈:stmfd/ldmfd Full Desascending =====> ARM默认采用满减栈

空增栈:stmea/ldmea Empty Accending

空减栈:stmed/ldmed Empty Desascending

常用满减栈

指令格式(例):

stmfd sp!,{寄存器列表} ===> 将寄存器列表中数据,写入到栈指针指向连续地址空间中

ldmfd sp!,{目标寄存器列表} ===> 将栈指针指向连续地址空间中内容,读到目标寄存器列表中

http://www.lryc.cn/news/138820.html

相关文章:

  • Java相关知识对应leetcode
  • js中?.、??、??=的用法及使用场景
  • 每日一题:leetcode 1109 航班预订统计
  • C#__自定义类传输数据和前台线程和后台线程
  • 司徒理财:8.21黄金空头呈阶梯下移!今日操作策略
  • Java8 实现批量插入和更新,SpringBoot实现批量插入和更新,Mybatis实现批量插入和更新
  • vue登录验证码组件,前端验证
  • SLS日志解析配置
  • CRM系统有哪些功能可以管理客户?
  • 15.树与二叉树基础
  • neo4j 图数据库 springboot
  • Linux下的系统编程——makefile入门(四)
  • Mybatis的综合案例-学生信息查询系统 用于校验是否真正学习掌握了动态SQL
  • 力扣:70. 爬楼梯(Python3)
  • 陕西广电 HG6341C FiberHome烽火 光猫获取超级密码 改桥接模式 提升网速
  • 无涯教程-PHP - 移除的扩展
  • 笔记:transformer系列
  • Mysql socket连接测试
  • 探究分布式操作系统的本质
  • opencv-dnn
  • 如何选择合适的开源许可证?
  • 【前端】深入解析CSS:选择器、显示模式、背景属性和特征剖析
  • 算法训练营第三十四天(8.23)| 动态规划Part04:01背包
  • 【python】tkinter使用多进程打包成exe后multiprocessing无法关闭对应进程
  • Redis工具类(缓存操作,Object转换成JSON数据)
  • Linux 下 Java Socket 编程报 java.net.Exception:Permission denied (权限不足)
  • IDEA项目实践——VUE介绍与案例分析
  • vue-canvas基本使用和注意事项-动画闪烁效果-自适应适配不同分辨率问题
  • Jmeter 如何才能做好接口测试?
  • 电商平台京东平台获得京东商品描述API接口演示案例