ARM指令ldr、str、stm、ldm理解
1.LDR:L表⽰LOAD
理解为:Load from memory into register。
LDR R1, [R2]
R1【寄存器】<——[R2]【内存RAM】
将R2的memory内容copy到R1寄存器.
2.STR:S表⽰STORE
理解为:Store from a register into memory.
STR R1, [R2]
R1【寄存器】——>[R2]内存RAM】
将R1寄存器内容copy到R2的memory.
(3)LDM:L的含义仍然是LOAD(连接寄存器和连续内存的相互copy)
理解为:Load from memory into register。
虽然貌似是LDR的升级,但是,千万要注意,这个指令运⾏的⽅向和LDR是不⼀样的,是从左到右运⾏的。该指令是将内存中堆栈内的数据,批量的赋值给寄存器,即是出栈操作;其中堆栈指针⼀般对应于SP,注意SP是寄存器R13,实际⽤到的却是R13中的内存地址,只是该指令没有写为[R13],同时,LDM指令中寄存器和内存地址的位置相对于前⾯两条指令改变了,下⾯的例⼦:
LDMFD SP! , {R0, R1, R2}
学校办公室实际上可以理解为: LDMFD [SP]!, {R0, R1, R2}
意思为:把sp指向的3个连续地址段(应该是3*4=12字节(因为为r0,r1,r2都是32位))中的数据拷贝到r0,r1,r2这3个寄存器中去(如果这个地⽅还不懂的话,可以参看我⽂章开头提到的链接,⾥⾯有详细的图解)
(4)STM:S的含义仍然是STORE,与LDM是配对使⽤的,其指令格式上也相似,即区别于STR,是将堆栈指针写在左边,⽽把寄存器组写在右边。
听用英语怎么说STMFD SP!, {R0}
同样的,该指令也可理解为: STMFD [SP]!, {R0}
意思是:把R0保存到堆栈(sp指向的地址)中。
美术教案小班显然,这两个堆栈操作指令也有个特点,就是寄存器组写在后⾯(右边)⽽堆栈指针写在前⾯(左边),⽽且实际上使⽤的是堆栈指针中的内存地址,这⼀点与前⾯两条指令是有区别的。
(补充:sp后⾯的!,作⽤是指命令执⾏完后,对应的地址值赋给sp,对于例程的SDM,是说最后sp的值应该是sp+3*4=sp+12)
1.volatile.c
#include <stdio.h>
int main (void){
volatile int i = 35;
int a = i;
}
# aarch64-linux-gnu-gcc asm_volatile.c -S -O2 -o volatile.s
//volatile.s
.arch armv8-a
.file "asm_volatile.c"
.text
.ction .text.startup,"ax",@progbits
.align 2
.p2align 3,,7
.global main
.type main, %function //以.开头的都是外代码标签.
main:
sub sp, sp, #16 //sp = sp -16 ;栈从⾼地址到低地址,分配16个字节栈空间,等待输⼊⼊栈.
mov w0, 35 //将⽴即数35存⼊寄存器w0
str w0, [sp, 12] //将w0寄存器中的值存到sp+12所指定的地址内存;store register[w0] to memory[sp,12]. mov w0, 0 //置空w0寄存器.
ldr w1, [sp, 12] //将(sp+12)地址内存中的内容存到w1寄存器;load memory[sp,12] to register[w1].
add sp, sp, 16 //sp = sp + 16;//栈从⾼地址到低地址,恢复16字节地址,sp指针重新指向sp+16地址
哺乳期吃什么水果
ret
.size main, .-main
.ident "GCC: (Ubuntu/Linaro 7.5.0-3ubuntu1~18.04) 7.5.0"
.ction .note.GNU-stack,"",@progbits
str理解为: store a register to memory
str w0, [sp,12]
50以内9的倍数w0: register
[sp,12]: memory
ldr理解为: load memory to a register
ldr w1, [sp,12]
w1: register
多层眼皮[sp,12]: memory
stm :store multi registers to some memory
ldm: load multi registers from some memory
2.optimize.c
#include <stdio.h>
int main (void){
int i = 20;
int a = i;
}
# aarch64-linux-gnu-gcc asm_optimize.c -S -O2 -o optimize.s
.arch armv8-a
.file "asm_optimize.c"
.text
.ction .text.startup,"ax",@progbits
.align 2
声乐论文
.p2align 3,,7
.global main
.
家风演讲稿type main, %function
main:
mov w0, 0
ret
.size main, .-main
.ident "GCC: (Ubuntu/Linaro 7.5.0-3ubuntu1~18.04) 7.5.0"
.ction .note.GNU-stack,"",@progbits