assembly - 存储所有寄存器而不抓取任何寄存器

标签 assembly arm css-position fpic

我正在开发一个将引导另一个程序的程序,因此我需要保留传递给我的程序的寄存器,以便我可以在跳转到应该加载的程序之前恢复它们。它是一个裸机系统,没有操作系统,没有 MMU(存在,但目前尚未使用)。

这是我的代码,我只是想知道它是否正确,因为我没有可以测试的 ARM 板,而且我必须尽快提交,

PC相关存储是否只能使用源寄存器低位寄存器(r0-r7),我认为这只是由于指令宽度有限而无法访问某些指令中的高位寄存器的拇指问题。

reset: @ entry point, mapped in reset vector

/* Store registers for bootstrapping */
STR     R0, [PC, #128]
STR     R1, [PC, #128]
STR     R2, [PC, #128]
STR     R3, [PC, #128]
STR     R4, [PC, #128]
STR     R5, [PC, #128]
STR     R6, [PC, #128]
STR     R7, [PC, #128]

/* Following registers can't be used in pc relative load/store */
MOV     R0, R8
STR     R0, [PC, #128]
MOV     R0, R9
STR     R0, [PC, #128]
MOV     R0, R10
STR     R0, [PC, #128]
MOV     R0, R11
STR     R0, [PC, #128]
MOV     R0, R12
STR     R0, [PC, #128]
MOV     R0, SP
STR     R0, [PC, #128]
MOV     R0, LR
STR     R0, [PC, #128]
MRS     R0, CPSR
STR     R0, [PC, #128]
MRS     R0, SPSR
STR     R0, [PC, #128]
ISB     SY
B       clear_regs

saved_regs:
.rept 32
    .word 0x00000000
.endr

.align
clear_regs:
MOV     R0,  #0
MOV     R1,  #0
MOV     R2,  #0
MOV     R3,  #0
MOV     R4,  #0
MOV     R5,  #0
MOV     R6,  #0
MOV     R7,  #0
MOV     R8,  #0
MOV     R9,  #0
MOV     R10, #0
MOV     R11, #0
MOV     R12, #0
MOV     SP,  #0
MOV     LR,  #0

最佳答案

在 ARM 模式(相对于 Thumb 模式)下,可以使用 PC 相关存储中的高位寄存器。如果不允许这样的事情,你的汇编器会警告你。您可能还想考虑使用 STM(存储多个)指令,它允许您指定寄存器列表,而不是单独执行它们。

您可能应该让汇编器通过使用符号来完成计算 PC 偏移量的“艰苦”工作,而不是手动指定偏移量。

reset: @ entry point, mapped in reset vector

/* Store registers for bootstrapping */
STR     R0, saved_regs
ADR     R0, saved_regs + 4

STMIA r0!, {r1,r2,r3,r4,r5,r6,r7,r8,r9,r10,r11,r12,r13,r14,r15}

MRS     R1, CPSR
MRS     R2, SPSR
STMIA   R0, {r1, r2}
ISB     SY
B       clear_regs

saved_regs:
.rept 32
.word 0x00000000
.endr

关于assembly - 存储所有寄存器而不抓取任何寄存器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11353662/

相关文章:

c++ - 在 FriendlyARM 板 mini2440 中编程 GPIO 的最佳方式是什么?

html - 如何制作一个跨越文档整个高度的 div,即使它不包含任何内容?

html - 弹出菜单中的 CSS 绝对/相对定位 : How to use only part of parents' properties (left, 顶部、宽度、垂直/水平对齐)?

assembly - 浮点加法汇编算法

linux - 在 Linux 中使用汇编将变量打印到命令行

programming-languages - 用汇编语言实现的编程语言

c++ - 用 asm 代码交换 C++ 中的 2 个变量

c - 关于为 arm 目标编译应用程序时使用的浮点 abi 标志

c - 如何在树莓派上运行没有操作系统的 C 程序?

javascript - 如何使主DIV内的两个DIV固定且可滚动