2025年ldr str指令(ldrsw指令)

ldr str指令(ldrsw指令)svg xmlns http www w3 org 2000 svg style display none svg

大家好,我是讯享网,很高兴认识大家。



 <svg xmlns="http://www.w3.org/2000/svg" style="display: none;"> <path stroke-linecap="round" d="M5,0 0,2.5 5,5z" id="raphael-marker-block" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></path> </svg> <p></p> 

讯享网

在这里插入图片描述
讯享网

在Cortex-A 的架构中一共有9种处理模式,如下表所示:

模式 描述 USR (User Mode) 用户模式,非特权模式,大部分程序运行的时候就处于此模式。 FIQ (Fast Interrupt Request Mode) 快速中断模式,进入 FIQ 中断异常。 IRQ (Interrupt Request Mode) 一般中断模式。 SVC (Supervisor Mode) 超级管理员模式,特权模式,供操作系统使用。 MON (Monitor Mode) 监视模式,用于安全扩展模式。 ABT (Abort Mode) 数据访问终止模式,用于虚拟存储以及存储保护。 HYP (Hypervisor Mode) 超级监视模式,用于虚拟化扩展。 UND (Undefined Mode) 未定义指令终止模式。 SYS (System Mode) 系统模式,用于运行特权级的操作系统任务。
讯享网

CPSR(Current Program Status Register)用于存储当前程序的状态信息。它包含了处理器模式、条件标志、中断屏蔽位等信息。

CPSR 寄存器结构

CPSR 是一个 32 位的寄存器,其各个位的含义如下:

位 名称 描述 31 N (Negative) 负标志,表示最近一次运算结果为负数。 30 Z (Zero) 零标志,表示最近一次运算结果为零。 29 C (Carry) 进位标志,表示最近一次运算结果产生了进位或借位。 28 V (Overflow) 溢出标志,表示最近一次运算结果产生了溢出。 27-8 Reserved 保留位,未使用。 7 I (IRQ disable) IRQ 中断禁用位,设置为 1 时禁用 IRQ 中断。 6 F (FIQ disable) FIQ 中断禁用位,设置为 1 时禁用 FIQ 中断。 5 T (Thumb) Thumb 状态位,设置为 1 时处理器处于 Thumb 状态。 4-0 Mode 模式位,表示当前处理器的工作模式。

模式位

模式位用于设置处理器的工作模式,常见的模式及其对应的值如下:

模式 值 描述 User 0b10000 用户模式,非特权模式。 FIQ 0b10001 快速中断模式。 IRQ 0b10010 一般中断模式。 Supervisor 0b10011 超级管理员模式,特权模式。 Monitor 0b10110 监视模式,用于安全扩展模式。 Abort 0b10111 数据访问终止模式。 Hypervisor 0b11010 超级监视模式,用于虚拟化扩展。 Undefined 0b11011 未定义指令终止模式。 System 0b11111 系统模式,用于运行特权级的操作系统任务。

MRS 指令

MRS(Move Register from Special register)指令用于将特殊寄存器(如 CPSR 或 SPSR)的值移动到通用寄存器中。常用于读取当前程序状态寄存器(CPSR)或保存程序状态寄存器(SPSR)的值。

MSR 指令

MSR(Move Special register from Register)指令用于将通用寄存器的值移动到特殊寄存器中。常用于修改 CPSR 或 SPSR 的值。

在 ARM 处理器中,SP(Stack Pointer)指针用于指向当前栈的顶部。设置 SP 指针通常用于初始化栈或切换栈。以下是一些常见的设置 SP 指针的方法:

设置 SP 指针

可以使用 指令将一个值加载到 SP 寄存器中,以设置栈指针的位置。

示例
 

保存和恢复 SP 指针

在某些情况下,可能需要保存当前的 SP 指针值,并在稍后恢复它。可以使用通用寄存器来保存和恢复 SP 指针。

示例
讯享网

SP可以指向内部RAM,也可以指向DDR内存。 对于512M的DDR来说,内存范围是 0x~0x9FFFFFFF,栈大小一般设置为2M,由于A7栈是向下增长的,可以将SP设置为 0x。

一般跳到 main 函数,下面是一个示例:

 
讯享网
 
讯享网
 

上面的 Makefile 直接编译的话,会出现 0x 地址放的不是 _start 函数,而是 main 函数。为了确保 0x,需要使用链接脚本 。

链接脚本(linker script)是用于控制链接器(如 )如何将目标文件(object files)链接成可执行文件的脚本,链接脚本通常以 为扩展名,主要有以下作用:

  1. 定义内存布局:指定程序各个段(如 、、)在内存中的位置。
  2. 设置入口点:指定程序的入口点,即程序开始执行的地址。
  3. 分配段:将目标文件中的段分配到内存中的特定位置。
  4. 定义符号:可以定义一些符号,用于在程序中引用特定的内存地址。

以下是本示例使用的链接脚本文件 :

讯享网

本次实验使用的链接脚本 文件:

 

定位计数器

.text

讯享网

.rodata 段

只读数据段,如字符串变量,使用const关键字定义的全局或静态变量。

 

定义 .rodata 段,并将其对齐到 4 字节边界。定位计数器会更新为 .text 段结束后的地址,并对齐到 4 字节。
其中前面一个* 表示匹配所有的输入文件,
(.rodata*)表示匹配所有以.rodata 开头的段,如 .rodata,rodata1,.rodata2。

.data数据段

讯享网

定义 .data 段,并将其对齐到 4 字节边界。定位计数器会更新为 .rodata 段结束后的地址,并对齐到 4 字节。

.bss段

 

记录 .bss 段的起始地址为 __bss_start,然后定义 .bss 段,并将其对齐到 4 字节边界。定位计数器会更新为 .data 段结束后的地址,并对齐到 4 字节。最后,记录 .bss 段的结束地址为 __bss_end。

*(.bss):匹配所有输入文件中的 .bss 段,并将其内容放入输出文件的 .bss 段中。在输入文件中,未初始化的全局变量和静态变量会被放入 .bss 段。 这些变量在编译时会被放入 .bss 段,并在程序启动时被初始化为零。

按第3课操作,将程序烧写到SD卡,可以看到LED1在闪烁。
在这里插入图片描述
本文代码开源地址:
https://gitee.com/xundh/learn_i.mx6u.git



小讯
上一篇 2025-04-22 20:11
下一篇 2025-05-27 14:43

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/172538.html