都忘光了,重新温习下。
AAPC
V1-V7
ldr , = 就是ldr地址和没有=就是ldr内容
R4-R10在aapc在调用过程中不会变化。
但是r1-r3没有办法保证,所以开辟堆栈
比如开始存到SP中,然后sub sp, #4, 最后再add, sp, #4(必须), ldr r14, [sp, #4], 减先存后,取先加后,不然用的是别人的空间,关键是减的后,用的时候在加。
最后将sp复位,所以需要先保存sp到r12 ip中,再取出ip到sp, ip也是保存在堆栈中。
但是在之中用的过程中的sp无法定位,引入fp, 就是r11, 固定指向栈开始的地方(不是开始的上一个), frame pointer。
先保存fp, sub fp, ip, #4
FP
LR
SP
最后用fp #-8
fp #-4
fp #0
来取这三个指针
又因为群存指令的存在,最后可以改写成这样
fd 满减栈
mov ip, sp
1.stmfd sp!, {fp, ip, lr, pc}后者是高编号
高编号对应高地址
ldm
2.sub fp, ip, #4
结束时:
3.sub sp, fp, #12
然后将值装回
4. ldmfd sp!, {fp, sp, pc}
可以自己制定堆栈值,总的不超过6,0不多于6个。
.ascii "\0" asciz 自动加
r0-r4, 四个参数,其余的靠堆栈传, 注意传的是参数的地址
-fpic
adr 与位置无关 最后转成pc+n
段的改变
用0填充
objcopy制定拷贝哪一段,多次执行
跨越段程序的问题,要用后决定的方式,所以判断是否与位置有关,看有没有=(有的会被优化成adr), 看有没有标签,前面又被ldr了
nm
t 只能在本文件中,u undefine
.global
.section data
.section text
cpsr, =r
msr mrs(取)
同时访问18, r0 - r15. 16 + 2
user , system 差别不大
操作系统是svc, 应用程序是user
linux 不用system
上电就是reset异常
b reset
b und
reset:
二级跳转是因为代码间隙不够
undefined mode no stack
AAPC
V1-V7
ldr , = 就是ldr地址和没有=就是ldr内容
R4-R10在aapc在调用过程中不会变化。
但是r1-r3没有办法保证,所以开辟堆栈
比如开始存到SP中,然后sub sp, #4, 最后再add, sp, #4(必须), ldr r14, [sp, #4], 减先存后,取先加后,不然用的是别人的空间,关键是减的后,用的时候在加。
最后将sp复位,所以需要先保存sp到r12 ip中,再取出ip到sp, ip也是保存在堆栈中。
但是在之中用的过程中的sp无法定位,引入fp, 就是r11, 固定指向栈开始的地方(不是开始的上一个), frame pointer。
先保存fp, sub fp, ip, #4
FP
LR
SP
最后用fp #-8
fp #-4
fp #0
来取这三个指针
又因为群存指令的存在,最后可以改写成这样
fd 满减栈
mov ip, sp
1.stmfd sp!, {fp, ip, lr, pc}后者是高编号
高编号对应高地址
ldm
2.sub fp, ip, #4
结束时:
3.sub sp, fp, #12
然后将值装回
4. ldmfd sp!, {fp, sp, pc}
可以自己制定堆栈值,总的不超过6,0不多于6个。
.ascii "\0" asciz 自动加
r0-r4, 四个参数,其余的靠堆栈传, 注意传的是参数的地址
-fpic
adr 与位置无关 最后转成pc+n
段的改变
用0填充
objcopy制定拷贝哪一段,多次执行
跨越段程序的问题,要用后决定的方式,所以判断是否与位置有关,看有没有=(有的会被优化成adr), 看有没有标签,前面又被ldr了
nm
t 只能在本文件中,u undefine
.global
.section data
.section text
cpsr, =r
msr mrs(取)
同时访问18, r0 - r15. 16 + 2
user , system 差别不大
操作系统是svc, 应用程序是user
linux 不用system
上电就是reset异常
b reset
b und
reset:
二级跳转是因为代码间隙不够
undefined mode no stack