Обновления в тесте:
1. Улучшено тестирование команды деления (спасибо за замечание Patron'у).
2. Сделано жесткое тестирование команды MARK (на реале не проверено, проверено на эмуляторах УКНЦ - EmuStudio и UKNCBTL).
TSTVM2 v0.3a
Обновления в тесте:
1. Улучшено тестирование команды деления (спасибо за замечание Patron'у).
2. Сделано жесткое тестирование команды MARK (на реале не проверено, проверено на эмуляторах УКНЦ - EmuStudio и UKNCBTL).
TSTVM2 v0.3a
Ассемблер допускает написаниеКод:MOV #^O006400,R0 ; R0 - код команды MARK N
(MARK определять не нужно - фича).Код:MOV #MARK,R0
Для тестирования необязательно загонять в стек. Пример использованя команды MARK и так и так (а заодно использования мнемоники вместо кода):А это отвлеченно - пример когда команда MARK работает не так как ожидается:Код:.TY MARK.MAC
.TITLE MARK -- ПРИМЕРЫ ИСПОЛЬЗОВАНИЯ MARK
.IDENT /V01.00/
.MCALL .EXIT,.PRINT
;+
;ПРИМЕР БЕЗ ИСПОЛЬЗОВАНИЯ СТЕКА
;-
START:: MOV #RSTRT,R5 ;АДРЕС ДЛЯ ПЕРЕХОДА
MARK 4 ;ИДЕМ ТУДА, УСТАНАВЛИВАЕМ СТЕК
STACK:: .BLKW 4 ;ОБЛАСТЬ СТЕКА
.WORD 123456 ;ЗНАЧЕНИЕ ДЛЯ R5
;+
;ПОСЛЕ ВЫПОЛНЕНИЯ КОМАНДЫ MARK В R5 БУДЕТ ПОМЕЩЕНО
;123456, А SP БУДЕТ УКАЗЫВАТЬ НА #RSTRT
;-
RSTRT:: MOV R5,R1 ;ПЕРЕВОДИМ R5 В ASCII
MOV #VR5,R0 ;
MOV PC,R2 ;
CALL $CBOMG ;
MOV #VSP,R0 ;ПЕРЕВОДИМ SP В ASCII
MOV SP,R1 ;
MOV PC,R2 ;
CALL $CBOMG ;
MOV #VRS,R0 ;ПЕРЕВОДИМ АДРЕС #RSTRT В ASCII
MOV #RSTRT,R1 ;...ДОЛЖЕН БЫТЬ РАВЕН SP
MOV PC,R2 ;
CALL $CBOMG ;
.PRINT #R5VAL ;ПЕЧАТАЕМ ЗНАЧЕНИЯ
;+
;ПРИМЕР С ИСПОЛЬЗОВАНИЕМ СТЕКА
;-
MOV R5,-(SP) ;СОХРАНЯЕМ R5
MOV #1,-(SP) ;ПОМЕЩАЕМ В СТЕК АРГУМЕНТ #1
MOV #2,-(SP) ;...#2
MOV #3,-(SP) ;...#3
MOV #MARK+3,-(SP) ;ПОМЕЩАЕМ В СТЕК КОМАНДУ MARK
MOV SP,R5 ;УСТАНАВЛИВАЕМ ЕЕ АДРЕС ДЛЯ RTS
CALL SUBR ;ВЫЗЫВАЕМ ПОДПРОГРАММУ
MOV #VSP2,R0 ;ПЕРЕВОДИМ SP В ASCII
MOV SP,R1 ;
MOV PC,R2 ;
CALL $CBOMG ;
.PRINT #LEAVE ;ПЕЧАТАЕМ СООБЩЕНИЕ ВЫХОДА
.EXIT ;ВЫХОД В СИСТЕМУ
SUBR: .PRINT #ENTER ;ПЕЧАТАЕМ СООБЩЕНИЕ ВЫХОДА
RTS R5 ;ВОЗВРАТ И ВОССТАНОВЛЕНИЕ СТЕКА
R5VAL: .ASCII /R5=/
VR5: .ASCII /XXXXXX, SP=/
VSP: .ASCII /XXXXXX, #RSTRT=/
VRS: .ASCIZ /XXXXXX/
ENTER: .ASCIZ /SUBROUTINE ENTERED/
LEAVE: .ASCII /SUBROUTINE LEAVED WITH SP=/
VSP2: .ASCIZ /XXXXXX/
.END START
.EX MARK
R5=123456, SP=001020, #RSTRT=001020
SUBROUTINE ENTERED
SUBROUTINE LEAVED WITH SP=001020
.
Код:.LIN MARK/ID
.RU MARK !SPLIT I/D SPACE PROGRAM
?MON-F-Trap to 4 001010
.
Очень даже приемлимо. Никто не мешает создать буфер "под стек" как в примере и помещать в нужное место команду BR перед тестированием, а то и заполнить его весь командами с таким расчетом чтобы проверять точность перехода :)
По умолчанию в RT-11 стек устанавливается на 1000 и до 500 (чуть больше чем 500 на самом деле - 476 уже область векторов в RT-11) его безопасно можно понижать.
Кстати, судя по вашему примеру, системе при выходе из программы все равно, что вы установили стек в другое место и не вернули его?
Ничего не будет. Зачем мне в конце программы балласт в виде лишнего буфера? В конце концов тест может вырасти до таких размеров, что не будет умещаться в память (как уже было с тестом скорости). Так что буферами лишними я разбрасываться не хочу.
А ставить буфер на место стека - это фактически то, что я сейчас и делаю, но извращеннее)
Я предложил другой вариант - использовать существующий стек под буфер - это все-равно будет по количеству команд короче чем пример с загонкой в стек :)
При том можно тест выполнять так, чтобы после выполнения MARK стек оставался на том же месте всегда...
А что касается размера теста - в крайнем случае его можно порезать на оверлеи - зачем все тесты одновременно в пямяти хранить? :)
---------- Post added at 11:43 ---------- Previous post was at 11:40 ----------
Иными словами - тест MARK без вызова подпрограммы :)
---------- Post added at 13:04 ---------- Previous post was at 11:43 ----------
Кстати все спросить забываю... Не придумалось ли надежных способов точно идентифицировать ВМ1 и ВМ2 процессор? С ВМ3 все просто...