当前位置:网站首页 > R语言数据分析 > 正文

ldr str指令(ldrsw指令)



在这里插入图片描述

在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 位的寄存器,其各个位的含义如下:

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

模式位

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

模式值描述User0b10000用户模式,非特权模式。FIQ0b10001快速中断模式。IRQ0b10010一般中断模式。Supervisor0b10011超级管理员模式,特权模式。Monitor0b10110监视模式,用于安全扩展模式。Abort0b10111数据访问终止模式。Hypervisor0b11010超级监视模式,用于虚拟化扩展。Undefined0b11011未定义指令终止模式。System0b11111系统模式,用于运行特权级的操作系统任务。

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

到此这篇ldr str指令(ldrsw指令)的文章就介绍到这了,更多相关内容请继续浏览下面的相关推荐文章,希望大家都能在编程的领域有一番成就!

版权声明


相关文章:

  • docker的版本有哪些(docker 版本)2025-02-25 14:36:07
  • rbac权限模型图(rbac权限控制)2025-02-25 14:36:07
  • redhat证书查询官网(redhat证书好就业吗?)2025-02-25 14:36:07
  • store安卓版下载(store安卓下载正版)2025-02-25 14:36:07
  • strace用法(strict用法归纳)2025-02-25 14:36:07
  • kubeadm怎么读(kubesphere怎么读)2025-02-25 14:36:07
  • chrony对时(chronic time)2025-02-25 14:36:07
  • redhat操作系统免费吗(redhat需要激活吗)2025-02-25 14:36:07
  • k8s新版本(k8s新版本不能运行 run pip)2025-02-25 14:36:07
  • score选手(score去哪了)2025-02-25 14:36:07
  • 全屏图片