不知道有没有不懂堆栈的,特意写了个操作堆栈的程序,程序把R0-R12寄存器赋值然后压入堆栈,再用R7保存返回地址,然后再定义12个变量再放入堆栈里,最后把12个变量再弹会寄存器
.thumb
.syntax unified
.section .data
.equ zhanding, 0x20000200 @ 堆栈顶
.section .text
vectors:
.word zhanding + 1
.word start + 1
start:
mov r0, # 0 @ 把各寄存器赋值
mov r1, # 1
mov r2, # 2
mov r3, # 3
mov r4, # 4
mov r5, # 5
mov r6, # 6
mov r7, # 7
mov r8, # 8
mov r9, # 9
mov r10, # 10
mov r11, # 11
mov r12, # 12
bl duizhanshiyan @跳转到堆栈实验函数
sixunhuan: @ 死循环
b sixunhuan
duizhanshiyan:
push {r0-r12,lr} @ 把RO-R7压入堆栈
mov r7, sp @ 把返回地址保存到R7
sub sp, 0x30 @ 堆栈留出变量的空间好迎接下次PUSH
mov r0, # 10 @ 把个寄存器赋变量值
mov r1, # 11
mov r2, # 12
mov r3, # 13
mov r4, # 14
mov r5, # 15
mov r6, # 16
mov r8, # 18
mov r9, # 19
mov r10, # 20
mov r11, # 21
mov r12, # 22
str r0, [sp] @ 把各变量值放到堆栈
str r1, [sp, # 0x04]
str r2, [sp, # 0x08]
str r3, [sp, # 0xc]
str r4, [sp, # 0x10]
str r5, [sp, # 0x14]
str r6, [sp, # 0x18]
str r8, [sp, # 0x1c]
str r9, [sp, # 0x20]
str r10, [sp, # 0x24]
str r11, [sp, # 0x28]
str r12, [sp, # 0x2c]
add sp, # 0x30 @ 堆栈指针回到第一次压栈的地方
str r12, [sp] @ 把个变量放到原来储存R0-R12的地址
str r11, [sp, # 0x4]
str r10, [sp, # 0x8]
str r9, [sp, # 0xc]
str r8, [sp, # 0x10]
str r6, [sp, # 0x18]
str r5, [sp, # 0x1c]
str r4, [sp, # 0x20]
str r3, [sp, # 0x24]
str r2, [sp, # 0x28]
str r1, [sp, # 0x2c]
mov sp, r7 @ 把返回地址找回来
pop {r0-r12,pc} @ 把变量弹回各寄存器
上3个图,分别显示3个操作后堆栈数据的变化
1
2
3
C语言形式的堆栈操作很简单,提醒我可不知道什么调用约定哦!
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)