“ stmdb r3 !, {sp,lr}”是否等效于序列?

  1. str sp,[r3,#-4]!
  2. str lr,[r3,#-4]!

“ ldmia r0 !, {sp,lr}”是否等效于序列?

  1. ldr sp,[r0],#4
  2. ldr lr,[r0],#4

#1楼 票数:0

我误解了stmdb的功能。 等价于“ stmdb r3 !, {sp,lr}”,将是交换顺序“ lr”,然后是“ sp”:

  • str lr,[r3,#-4]!
  • str sp,[r3,#-4]!

谢谢,维杰

#2楼 票数:0

stmdb r3 !, {sp,lr}

str sp,[r3,#-4]!

str lr,[r3,#-4]!

stmdb r3 !, {sp,lr}-在每次传输前存储多个寄存器和递减地址。 r3基址寄存器和! -将起始r3地址+ offcet写回r3。 DB-由于4种堆栈类型(全降序堆栈,全升序堆栈,空降序堆栈,空升序堆栈)。 用STM DB对应于Full Descending堆栈。 因此,sp-堆栈指针和lr-链接寄存器存储到由r3和r3寻址的内存中== sizeof(sp)+ sizeof(ls)。 r3 + = 8;

  1. r3指向某个内存地址。

  2. r3-= 8; (4字节指令)将r3移入较低的存储器地址。 递减r3。

  3. 存储顺序lr-first sp-second。 到r3-8-lr将被存储,到r3-4 sp将被存储。

  4. r3-点到端(r3 + = 8);

str sp,[r3,#-4]! (预索引变体)-将sp存储到r3-4内存地址中并保存r3- = 4;

str lr,[r3,#-4]! -将lr存储到(r3-4)-4中并保存r3- = 4;

因此,将stmdb r3 !, {sp,lr}-放入更高的地址lr中。 (str sp,[r3,#-4]!)+(str lr,[r3,#-4]!)lr再次位于较高的地址中。

介绍ARM汇编语言

ldmia r0 !, {sp,lr}-之后加载多个增量。

从r0指向的内存中获取值并将其保存到sp中。 从内存中获取下一个值并保存到lr中。 r0 + = 8;

ldr sp,[r0],#4-将值从存储器r0 + 4加载到sp。 ([r0],#4)-后索引变式的第一次加载和下一次编辑r0,r0 + = 4。

ldr lr,[r0],#4-将值从存储器r0 + 4加载到lr中。

来自较高内存的两个变量值都复制到了lr中。

  ask by TheLoneJoker translate from so

未解决问题?本站智能推荐:

1回复

在汇编x86或ARM中引发softirq

我对x86上的int指令很熟悉。 是否可以内联汇编int my_unique_number并使用 requst_irq(my_unique_number , function); 具有要 当指令执行时调用? 那么ARM有什么类似的方法可以使用SWI immed_8指令或
1回复

ARM程序集“retne”指令

我目前正在了解Linux内核启动所需的内容。 我正在浏览Linux内核源代码树,特别是ARM体系结构,直到我在arch / arm / kernel / hyp-stub.S中偶然发现了这个汇编指令retne lr 。 从概念上讲,很容易理解,如果Z标志为0,则指令返回存储在链接寄存器中
2回复

如何计算在ARM程序中执行的指令数?

我想通过计数指令来执行我想对应用程序进行的更改的性能评估。 但是,我对ARM的调试接口还不太熟悉,无法知道如何执行此操作。 甚至还有用于此类事情的接口吗? 如果有必要,我完全有能力深入内核,但是我的直觉告诉我这种事情应该在用户空间中实现。
1回复

是否有 ARM 处理器支持片上硬件随机数发生器?

Intel 支持用于返回随机数的 RDRAND(也称为 Intel 安全密钥)指令。 它在 Ivy Bridge 处理器中可用。 我想知道,是否有任何 ARM 处理器具有功能类似于 RDRAND 的片上硬件随机数生成器的指令? 我还有一个问题。 在 Linux 内核(3.10 版)中, /l
1回复

最新的arm架构内核代码在slow_work_pending上有错吗?

目前我正在使用 ARM 架构的嵌入式 Linux 内核。 作为 bootlin 提供的最新内核源代码,我在arch/arm/kernel/entry-common.S 中看到了这些代码: do_work_pending() syscall参数是否假设为r1 ? 我已经尝试通过在内核启动时打印
1回复

了解arm64的kvm_vcpu_run_vhe函数

在arch/arm64/kvm/hyp/vhe/switch.c 中,我们有以下代码在 arm64 上运行 EL2(虚拟化层)中的 CPU: 我认为这里重要的一行是__guest_enter ,它在这里定义。 我试图了解__kvm_vcpu_run_vhe究竟做了什么。 它会阻止呼叫者吗?
1回复

如何理解内核崩溃转储的ARM寄存器?

在ARM平台上运行Linux内核之后,寄存器将转储到控制台。 但是我对分析这些寄存器感到困惑。 例如, 问题: 0xc0705970在SP: 0xc0705970:什么? 代码地址还是数据地址? 在哪里找到它? 为什么sp : c07059f0不在SP寄存器
1回复

如何使用printf调试linux内核的汇编代码

这是我试图通过putf / printk语句调试的文件。 代码是汇编。 我只是想从这个文件中将一些消息发送到控制台。 此代码适用于ARM。 我尝试在这样的代码块中使用printk但是无法编译。 有什么建议?