首页 > 编程语言 >汇编学习笔记

汇编学习笔记

时间:2024-10-09 19:54:14浏览次数:8  
标签:__ 汇编 R1 R3 笔记 学习 LDR 地址 main

在学习STM32前,需要了解的汇编思想

初始化

                AREA    STACK, NOINIT, READWRITE
__initial_sp
                AREA    RESET, DATA, READONLY
__Vectors       DCD     __initial_sp 
                DCD     main              
                AREA    |.text|, CODE, READONLY
                ENTRY						
main			
				
				
loop
                B loop                  
                END

解释:

1. AREA STACK, NOINIT,READWRITE: 这一行指定了一个名为STACK的内存区域,它用于存储堆栈。NOINIT表示这个内存区域在程序启动时不需要初始化,READWRITE表示这个内存区域可以被读取和写入。

2. __initial_sp: 这一行定义了一个名为__initial_sp的符号,它表示堆栈指针的初始值。在这里,它被定义为堆栈的起始地址。通常,这个符号会在链接脚本中进一步定义为实际的堆栈内存区域的起始地址。

3. AREA RESET, DATA,READONLY: 这一行指定了一个名为RESET的内存区域,用于存储重置向量表。DATA表示这个区域包含数据,READONLY表示这个区域只能被读取。

4. __Vectors DCD __initial_sp: 这一行定义了一个重置向量表,用于指示程序启动时应该执行的操作。DCD表示存储一个双字(32位)的数据。在这里,第一个双字存储的是堆栈指针的初始值,即__initial_sp。

5. DCD main: 这一行将程序的入口地址(main函数)添加到重置向量表中。这意味着程序在启动时将跳转到main函数开始执行。

6. AREA |.text|, CODE,READONLY: 这一行指定了一个名为.text的内存区域,用于存储代码。CODE表示这个区域包含代码,READONLY表示这个区域只能被读取。

7. ENTRY main: 这一行指定了程序的入口点为main函数。这意味着程序将从main函数开始执行。

8. loop B loop: 这一行是一个无限循环,它会不断地跳转到loop标签所在的位置,导致程序永远循环执行这条指令。

9. END: 这一行表示程序的结束。

数据搬运指令MOVS

<font style="color:rgb(44, 44, 54);">MOVS</font> 指令用于在寄存器之间移动数据或从立即数(一个常数值)到寄存器。它的基本格式如下:

<font style="color:#ee9900;">MOVS R0</font><font style="color:#999999;">,</font><font style="color:#000000;">#</font><font style="color:#990055;">2</font>

<font style="color:#ee9900;">MOVS R1</font><font style="color:#999999;">,</font><font style="color:#ee9900;">R0</font>

内存操作

读写

LDR:指令主要用于从内存中加载数据到寄存器,或者可以用来处理地址。

LDR R2,=0X12345678 将数据写入寄存器

LDR R2,[R1] 将R2地址中的内容放入R1,相当于读

MOVS与LDR关键区别

  • 用途<font style="color:rgb(44, 44, 54);">MOV</font> 主要用于寄存器之间的数据移动或加载立即数,而 <font style="color:rgb(44, 44, 54);">LDR</font> 用于从内存中加载数据或处理地址。
  • 操作数<font style="color:rgb(44, 44, 54);">MOV</font> 可以使用寄存器或立即数作为源操作数,而 <font style="color:rgb(44, 44, 54);">LDR</font> 需要一个内存地址或地址表达式作为源。
  • 性能影响:由于 <font style="color:rgb(44, 44, 54);">LDR</font> 涉及到内存访问,它通常比 <font style="color:rgb(44, 44, 54);">MOV</font> 更慢,因为后者只涉及CPU内部的寄存器操作。

STR R0,[R1] 将R0的值写入到R1指向的地址

CPU栈机制

概念

栈是一种具有特殊的访问方式的存储空间,他的特殊性就在于最后一个进入这个空间的数据,是最先出去的

分类

  1. 空栈:指向的地址为空,可以直接存储,存储完成之后需要将栈指针再次指向空的位置。
  2. 满栈: 栈指针指向的地址有数据,在栈中存储数据时,需要先将栈指针,指向一个空的位置,然后在存储数据。
  3. 增栈:栈针向高地址移动
  4. 减栈:栈针向高地址移动

ARM默认采用的是满减栈

栈的基本操作

栈有两种基本的操作:入栈和出栈

  1. 入栈:将一个新的元素放到栈顶
  2. 出栈:从栈顶取出一个元素
  3. 先进后出,后进先出

PUSH和POP

汇编中的两个指令

PUSH:入栈(压栈)

<font style="color:#000000;">PUSH {R0-R3,LR}</font>

POP:出栈(弹栈)

<font style="color:#000000;">POP{R0-R4,PC}</font>

例子

  1. 主程序给R1,R2,R3分别写入数据

然后跳入函数JUMP

2.函数JUMP,函数内修改R1 R3的数值

3.修改结束后返回主函数

4.主函数再使R1和R3原来的数据相加后存入R1

  1. 跳出主程序进入死循环
    AREA    STACK, NOINIT, READWRITE 
