-1

编辑: 我关心的是 ARM 指令是如何编码的。

让我们看看下面的例子:

  194640:   e92d40f0    push    {r4, r5, r6, r7, lr}
  194644:   e24dd024    sub sp, sp, #36 ; 0x24
  --> sp decrease 36 ~ 0x24 --> Is it calculated by e24dd024 & 0x0000ffff ?

  1995ec:   e92d4ef0    push    {r4, r5, r6, r7, r9, sl, fp, lr}
  1995f0:   e24ddd0a    sub sp, sp, #640    ; 0x280
  1995f4:   e1a04000    mov r4, r0
  --> sp decrease 640 ~ 0x280 --> How it is calculated ?

 Other examples:
  191ea8:   e92d4030    push    {r4, r5, lr}
  191eac:   e24dd034    sub sp, sp, #52 ; 0x34
  191eb0:   e28d5014    add r5, sp, #20

  194f54:   e28d60a8    add r6, sp, #168    ; 0xa8
  194f58:   e28d5e13    add r5, sp, #304    ; 0x130
4

1 回答 1

0
  push    {r4, r5, r6, r7, lr}
  sub     sp, sp, #36 ; 0x24

这基本上是一个功能“序幕”。
函数保留将要更改的寄存器(push指令)并保留堆栈(sub sp,...)用于函数内部变量和寄存器的中间保留。

所以简单来说,函数使用的变量越多,减去的数字就越大sp。请注意,这也取决于sizeof(x)变量。假设函数声明了一个大结构,那将需要更多的堆栈来容纳它。

确切的值由编译器定义,并且可能因编译设置而异。

于 2021-02-25T11:08:50.413 回答