
Сообщение от
Titus
Как в макроассемблере сделать макросы для команд сохранения регистров в стеке?
Хочу, чтобы PUSH Rx транслировалось, как MOV Rx,-(SP). И т.д.
Например так - если без наворотов:
Код:
.MACRO PUSH ARG
.IRP X,<ARG>
MOV X,-(SP)
.ENDR
.ENDM
PUSH R1
PUSH <R2,R3>
---------- Post added at 22:19 ---------- Previous post was at 22:15 ----------
Кстати о сохранении регистров...
Поскольку эта процедура обычно выполняется в подпрограммах, можно кое-что упростить. К примеру так:
Код:
$SAVAL::
MOV R4,-(SP) ;СОХРАНЯЕМ R4
MOV R3,-(SP) ;R3
MOV R2,-(SP) ;R2
MOV R1,-(SP) ;R1
MOV R0,-(SP) ;R0
MOV 12(SP),-(SP) ;ПЕРЕНОСИМ АДРЕС ВОЗВРАТА
MOV R5,14(SP) ;СОХРАНЯЕМ R5
JSR PC,@(SP)+ ;СОПРОГРАМИМ ВЫЗВАВШЕГО
MOV (SP)+,R0 ;ВОССТАНАВЛИВАЕМ R0
MOV (SP)+,R1 ;R1
MOV (SP)+,R2 ;R2
MOV (SP)+,R3 ;R3
MOV (SP)+,R4 ;R4
MOV (SP)+,R5 ;R5
RETURN
Тогда в подпрограмме делаем CALL $SAVAL, у нас сохраняются все регистры, когда делается RETURN, они сами восстановятся и будет возврат куда надо. Кстати родная DECовская подпрограмма 
---------- Post added at 22:27 ---------- Previous post was at 22:19 ----------
Вообще, рекомендую обратить внимание на библиотеку ULBLIB которая лежит в RT-11 V5.7 сорцовом ките (с исходниками и описанием в них что подпрограммы делают). Весьма удобная вещь - многие RSXовские подпрограммы (увы, не все) в ней есть. Особенно полезны- сохранения регистров в разных сочетаниях, конвертация чисел/radix-50 <> ascii, арифметика без EIS итд.