Я ноб на языке ассемблера, и я пытаюсь понять ассемблерный код. Мне все кажется ясным, за исключением нескольких операций, и особенно их в регистре указателя стека (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
?
Какая архитектура это? Wavescalar? Вам нужно будет узнать, что эта процедура называется стандартом для этой архитектуры. – Michael
Это архитектура Гарварда с RISC-подобной инструкцией по загрузке/хранению – Raoul722