【问题标题】:Stack management in assembly code汇编代码中的堆栈管理
【发布时间】:2016-01-13 10:07:38
【问题描述】:

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

【问题讨论】:

  • 这是什么架构?波标量?您必须找出该架构的过程调用标准是什么。
  • 它是哈佛架构,具有类似 RISC 的加载/存储指令

标签: assembly stack 32-bit


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 2017-11-18
    • 1970-01-01
    • 2019-10-01
    • 1970-01-01
    • 2010-11-04
    • 2015-12-23
    • 2013-12-12
    • 2014-05-29
    • 2011-12-05
    相关资源
    最近更新 更多