汇编代码中的堆栈管理
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
,那么您很可能不需要这些说明。
同样,调用约定指定使用哪个寄存器来传递和返回参数。
我是汇编语言的新手,我正在尝试理解汇编代码。除了一些操作,特别是堆栈指针寄存器 (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
,那么您很可能不需要这些说明。
同样,调用约定指定使用哪个寄存器来传递和返回参数。