汇编代码中的堆栈管理



我是汇编语言的菜鸟,我正在尝试理解汇编代码。除了一些操作,特别是堆栈指针寄存器(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中吗?

正如迈克尔所说,你必须找出该架构的过程调用标准是什么。

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

同样,调用约定指定用于传递和返回参数的寄存器。

最新更新