__initial_sp                 
    AREA                 RESET, DATA, READONLY 
__Vectors       DCD     __initial_sp                  
    DCD     main                               
    AREA    |.text|, CODE, READONLY                 
    ENTRY 

main
  ADD SP,SP,#0X100;向上移动栈针,因为是满减栈
  LDR R1,=0X12345678
	LDR R2,=0X22222222
	LDR R3,=0X33333333;赋值
  BL JUMP;跳转到JUMP函数并且保存返回地址
  ADD R1,R1,R3
  B loop ;跳转到loop函数
  
JUMP
  PUSH {{R0-R3,LR};保护现场,将原来的数据压栈,并在最后保存了函数的返回地址
  ;进行操作
  LDR R1,=0X00000001;
	LDR R3,=0X10000000;	
  POP{R0-R3,PC}	;恢复现场,将数据出栈,恢复了R0~R3的值,并将保存的地址赋给PC指针,程序将跳转值函数调用位置运行


loop                 
    B loop    

END

标签:__,汇编,R1,R3,笔记,学习,LDR,地址,main
From: https://blog.csdn.net/2301_81618172/article/details/142795044

相关文章

  • docker 靶场 笔记
    docker靶场笔记搜索镜像容器sudodockersearchdvwa查看所有镜像容器dockerps-a下载指定的镜像并在后台启动dockerrun-itd-p虚拟机的端口:容器端口--name=自定义镜像名镜像名dockerrun-itd-p8081:80--name=dvwacitizenstig/dvwa关闭镜像......
  • C#联合Visionpro编程学习记录(判断相机硬件是否掉线的方法)
    1,在实际使用过程中,Visionpro没有提供用于直接判断相机硬件是否依然在线的方法,有一个方法可以使用:1///<summary>2///使用获取相机时间戳计时器频率的方式来判断相机是否仍然在线,3///如果相机掉线获取相机TimeStampFrequency属性将报错,以此判断相机......
  • 【笔记篇】一篇文章搞定Spring Boot框架
    文章目录概述一、概述接口协议:RESTFUL二维码直接输出定时任务基本用法Cron表达式拦截器缓存技术模板引擎基本使用自定义标签异常处理常用异常捕获多环境配置公共的配置可放在主配置文件中,其它依赖特殊环境的配置放在对应环境的文件中即可。工程打成jar包后,可以在运行的......
  • Termux 使用笔记
    第一次安装完成后发现这里面啥都没有所以更新源aptupdate也做不到这是因为源是国外由于有墙所以连接不上下面这个命令可以切换更新源termux-change-repo切换源之后安装ssh服务然后修改密码并启动ssh服务就可以使用其他设备链接手机了pkginstallopens......
  • C#联合Visionpro编程学习记录(将指定颜色的十字线图形添加到CogRecordDisplay上)
    1///<summary>2///将指定颜色的十字线图形添加到CogRecordDisplay上3///</summary>4///<paramname="icogimage"></param>5///<returns></returns>6publicstaticstringAddCrossCurveRecord2CogRecordDisplay(I......
  • 【Redis】Redis学习笔记
    概况redis==remoteDictionaryServer(远程字典服务)基于内存的KV键值对内存数据库作用:分布式缓存,与MySQL共同配合Redis--内存MySQL--磁盘Redis--NoSQLMySQL--SQL内存存储和持久化(RDB+AOF)Redis支持一部将内存中的数据写入硬盘宕机--可......
  • AI 学习方法与算法现状
    在人工智能(AI)的漫长历史中,我们见证了从早期的规则驱动系统到现代的机器学习模型的转变。AI的学习方法是其进步的核心,而算法现状则反映了当前技术的高度和未来的发展方向。Ⅰ.AI学习方法AI的工作原理基于深度神经网络,这是一种模仿人脑处理信息方式的计算模型。在设计AI系统时......
  • Treap学习笔记
    Treap(树堆)学习笔记(此处为带旋Treap)Treap简介Treap是一种二叉搜索树,其中,权值val满足二叉搜索树的性质,节点优先级priority满足堆的性质(作用后面会讲到)Treap适用情况因为属于二叉搜索树,所以可以维护二叉搜索树的信息,带旋Treap可以更好地控制树的深度,使得每次操作不至于被......
  • 自由学习记录(3)
    可以自己去看ugui的实现代码,如果以后有需要 CanvasGroup这个东西有点吊给Canvas里的各个面板的分组,不是多个canvas的意思添加之后,该对象的及子对象全部都会放到一个CanvasGroup,可以整体控制显隐整体控制是否可交互(所有按钮失活,这个也可以设置成等级限制的功能使用,66)......
  • DeepLearning.ai专项课程总结:深度学习入门指南
    DeepLearning.ai-SummaryDeepLearning.ai专项课程:深度学习的最佳入门之选DeepLearning.ai是由斯坦福大学教授AndrewNg在Coursera平台上推出的一个深度学习专项课程。作为人工智能和机器学习领域的顶级专家,AndrewNg精心设计了这一系列课程,旨在帮助学习者系统地掌握深度学习......