2016-01-13 3 views
0

Я ноб на языке ассемблера, и я пытаюсь понять ассемблерный код. Мне все кажется ясным, за исключением нескольких операций, и особенно их в регистре указателя стека (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?

+2

Какая архитектура это? Wavescalar? Вам нужно будет узнать, что эта процедура называется стандартом для этой архитектуры. – Michael

+0

Это архитектура Гарварда с RISC-подобной инструкцией по загрузке/хранению – Raoul722

ответ

1

Как сказал Майкл, вам нужно выяснить, какая процедура называется стандартом для этой архитектуры.

sub выделяет пространство из стека, которое необходимо для хранения r4 и, возможно, также используется для локальных переменных в коде вычисления, который опущен. Предположительно, r4 также модифицируется в этом блоке кода, и соглашение о вызове может указывать на то, что в качестве зарегистрированного пользователем регистра, следовательно, его значение должно быть сохранено. Если вам не нужны местные жители, и вы не изменяете r4, вам, скорее всего, не нужны эти инструкции.

Аналогично, вызывающее соглашение указывает, какой регистр использовать для передачи и возврата аргументов.

Смежные вопросы