mirror of
https://github.com/AntKrotov/oberon-07-compiler.git
synced 2026-10-05 09:45:47 +00:00
MSP430: без указателя кадра стэка
This commit is contained in:
1 parent
bbe801423d
commit
77bbd3ba84
5 files changed
+54
-66
No files matched your search
+8
-31
@@ -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)
|
||||
|
||||
Reference in new issue
Block a user