
汇编
文章平均质量分 95
lanhuazui10
这个作者很懒,什么都没留下…
展开
-
寄存器r0-r15含义
当中断发生时,硬件自动存储R0-R3,R12,LR,PC,XPSR这8个寄存器,中断返回时自动恢复这8个寄存器。可以理解为M3内核机制进行了一个二级跳,先将8个寄存器数值压入栈中,再将代表中断返回所使用的工作模式以及栈寄存器的EXC_RETURN值存入LR中,中断退出时跳转到EXC_RETURN值,并从栈中取出8个寄存器值,这样就不仅找到了返回地址,又可以找到中断前的工作状态和栈指针。SP是栈寄存器,用来指示当前栈的位置。被压入低地址内存中,也就是说如果向下增长,高地址寄存器先压,向上增长测试低地址先压。转载 2025-01-14 23:08:39 · 190 阅读 · 0 评论 -
位置无关码PIC详解:原理、动态链接库、代码重定位
本文解释了什么是位置无关代码,以及它如何帮助创建具有可共享只读文本段的共享库。位置无关代码(PIC)通过引入全局偏移表(GOT)和过程链接表(PLT)实现,解决了共享库加载时的重定位问题。GOT提供了数据和函数的间接引用,PLT实现了懒绑定,推迟函数地址的解析。当然这也伴随额外的内存加载和寄存器使用成本,但在权衡之下,现代的编译器都更倾向于使用PIC。原文链接:https://blog.youkuaiyun.com/tilblackout/article/details/135585340。转载 2024-11-24 20:15:33 · 398 阅读 · 0 评论 -
ARM学习:协处理器CP15详解
系统控制协处理器CP15的作用是提供对内核部分功能的控制。MMU。转载 2024-11-24 19:24:08 · 611 阅读 · 0 评论 -
从0学ARM-什么是位置无关码
编译地址:」32位的处理器,它的每一条指令是4个字节,以4个字节存储顺序,进行顺序执行,CPU是顺序执行的,只要没发生什么跳转,它会顺序进行执行, 编译器会对每一条指令分配一个编译地址,这是编译器分配的,在编译过程中分配的地址,我们称之为编译地址。「运行地址:」是指程序指令真正运行的地址,是由用户指定的,用户将运行地址烧录到哪里,哪里就是运行的地址。转载 2024-11-04 00:34:57 · 111 阅读 · 0 评论 -
从0开始学ARM-异常及中断处理、异常向量表、swi
文章来自一口linux博客,这里主要拿来做笔记使用,记录自己的学习心得(ps:流程异常复杂,三遍五遍肯定看不懂的。转载 2024-11-04 00:24:37 · 406 阅读 · 0 评论 -
从0学ARM-内联汇编、混合汇编、ATPCS规则
答:因为参数超过4个就需要压栈退栈,而压栈退栈需要增加很多指令周期。对于参数比较多的情况,我们可以把数据封装到结构体中,然后传递结构体变量的地址。转载 2024-11-04 00:12:08 · 106 阅读 · 0 评论 -
从0学ARM-汇编伪指令、lds详解
标号含义.global使得符号对连接器可见,变为对整个工程可用的全局变量_start汇编程序的缺省入口是_ start标号用户也可以在连接脚本文件中用ENTRY标志指明其它入口点..local表示符号对外部不可见,只对本文件可见数据定义伪操作一般用于为特定的数据分配存储单元,同时可完成已分配存储单元的初始化。标号含义.byte单字节定义 0x12,‘a’,23 【必须偶数个】.short定义2字节数据 0x1234,65535。转载 2024-11-03 23:46:01 · 183 阅读 · 0 评论 -
从0开始学ARM-MRS、MSR、寻址操作、原子操作原理
ARM微处理器支持程序状态寄存器访问指令,用于在程序状态寄存器和通用寄存器之间传送数据。转载 2024-11-03 23:08:20 · 290 阅读 · 0 评论 -
从0开始学ARM-ARM指令,移位、数据处理、BL、机器码
立即数是由 0-255之间的数据循环右移偶数位生成。判断规则如下:把数据转换成二进制形式,从低位到高位写成4位1组的形式,最高位一组不够4位的,在最高位前面补0。数1的个数,如果大于8个肯定不是立即数,如果小于等于8进行下面步骤。如果数据中间有连续的大于等于24个0,循环左移2的倍数,使高位全为0。找到最高位的1,去掉前面最大偶数个0。找到最低位的1,去掉后面最大偶数个0。数剩下的位数,如果小于等于8位,那么这个数就是立即数,反之就不是立即数。可以看到剩余的位数大于8个,所以该数不是立即数。转载 2024-11-03 21:17:28 · 232 阅读 · 0 评论 -
STM32启动文件分析
在复位后,该寄存器的值为 0。如果编写的程序比较大, 定义的局部变量很多,那么就需要修改栈的大小。如果我们在使用某个外设的时候,开启了某个中断,但是又忘记编写配套的中断服务程序或者函数名写错,那当中断来临的时, 程序就会跳转到启动文件预先写好的空的中断服务程序中,并且在这个空函数中无线循环,即程序就死在这里。在启动文件里面已经帮我们写好所有中断的中断服务函数,跟我们平时写的中断服务函数不一样的就是这些函数都是空的, 真正的中断复服务程序需要我们在外部的C文件里面重新实现,这里只是提前占了一个位置而已。原创 2024-11-03 20:26:42 · 999 阅读 · 0 评论 -
arm中SP,LR,PC寄存器及处理器运行模式
当程序执行完毕时,PC寄存器的值会指向程序的结束地址。用户模式(User),快速中断模式(FIQ),普通外部中断模式(IRQ),超级管理模式(Svc,裸机就是跑的这个模式,cpu复位也是这个模式),数据访问中止模式(Abort),未定义指令中止模式(Und),系统模式(Sys),监视模式(Mon),超级监视模式(Hyp)除了上述每种模式所需寄存器外,还有6状态寄存器,最主要的就是两个CPSR和SPSR,arm进入异常模式后,SPSR自动保存进入异常前的CPSR的值,以便异常返回后恢复异常发生时的工作状态。转载 2023-10-02 21:48:13 · 3139 阅读 · 1 评论 -
循环方法初始化2440内存
采用循环方法内存初始化中memsetup: @ 设置存储控制器以便使用SDRAM等外设 mov r1, #MEM_CTL_BASE @ 存储控制器的13个寄存器的开始地址 adrl r2, mem_cfg_val @ 这13个值的起始存储地址 add r3, r1, #52转载 2016-03-15 22:27:17 · 251 阅读 · 0 评论 -
ADR/ADRL/LDR取地址区别
文章转自网络文章:1、ADR伪指令--- 小范围的地址读取 ADR伪指令将基于PC相对偏移的地址值或基于寄存器相对偏移的地址值读取到寄存器中。在汇编编译器编译源程序时,ADR伪指令被编译器替换成一条合适的指令。通常,编译器用一条ADD指令或SUB指令来实现该ADR伪指令的功能,若不能用一条指令实现,则产生错误,编译失败。 ADR伪指令转载 2016-03-15 22:25:27 · 1459 阅读 · 0 评论