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

arm 汇编积累

C语言函数与汇编对应关系

一、MOV 系列指令

1、指令格式

MOV{条件}{S}  目的寄存器,源操作数

2、含义解析:

(1):mov  指令传送数据

案例:

MOV   R0,R1 ; R0 = R1;

MOV  PC,R14 ;PC = R14;

MOV   R0,R1,LSL#3 ;R0=R1<<3;

(2):movs
s(s标志)功能不变,影响CPSR标志位
movs r0, #0 默认结果为零但不影响CPSR的Z位,加上s以后会影响CPSR标志位

N[31]:负的条件标记                    T[5]:决定的是用的是ARM指令集还是Thumb指令集 
Z[30]:零的条件标记                    A[6]:异常终止的频闭位
C[29]:操作进位                           I [7]:中断的频闭位
V[28]:操作溢出                           F[8]:快速中断的频闭位

                                                   E[9]: 大小端序的设置

二、LDR 与  STR  系列命令

1、LDR 命令

// 格式:LDR{条件} 目的寄存器,<存储器地址>
LDR  R0,[R1]           // 将存储器地址为R1的字数据读入寄存器R0
LDR  R0,[R1,R2]        // 将存储器地址为R1+R2的字数据读入寄存器R0
LDR  R0,[R1,#8]        // 将存储器地址为R1+8的字数据读入寄存器R0
LDR  R0,[R1,R2]!       // 将存储器地址为R1+R2的字数据读入寄存器R0,并将新地址R1+R2写入R1
LDR  R0,[R1,#8]!       // 将存储器地址为R1+8的字数据读入寄存器R0,并将新地址R1+8写入R1
LDR  R0,[R1],R2        // 将存储器地址为R1的字数据读入寄存器R0,并将新地址R1+R2写入R1
LDR  R0,[R1,R2,LSL#2]! // 将存储器地址为R1+R2×4的字数据读入寄存器R0,并将新地址R1+R2×4写入R1
LDR  R0,[R1],R2,LSL#2  // 将存储器地址为R1的字数据读入寄存器R0,并将新地址R1+R2×4写入R1
 

LDR  R1, =0x00000001 ; 把内容 0x00000001 写入 R1 寄存器。

LDR  R1,0x00000002  ;  把内存地址 0x00000002 里的内容转到  R1  中。

MOV 与 LDR 的区别:

mov

1.用于寄存器和寄存器之间传递数据

2.把立即数(立即数表示数值的数字,前面加#)传递给寄存器


str/ldr

可以用于寄存器与内存之间的数据交换,STR是将寄存器中的数载入内存,LDR是将内存中的数载入到寄存器,LDR可以载入立即数。
 

2、STR 命令


// 格式:STR{条件} 源寄存器,<存储器地址>
STR R0,[R1],#8  // 将R0中的字数据写入以R1为地址的存储器中,并将新地址R1+8写入R1
STR R0,[R1,#8]  // 将R0中的字数据写入以R1+8为地址的存储器中
 

三、多内存操作指令(此部分为借鉴,多谢博主)
 

指令格式 : <opcode><cond> Rn{!} {register_list}

  Rn 中保存一个 内存地址值

  {!} 表示是否更新 Rn 中的地址值

  {register_list} 寄存器列表

1. 【 stm 】 多个寄存器中的值写入内存中

mov r0, #0x40000000
ldr r1, =0x11111111
ldr r2, =0x22222222
ldr r3, =0x33333333
ldr r4, =0x44444444
stm r0!, {r1,r2,r3,r4}   @ 把 此条指令改为 stm r0,{r1,r2,r3,r4} 不会更新r0中的地址值

 对于多个寄存器的操作指令【stm】说明:

(1)加 ! 表示更新 r0 中的地址值

(2)寄存器列表中是连续的寄存器可以用 - 连接 如 {r1,  r2,  r3,  r4,  r6} 可以表示为 {r1-r4, r6}

(3)编号晓得寄存器数据,保存到低地址中

(4)编号大的寄存器数据,保存到高地址中

 2. 操作多个寄存器 读内存数据

mov r0, #0x40000000
ldr r1, =0x11111111
ldr r2, =0x22222222
ldr r3, =0x33333333
stm r0, {r1-r3}  @把寄存器 r1-r3 中的值写入 r0 指向的内存地址中ldm r0!, {r5-r7} @读出r0指向的内存地址中的放在寄存器 r5-r7 中

四、栈操作指令 【入栈: stmfd,出栈:ldmfd 】

栈的 4 种特性 Full满栈     Empty空栈      Ascend增栈     Descend降栈

组合 4 种栈:

      stmfa   fa   满   增

   stmfd   fd    满   降   ARM 汇编默认使用

   stmea  ea   空   增

   stmed  ed    空   减

  指令格式:<opcode><cond> sp!  {register_list}     : sp 堆栈指针 r14

ldr sp, =0x40000100   @初始化栈指针
ldr r1, =0x11111111
ldr r2, =0x22222222
ldr r3, =0x33333333stmfd sp!, {r1-r3}    @把数据 入栈 到sp指向的地址, 增满栈类型, sp指针跟着更新
ldmfd sp!, {r4-r6}   @出栈, 把栈内数据弹出到 r4-r6寄存器中

案例:

ldr sp, =0x40000100  @初始化栈指针mov r0, #0x12mov r1, #0x11bl add_funmov r2, #0x22mov r3, #0x33b loopadd_fun:stmfd sp!, {r0-r3, lr} @ 入栈 r0-r3 ,lr指向跳转此处的吓一跳指令,也就是跳转到 , 第5行mov r0, #0x1mov r1, #0x2add r4, r0, r1ldm sp!, {r0-r3, pc} @ 出栈,把 lr 的地址弹到 pc指针中执行loop:b loop

相关文章:

  • Java实现教学资源共享平台 JAVA+Vue+SpringBoot+MySQL
  • C语言第二十三弹---指针(七)
  • Android---PermissionX实现动态权限申请
  • vscode开发FPGA(0)--windows平台搭建
  • JS逆向进阶篇【去哪儿旅行登录】【上篇】
  • 意外删除照片数据?恢复照片数据的 10 大照片恢复工具方法
  • 2024/2/12 图的基础知识 2
  • 无人机飞行原理,多旋翼无人机飞行原理详解
  • 【国产MCU】-CH32V307-基本定时器(BCTM)
  • kali系统概述、nmap扫描应用、john破解密码、抓包概述、以太网帧结构、抓包应用、wireshark应用、nginx安全加固、Linux系统加固
  • 【c语言】字符串常见函数 上
  • 【QT+QGIS跨平台编译】之三十:【NetCDF+Qt跨平台编译】(一套代码、一套框架,跨平台编译)
  • linux系统zabbix监控服务端部署
  • 电路设计(16)——纪念馆游客进出自动计数显示器proteus仿真
  • C++ Qt框架开发 | 基于Qt框架开发实时成绩显示排序系统(2)折线图显示
  • [case10]使用RSQL实现端到端的动态查询
  • 《网管员必读——网络组建》(第2版)电子课件下载
  • 【108天】Java——《Head First Java》笔记(第1-4章)
  • 【个人向】《HTTP图解》阅后小结
  • 【面试系列】之二:关于js原型
  • 【跃迁之路】【641天】程序员高效学习方法论探索系列(实验阶段398-2018.11.14)...
  • crontab执行失败的多种原因
  • extract-text-webpack-plugin用法
  • iOS编译提示和导航提示
  • JAVA 学习IO流
  • Javascripit类型转换比较那点事儿,双等号(==)
  • laravel with 查询列表限制条数
  • LeetCode刷题——29. Divide Two Integers(Part 1靠自己)
  • mac修复ab及siege安装
  • Python_OOP
  • session共享问题解决方案
  • Spring Cloud Feign的两种使用姿势
  • 大整数乘法-表格法
  • 对象管理器(defineProperty)学习笔记
  • 飞驰在Mesos的涡轮引擎上
  • 前端每日实战:70# 视频演示如何用纯 CSS 创作一只徘徊的果冻怪兽
  • 问题之ssh中Host key verification failed的解决
  • 系统认识JavaScript正则表达式
  • 自制字幕遮挡器
  • 从如何停掉 Promise 链说起
  • ​虚拟化系列介绍(十)
  • #Linux(权限管理)
  • #微信小程序(布局、渲染层基础知识)
  • (C语言)逆序输出字符串
  • (Matlab)基于蝙蝠算法实现电力系统经济调度
  • (八)五种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (附源码)spring boot北京冬奥会志愿者报名系统 毕业设计 150947
  • (附源码)ssm教材管理系统 毕业设计 011229
  • (三分钟了解debug)SLAM研究方向-Debug总结
  • (转)Android中使用ormlite实现持久化(一)--HelloOrmLite
  • .mkp勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .NET Core 项目指定SDK版本
  • .Net 访问电子邮箱-LumiSoft.Net,好用
  • .NET 中各种混淆(Obfuscation)的含义、原理、实际效果和不同级别的差异(使用 SmartAssembly)
  • ::前边啥也没有