网页制作素材网站,wordpress 站内资讯,广州手机软件开发,wordpress漏洞视频【内存读写指令】 int *p0X12345678
*p100;//向内存中写入数据
int a *p;//从内存读取
1.单寄存器内存读写指令
1.1 指令码以及功能
向内存中写#xff1a;
str:向内存中写一个字(4字节)的数据
strh:向内存写半个字#xff08;2字节#xff09;的数据
strb:向内存写一个字…【内存读写指令】 int *p0X12345678
*p100;//向内存中写入数据
int a *p;//从内存读取
1.单寄存器内存读写指令
1.1 指令码以及功能
向内存中写
str:向内存中写一个字(4字节)的数据
strh:向内存写半个字2字节的数据
strb:向内存写一个字节的数据
从内存读
ldr:从内存读取一个字的数据
ldrh:从内存读取半个字的数据
ldrb:从内存读取一个字节的数据
1.2 格式
指令码{条件码} 目标寄存器 [目标地址]
str 目标寄存器 ,[目标地址]将目标寄存器的数据写入到以目标地址为起始的内存中
ldr 目标寄存器 ,[目标地址]从以目标地址为起始的内存中读一个字的数据到目标寄存器
1.3 示例 mov r1,#0XFFFFFFFFldr r2,0X40000000向内存写入str r1,[r2]从内存读ldr r3,[r2]
1.4 单寄存器读写的地址索引方式
1.前索引mov r1,#0XFFFFFFFFldr r2,0X40000000str r1,[r2,#8]将r1寄存器的值保存到r28为起始地址的内存中ldr r3,[r2,#8]从r28为起始地址的内存中读2.后索引mov r1,#0XFFFFFFFFldr r2,0X40000000str r1,[r2],#8 将r1寄存器的值保存到r2为起始地址的内存中r2值让r283.自动索引mov r1,#0XFFFFFFFFldr r2,0X40000000str r1,[r2,#8]! 将r1寄存器的值保存到r28为起始地址的内存中r2r28
2.批量寄存器的内存读写方式
2.1 指令码以及格式
向内存写stm 目标地址{寄存器列表}将寄存器列表中每一个寄存器的值都写道目标地址指向的连续空间之中
从内存读ldm 目标地址{寄存器列表}将目标地址指向的连续内存中的数据读到寄存器列表中的寄存器中注意事项1.如果寄存器列表中寄存器的编号连续可以用-表示列表如果不连续用,分割寄存器{r1-r5,r7}2.无论寄存器列表中如何表示我们在读写内存的时候始终是低地址 对应低寄存器编号 2.2 示例代码
mov r1,#1mov r2,#2mov r3,#3mov r4,#4mov r5,#5ldr r6,0X40000000stm r6,{r1,r2,r3,r4,r5} 将r1-r6寄存器的值写道r6指向的连续内存中ldm r6,{r7,r8,r9,r10,r11}从r6指向的连续内存中读取数据保存到r7-r11寄存器中
2.3 批量寄存器的地址增长方式
每次向指定寄存器保存的地址中写入一个数据保存地址的寄存器保存的地址也会发生相应的改变 mov r1,#1mov r2,#2mov r3,#3mov r4,#4mov r5,#5ldr r6,0X40000000stm r6!,{r1-r5}先向r6指向的内存中写一个数据然后r6保存的地址向地址大的方向增长 ia后缀 mov r1,#1mov r2,#2mov r3,#3mov r4,#4mov r5,#5ldr r6,0X40000000stmia r6!,{r1-r5}先向r6指向的内存中写一个数据然后r6保存的地址向地址大的方向增长 ib后缀
mov r1,#1mov r2,#2mov r3,#3mov r4,#4mov r5,#5ldr r6,0X40000000stmib r6!,{r1-r5}先让R6寄存器保存的地址往地址大的方向增长再向R6寄存器保存的地址中写入数据 da后缀
mov r1,#1mov r2,#2mov r3,#3mov r4,#4mov r5,#5ldr r6,0X40000800stmda r6!,{r1-r5}先向R6指向的内存中存数据然后R6寄存器保存的地址往地址小的方向增长 dB后缀 mov r1,#1mov r2,#2mov r3,#3mov r4,#4mov r5,#5ldr r6,0X40000800stmdb r6!,{r1-r5}先将R6寄存器保存的地址往地址小的方向增长再往R6寄存器保存的地址内存中存入数据 mov r1,#1mov r2,#2mov r3,#3mov r4,#4mov r5,#5ldr r6,0X40000000stmia r6!,{r1-r5} ia存db取ldmdb r6!,{r7-r11}
3.栈内存读写
栈指针寄存器R13/SP
栈栈本质上就是一段内存我们在内存中指定一片区域用于保存一些临时数据这片区域就是栈区
3.1 栈的类型
增栈压栈结束后栈顶往地址大的方向增长
减栈压栈结束后栈顶往地址小的方向增长
空栈压栈结束后栈顶区域没有有效数据
满栈压栈结束后栈顶区域存放有效数据空增栈EA/空减栈(ED)/满增栈(FA)/满减栈(FD)
ARM使用的栈是满减栈 3.2 满减栈压栈出栈操作
ex1ldr sp,0X40000020 指定顶地址mov r1,#1mov r2,#2mov r3,#3mov r4,#4mov r5,#5push {r1-r5} 压栈pop {r6-r10} 将栈顶元素数值出栈
ex2:ldr sp,0X40000020 指定顶地址mov r1,#1mov r2,#2mov r3,#3mov r4,#4mov r5,#5STMDB sp!,{r1-r5} 压栈LDMIA sp!,{r6-r10} 将栈顶元素数值出栈
EX3:ldr sp,0X40000020 指定顶地址mov r1,#1mov r2,#2mov r3,#3mov r4,#4mov r5,#5STMfd sp!,{r1-r5} 压栈LDMfd sp!,{r6-r10} 出栈
4.栈实例---叶子函数的调用过程
.text
.global _start _start:ldr sp,0X40000020 初始化栈b main
main:mov r1,#1mov r2,#2bl funcadd r3,r1,r2b mainfunc:
压栈保护现场stmfd sp!,{r1,r2}mov r1,#3mov r2,#4sub r4,r2,r1出栈恢复现场ldmfd sp!,{r1,r2}mov pc,lr 返回main函数wh: b wh .end
5.栈实例---非叶子函数的调用过程
.text
.global _start _start:ldr sp,0X40000020 初始化栈b main
main:mov r1,#1mov r2,#2bl funcadd r3,r1,r2b mainfunc:
压栈保护现场stmfd sp!,{r1,r2,lr}mov r1,#3mov r2,#4bl fun1sub r4,r2,r1出栈恢复现场ldmfd sp!,{r1,r2,lr}mov pc,lr 返回main函数
fun1:
压栈保护现场stmfd sp!,{r1,r2}mov r1,#4mov r2,#5mul r5,r1,r2出栈恢复现场ldmfd sp!,{r1,r2}mov pc,lrwh: b wh .end