【问题标题】:Understanding of LDR and STR?了解LDR和STR?
【发布时间】:2021-11-07 17:19:51
【问题描述】:

我正在使用 ARMSim,我猜它是一个 ARM 模拟器,我有这个演示程序。它基本上读取文本文件并打印文本文件中的整数(仅第一行)。

Start:
@Open file for input.
LDR R0, =InputFileName
MOV R1, #0
SWI SWI_Open
BCS FileError

@Save file handle to memory.
LDR R1, =InputFileHandle
STR R0, [R1]

@Read integers.
LDR R0, =InputFileHandle
LDR R0, [R0]
SWI SWI_RdInt

@Print to ARMSIM console.
MOV R1, R0
MOV R0, #Stdout
SWI SWI_PrInt

BAL End

FileError:
MOV R0, #Stdout
LDR R1, =FileErrorMess
SWI SWI_PrStr
BAL Quit

End:
SWI SWI_Exit

.data
.align
InputFileHandle: .skip 4
InputFileName: .asciz "integers.txt"
FileErrorMess: .asciz "Can't open file."

它运行良好,但我不太明白 LDR 或 STR 指令是如何工作的。尤其是那些看起来像 LDR R0, [R0] 或 STR R0, [R1] 的。任何人都可以弄清楚这些是如何工作的吗?

【问题讨论】:

    标签: assembly arm


    【解决方案1】:

    LDRSTR 指令使用后索引寻址来更新其地址寄存器。

    STR 指令将单词存储到内存中。

    LDR 指令从内存中加载一个单词。

    Read more

    【讨论】:

    • 所以看看这个 LDR R0,[R0]。这段代码是说 [R0] 是某种将被加载到 R0 中的地址吗?这个地址是否有某种价值?
    • 无论链接器将包含 LDR 指令的 ELF 部分放在何处,保存该常量的地址都保持有效
    • LDR R0,[R0] 使用 R0 作为该内存的地址从内存中加载 R0 的值。 STR R0,[R1] 将 R0 中的值存储到内存中,使用 R1 作为该内存的地址。再举一个例子,LDR R0,[R2,#4] 将使用 (R2+4) 作为地址从内存中加载 R0 的值。
    • 如果不清楚:LDR R0,[R1,#4] 使用 R1+4 作为地址并加载 R0。 LDR R0,[R1,#4]!使用 R1+4 作为地址,加载 R0,然后将 4 加到 R1,或者它可以将 4 加到 R1,然后使用更新的 R1 作为地址并加载 R0。 LDR R0,[R1],#4 使用 R1 作为地址,然后将 4 加到 R1。
    猜你喜欢
    • 2020-11-25
    • 2017-04-06
    • 2020-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-15
    • 2011-09-05
    • 1970-01-01
    相关资源
    最近更新 更多