首页
社区
课程
招聘
[原创]小学文化讲解GNU ARM汇编堆栈太简单
发表于: 2015-12-20 12:34 6514

[原创]小学文化讲解GNU ARM汇编堆栈太简单

2015-12-20 12:34
6514
不知道有没有不懂堆栈的,特意写了个操作堆栈的程序,程序把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语言形式的堆栈操作很简单,提醒我可不知道什么调用约定哦!

[课程]Linux pwn 探索篇!

上传的附件:
收藏
免费 4
支持
分享
最新回复 (2)
雪    币: 281
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
这是用来干嘛的。。。。堆栈
2015-12-20 14:19
0
雪    币: 803
活跃值: (850)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
3
简化一下吧, 功能依然可以实现,这个比刚才那个简练的多

运行结果跟上面的一样



         .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 shijinzhizhuan_ascii
sixunhuan:
        b sixunhuan
shijinzhizhuan_ascii:
        push {r0-r12,lr}
        mov r7, sp
        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
        push {r0-r12}     @ 把变量放到堆栈
        add sp, # 0x68
        push {r0-r12}      @ 变量覆盖输入的数据
         mov sp, r7        @ 找回返回地址
        pop {r0-r12,pc}  @ 弹变量到各寄存器
上传的附件:
2015-12-20 16:49
0
游客
登录 | 注册 方可回帖
返回
//