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