汇编代码中的堆栈管理

Stack management in assembly code

我是汇编语言的新手,我正在尝试理解汇编代码。除了一些操作,特别是堆栈指针寄存器 (r1) 上的操作外,一切对我来说似乎都很清楚。

代码如下:

#define A           r2
#define B           r3
#define R           r6


.section .text, "ax"
.global u32mul16

u32mul16:
    ; R = AxB :
    ;       A <= input  r2 (16bits expected)
    ;       B <= input  r3 (16bits expected)
    ;       R <= output r6 (32bits)

    ; stack update and save
    sub     r1, #0x10
    stq     r4, [r1]

    ; multiplication computation
             ...
    ; after computation

    ; prepare the 'return' value
    mov     r2, R

    ldq     r4, [r1]
    add     r1, #0x10

    jmp     [r15]

并非所有寄存器(r0,...,r15)都是 32 位寄存器。

我的问题如下:为什么操作

sub r1, #0x10
stq r4, [r1]

开头和

ldq r4, [r1]
add r1,#0x10

最后需要吗?我不明白它的作用。

还有,有没有理由把结果放到寄存器r2

正如 Michael 所说,您必须找出该体系结构的过程调用标准是什么。

sub 从栈中分配 space ,这是存储 r4 所需要的,也可能用于省略的计算代码中的局部变量。据推测 r4 也在该代码块中被修改,并且调用约定可能将其指定为 callee-saved 寄存器,因此必须保留其值。如果您不需要 locals 并且您不修改 r4,那么您很可能不需要这些说明。

同样,调用约定指定使用哪个寄存器来传递和返回参数。