可以看到左边为C 程序 ,右边为其对应的汇编程序 , 看到汇编可能会慌张,但其实观察可以看到 , 只是在重复几条指令而已。
mov R0 , #1 ;将立即数1(也就是常数)写入到 R0 , MOV只能赋值8位的数值,32位的需要用伪指令LDR
ldr R3 , [fp,#-8] ;将 [FP-8] 内存地址的内容加载到 R3
str R3 , [sp,#-12] ;将 R3的值写入到 [FP-12] 内存地址
add fp , sp ,#0 ; fp = sp + 0
sub sp , sp ,#28 ; sp = sp - 28
push {fp ,lr} ;使用 push 指令是 默认从左往右依次入栈(但是R0-R12通用寄存器会先入大的编号) ,
;栈指针 sp 会自动"增加" , 压fp 和 lr 则 sp = sp -8 (思考为何是减而不是加)
pop {fp} ;pop 指令会将栈内数据依次弹出 , 赋值给{}内的寄存器 , 同时栈指针会自动"减小"
bl <func> ; 跳转指令 ,调整PC指针到对应的跳转地址 , 并且自动将跳转地址的下一个地址写入到 lr 寄存器
|