MSP430: без указателя кадра стэка

This commit is contained in:
AntKrotov committed 2020-01-05 21:42:05 +03:00
1 parent bbe801423d
commit 77bbd3ba84
5 files changed
+54 -66

No files matched your search

+8 -31
View File
@@ -203,10 +203,9 @@ Oberon-реализациях выполнение такой операции
Использование регистров общего назначения R4 - R15
R4 - R7: регистровый стэк (промежуточные значения выражений)
R8 - R12: не используются
R13: используется при обработке прерываний
R8 - R13: не используются
R14: указатель кучи
R15: указатель кадра стэка
R15: используется при обработке прерываний
------------------------------------------------------------------------------
Вызов процедур и кадр стэка
@@ -218,9 +217,8 @@ Oberon-реализациях выполнение такой операции
Состояние стэка при выполнении процедуры:
меньшие адреса <- |var3|var2|var1|R15|PC|arg1|arg2|arg3| -> бОльшие адреса
меньшие адреса <- |var3|var2|var1|PC|arg1|arg2|arg3| -> бОльшие адреса
R15 - значение регистра R15 перед вызовом
PC - значение регистра PC перед вызовом (адрес возврата)
argX - параметры в порядке объявления (слева направо)
varX - локальные переменные в порядке использования в процедуре
@@ -230,30 +228,10 @@ Oberon-реализациях выполнение такой операции
записи) занимают место в стэке в соответствии с их размером (с учетом
выравнивания).
Адресация кадра стэка:
0(R15) - предыдущее значение регистра R15
2(R15) - адрес возврата
4(R15) - arg1
6(R15) - arg2
-2(R15) - var1
-4(R15) - var2
Размещение локальных переменных зависит от их размеров и порядка
использования, и в общем случае неопределенно. Если переменная не
используется явно, то компилятор не выделяет для нее место в стэке.
Пролог процедуры:
PUSH R15 ; сохранить предыдущее значение
MOV SP, R15 ; настроить указатель кадра
PUSH #0 ; выделить место для локальных переменных с обнулением
PUSH #0
...
Эпилог процедуры:
MOV R15, SP ; удалить локальные переменные (если есть)
POP R15 ; восстановить предыдущее значение
RET ; возврат
------------------------------------------------------------------------------
Скрытые параметры процедур
@@ -294,9 +272,8 @@ Oberon-реализациях выполнение такой операции
2000H + 400H - 3; (* JNZ L2 *)
(* L1: *)
Для таких процедур компилятор не генерирует код пролога. Эпилог состоит
из единственной машинной команды "MOV @SP+, PC", она же "POP PC",
она же "RET". Способ передачи параметров и результата не изменяется.
Компилятор автоматически добавляет к такой процедуре команду RET.
Способ передачи параметров и результата не изменяется.
Кодовые процедуры можно использовать также и для добавления в программу
константных данных:
@@ -341,12 +318,12 @@ SYSTEM.
PUSH #30 ; поместить в стэк приоритет прерывания
Label:
MOV SP, R13 ; настроить R13 на структуру данных прерывания (см. далее)
MOV SP, R15 ; настроить R15 на структуру данных прерывания (см. далее)
PUSH R4 ; сохранить рабочие регистры (R4 - R7)
...
PUSH R7
PUSH R13 ; передать параметр interrupt в обработчик (см. далее)
PUSH @R13 ; передать параметр priority в обработчик (см. далее)
PUSH R15 ; передать параметр interrupt в обработчик (см. далее)
PUSH @R15 ; передать параметр priority в обработчик (см. далее)
CALL int ; вызвать обработчик (см. далее)
ADD #4, SP ; удалить из стэка параметры обработчика
POP R7 ; восстановить рабочие регистры (R7 - R4)