Это общеизвестный и распространённый приём. Он экономит ОЗУ и удобен, т.к при наборе не надо искать место где-бы втиснуть текстовую строчку. Я так делаю уже более 20 лет. Только я использую RST 18H. Заимствовал из ROM-BIOS ГДР-овских компьютеров (а также и другие RST). Эти RST встроены во все мои ДОС (блок RST кидается на адрес 8 при WARM BOOT DOS), т.к в большинстве ДОС на КР580/Z80 ZERO-page именно для этого и резервирована. Также встречал этот приём при дизассемблировании многих известных CP/M-программ. Этот приём также использован в многих программах известного программиста для ОРИОНА В.Сугоняко. Привожу вариант, как это встречается во многих фирменных CP/M-программах в варианте для CP/M уже не просто в дизассемблированном виде, а в том виде как это было в исходниках (т.е реконструкция). Хотя RST гораздо выгоднее. Использование макро порождает иногда довольно глупый код, например CALL, а затем RET. Хотя (т.к мы не на 80x86) на 8-ми разрядках просто ставят JMP вместо CALL и последующего RET.
Если используется вариант CALL, то это затрудняет дизассемблирование не только неопытным, а всем (я так понимаю, что мерзкое слово нуб означает неопытный). Если использовать RST 18H, то это по крайней мере сразу обнаруживается (а если дизассемблер позволяет, то это можно даже автоматизировать).Код:. fmssg EQU 9 CPM MACRO PARAM LD C,PARAM CALL 5 ENDM MSSG MACRO PARAM LOCAL M1 CALL M1 defb PARAM defb '$' M1: POP DE CPM fmssg ENDM CRMSSG MACRO PARAM LOCAL M1 CALL M1 defb 13,10 defb PARAM defb '$' M1: POP DE CPM fmssg ENDM Пример использования в тексте: CRMSSG 'Здравствуйте Denn !'
файл RST.INC
Код:. ; портит ячейки 8...40H BEGRST: ;INPUT: PUSH HL ; RST 8 ;1 PUSH DE ;1 PUSH BC ;1 CALL CONST ;3 JR @INPUT ;2 ;SCOUTA: JP SCOUTA ; RST 10H ; 3 TXTOU1: CALL SCOUTA ; 3 JR TXLOOP ; 2 ;TXTOUT: EX (SP),HL ; RST 18H ; 1 TXLOOP: LD A,(HL) ; 1 INC HL ; 1 OR A ; 1 JR NZ,TXTOU1 ; 2 EX (SP),HL ; 1 RET ; 1 ;STATUS: PUSH HL ; RST 20H ; 1 PUSH DE ; 1 PUSH BC ; 1 CALL CONST ; 3 JR POP_RG ; 2 ;RDKBRD: JP YF81B ; RST 28H ; 3 DS 1 ; 1 POP_RG: POP BC ; 1 POP DE ; 1 POP HL ; 1 RET ; 1 ;CONIN: PUSH HL ; RST 30H ; 1 PUSH DE ; 1 PUSH BC ; 1 CALL CONIN ; 3 JR POP_RG ; 2 JP CCP ; RST 38H @INPUT: OR A CALL NZ,CONIN JR POP_RG RSTLEN EQU $-BEGRST @ENRST EQU 8+RSTLEN[свернуть]
Этот файл кидается командой LDIR на адрес 8 в DOS, а также вообще в любых программах. После чего доступны вызовы по RST. Я RST не придумывал (не конкретно код, а назначание конкретных RST), а заимствовал, отчего получил совместимость. Есть вариант блока RST и для КР580 (но он более громоздкий, менее удобен для иллюстрации). Здесь посмотрите на RST 18H.
Думаю, что такой приём передачи параметров удобен для передачи параметров в ЯВУ для процессоров у которых хреново со стеком (в частности, 6502 и 6800, про другие подобные CPU просто не знаю). Отчего, наверное, трудно делать компиляторы ЯВУ в которых данные передаются через стек.




Ответить с цитированием