arm-linux gcc 指针 取值,GCC计算堆栈指针的goto和值_gcc_开发99编程知识库

在函數序言中的當前位置堆棧中保存一個被調用者保存寄存器即使fomit幀指針。

在下面的示例中,sp+4存儲在r7然後在尾聲( LBB0_3 ) 已恢復( r7+4 > r4,r4 > sp ) 。 因此可以跳轉函數,增長堆棧的任何時候在函數內的任意位置而不是把心思花在堆棧上。 如果跳出函數( 通過跳轉*addr ) 則將跳過此尾聲和成為皇室搞砸了堆棧上。

動態的簡短的示例還使用alloca在堆棧上分配內存:

Clang arch Armv7 fomit幀指針c S O0 o 堆棧c#include

int foo(int sz, int jmp) {

char *buf = alloca(sz);

int rval = 0;

if( jmp ) {

rval = 1;

goto done;

}

volatile int s = 2;

rval = s * 5;

done:

return rval;

}

和反彙編代碼:_foo:

@ BB#0:

push {r4, r7, lr}

add r7, sp, #4

sub sp, #20

movs r2, #0

movt r2, #0

str r0, [r7, #-8]

str r1, [r7, #-12]

ldr r0, [r7, #-8]

adds r0, #3

bic r0, r0, #3

mov r1, sp

subs r0, r1, r0

mov sp, r0

str r0, [r7, #-16]

str r2, [r7, #-20]

ldr r0, [r7, #-12]

cmp r0, #0

beq LBB0_2

@ BB#1:

movs r0, #1

movt r0, #0

str r0, [r7, #-20]

b LBB0_3

LBB0_2:

movs r0, #2

movt r0, #0

str r0, [r7, #-24]

ldr r0, [r7, #-24]

movs r1, #5

movt r1, #0

muls r0, r1, r0

str r0, [r7, #-20]

LBB0_3:

ldr r0, [r7, #-20]

subs r4, r7, #4

mov sp, r4

pop {r4, r7, pc}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值