Важная информация

User Tag List

Страница 1 из 3 123 ПоследняяПоследняя
Показано с 1 по 10 из 25

Тема: Чья фишка? (приём программирования)

  1. #1
    Guru Аватар для Denn
    Регистрация
    04.05.2006
    Адрес
    St.-Petersburg
    Сообщений
    2,220
    Спасибо Благодарностей отдано 
    473
    Спасибо Благодарностей получено 
    899
    Поблагодарили
    591 сообщений
    Mentioned
    6 Post(s)
    Tagged
    0 Thread(s)

    Question Чья фишка? (приём программирования)

    Намедни дизассемблировал одну программу нашего соотечественника, столкнулся с интересным приёмом написания кода. А именно, поочерёдное перемежение кода и текстовых сообщений, причём без какой-либо явной адресации. Выглядит это следующим образом:

    Код:
    <код программы>
    CALL PR_MSG
    <текстовое сообщение #1/0>
    <код программы>
    CALL PR_MSG
    <текстовое сообщение #2/0>
    <код программы>
    ...и т.д.
    
    PR_MSG:
    ; п/п вывода сообщения
    ; вход: [PC]-адрес начала сообщения
    ; выход: [PC]-адрес начала кода продолжения программы
    POP H
    CALL 0F818H; п/п монитора вывода сообщения по [HL]
    PUSH H
    RET
    Чем примечательно. Для нубов затрудняет дизассемблирование - куски кода и текстов не имеют меток, на них нет никаких ссылок где-либо в коде. Передача и возврат параметров через регистровую пару [PC] (просто необычно, нетипично и прикольно).

    Интересно, это фишка конкретно человека писавшего прогу, или это общеизвестный (читай - сдёрнутый с западных кодеров) приём, а я просто не в курсе?
    Последний раз редактировалось Denn; 27.07.2017 в 17:01.
    Критиковать - значит объяснять автору, что он делает не так, как делал бы я, если бы умел

  2. #1
    С любовью к вам, Yandex.Direct
    Размещение рекламы на форуме способствует его дальнейшему развитию

  3. #2
    Guru Аватар для bigral
    Регистрация
    12.07.2006
    Адрес
    г. Киев, Украина
    Сообщений
    2,147
    Спасибо Благодарностей отдано 
    25
    Спасибо Благодарностей получено 
    95
    Поблагодарили
    82 сообщений
    Mentioned
    2 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Это стандартный прием для систем с общим адресным пространством кода и данных. Так называемый ON ERROR GOTO. Обычно так оформляют обработчики ошибок которым неважно состояние регистров (контекст) все входные данные захардкоженны прямо после этого CALL, в том числе и адрес дальнейшего выполнения программы после отработки обработчика. Только уважателей структурного программирования такие куски ставят в ступор. Бывают еще фукции с многими точками входа, co-routines, код неиспользующий стек, код оформленный только в виде обработчиков прерываний, код действие которого заключается в создании нужной последовательности сигналов на шине адреса\данных а не манипуляции регистрами I/O и т.д. и т.п.

  4. #3
    Guru Аватар для Denn
    Регистрация
    04.05.2006
    Адрес
    St.-Petersburg
    Сообщений
    2,220
    Спасибо Благодарностей отдано 
    473
    Спасибо Благодарностей получено 
    899
    Поблагодарили
    591 сообщений
    Mentioned
    6 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от bigral Посмотреть сообщение
    Это стандартный прием для систем с общим адресным пространством кода и данных.
    В общем-то, все наши (и не очень) восьмибитки таковыми системами и являются. Однако я впервые встречаю такой приём! А дизассемблировал я всякого немало.

    - - - Добавлено - - -

    Кстати, конструкцию:

    Код:
    PUSH H
    RET
    я бы заменил на простое:

    Код:
    PCHL
    Тут явно делали "для красоты"
    Критиковать - значит объяснять автору, что он делает не так, как делал бы я, если бы умел

  5. #4
    Banned
    Регистрация
    05.10.2016
    Адрес
    г. Санкт-Петербург
    Сообщений
    1,080
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    5
    Поблагодарили
    5 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Это общеизвестный и распространённый приём. Он экономит ОЗУ и удобен, т.к при наборе не надо искать место где-бы втиснуть текстовую строчку. Я так делаю уже более 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.

    Код:
    .
    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 !'
    Если используется вариант CALL, то это затрудняет дизассемблирование не только неопытным, а всем (я так понимаю, что мерзкое слово нуб означает неопытный). Если использовать RST 18H, то это по крайней мере сразу обнаруживается (а если дизассемблер позволяет, то это можно даже автоматизировать).

    файл 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 просто не знаю). Отчего, наверное, трудно делать компиляторы ЯВУ в которых данные передаются через стек.
    Последний раз редактировалось barsik; 27.07.2017 в 19:15.

  6. #5
    Guru Аватар для Denn
    Регистрация
    04.05.2006
    Адрес
    St.-Petersburg
    Сообщений
    2,220
    Спасибо Благодарностей отдано 
    473
    Спасибо Благодарностей получено 
    899
    Поблагодарили
    591 сообщений
    Mentioned
    6 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от barsik Посмотреть сообщение
    Это общеизвестный и распространённый приём. Он экономит ОЗУ...
    Отлично, я это и хотел узнать. Спасибо


    Цитата Сообщение от barsik Посмотреть сообщение
    Этот приём также использован в многих программах известного программиста для ОРИОНА В.Сугоняко.
    Можно пример? В его ORDOS-программах я такого не встречал.
    Критиковать - значит объяснять автору, что он делает не так, как делал бы я, если бы умел

  7. #6
    Guru Аватар для HardWareMan
    Регистрация
    26.02.2011
    Адрес
    г. Павлодар, Казахстан
    Сообщений
    4,395
    Спасибо Благодарностей отдано 
    304
    Спасибо Благодарностей получено 
    594
    Поблагодарили
    440 сообщений
    Mentioned
    10 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Denn, подсмотрел в 89м году в дизасме ED^7000 для Специалиста (дизасм делал сам, Микроном, на кружке). Использую тоже часто. По вышеуказанным причинам. Я использую XTHL перед кодом и перед RET, потому как она автоматически заменяет пару PUSH H / POP H.
    Код:
    ; Печать сообщение до 00h из [SP]
    Print_LCD_SP:  xthl                 ; Берем адрес в [SP]
                   push psw             ; Сохраняем [A]
    Print_LCD_SPL: mov  a,m             ; Берем символ
                   inx  h               ; Следующий символ
                   cpi  00h             ; Уже все?
                   jz   Print_LCD_SPE   ; Да - выход
                   call Print_LCD_Sym   ; Печатаем символ
                   jmp  Print_LCD_SPL   ; Крутимся
    Print_LCD_SPE: pop  psw             ; Восстанавливаем [A]
                   xthl                 ; Возвращаем адрес в [SP]
                   ret                  ; Выходим
    Последний раз редактировалось HardWareMan; 27.07.2017 в 17:59.

  8. #7
    Guru Аватар для Denn
    Регистрация
    04.05.2006
    Адрес
    St.-Petersburg
    Сообщений
    2,220
    Спасибо Благодарностей отдано 
    473
    Спасибо Благодарностей получено 
    899
    Поблагодарили
    591 сообщений
    Mentioned
    6 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    HardWareMan, тоже вариант. Только CPI 00h очень режет глаза
    Критиковать - значит объяснять автору, что он делает не так, как делал бы я, если бы умел

  9. #8
    Guru Аватар для HardWareMan
    Регистрация
    26.02.2011
    Адрес
    г. Павлодар, Казахстан
    Сообщений
    4,395
    Спасибо Благодарностей отдано 
    304
    Спасибо Благодарностей получено 
    594
    Поблагодарили
    440 сообщений
    Mentioned
    10 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Denn Посмотреть сообщение
    HardWareMan, тоже вариант. Только CPI 00h очень режет глаза
    Код не претендует на идеальность. Он работает, печатает до 0 (часто используется даже в С), для DOS обычно используется символ '$' (0x24). Замени CPI 00h на CPI 24h и будет как в DOS.

    PS А, понял, если до 0 то можно же ORA A. Ну да, можно выкинуть байт.
    Последний раз редактировалось HardWareMan; 27.07.2017 в 18:14.

  10. #9
    Banned
    Регистрация
    05.10.2016
    Адрес
    г. Санкт-Петербург
    Сообщений
    1,080
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    5
    Поблагодарили
    5 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Denn
    Можно пример? В его ORDOS-программах я такого не встречал
    Например, это есть в программах BRU.COM и BRU4.COM для CP/M в банке 0 (т.е на 48К). Прилагаю исходник оригинала BRU4 и ORD5. ORD5 это незаконченная попытка доработки, чтобы ввести туда окна без использования оконного драйвера.

    Несколько слов о именах и расширениях. Как все знают в ORIONSOFT использовали странное расширение BRU, тогда как все остальные использовали логичное расширение ORD. Естественно, ORD и BRU устроены одинаково (ORDOS метка файла в 16 байт прилеплена в начале файла, что необходимо, чтобы сохранить адреса загрузки и длину). В начале исходника BRU4 есть переменные EX1 EX2 EX3. Они задают 3 буквы O R D или B R U (а в ORD5 есть ключ ORD, его поставьте 0 или не 0, это быстрее, чем менять буквы). Как поставите, с такими файлами и будет работать. И соответственно тогда и имя сделайте ORD4/5 или BRU4/5.

    Там же, чтобы можно было посмотреть, в архиве есть CP/M для банки 0, которая работает без НГМД (VDISK из излишнего ОЗУ банок 2 и 3 (а может и 2...7, не помню). Т.е она может быть использует ОЗУ более чем 256К и заработает только, если есть ОЗУ 512К, но может быть использует только банки 2 и 3. Я после это проверю, и если надо, найду ДОС для банки 0 и ОЗУ 256К.

    Так вот с помощью этой RAM-CP/M можно увидеть эти программы (т.к она без драйвера, аналог CP/M-48К ОРИОНСОФТ). Транслируется не в COM, а в ORD-формат, чтобы можно было использовать в бездисководной системе. Тогда файлы попадают на эл.диск CP/M автоматически загружаясь из квазидисков ORDOS, для чего в квазидиске 'B' д.быть файл !ZAG. CP/M для банки 0 ищет при старте этот файл, и, если он есть, то все файлы ORDOS перегружаются из квазидисков ORDOS в эл.диск CP/M. Если надо странслировать прямо в COM-файл, то забейте в начале исходника две строчки ORDOS-метки.
    Вложения Вложения
    • Тип файла: rar ORD.rar (59.1 Кб, Просмотров: 50)
    Последний раз редактировалось barsik; 28.07.2017 в 21:30.

  11. #10
    Banned
    Регистрация
    22.05.2011
    Адрес
    г. Дзержинск, Украина
    Сообщений
    6,841
    Спасибо Благодарностей отдано 
    483
    Спасибо Благодарностей получено 
    656
    Поблагодарили
    511 сообщений
    Mentioned
    10 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Denn Посмотреть сообщение
    Однако я впервые встречаю такой приём!
    в Legend of Zelda: Link’s Awakening 93 года для GB используется нечто(сам подход) подобное
    так что большие фирмочки тоже так делают
    Последний раз редактировалось NEO SPECTRUMAN; 27.07.2017 в 19:49.

Страница 1 из 3 123 ПоследняяПоследняя

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Похожие темы

  1. чья это AY композиция?
    от lokky в разделе Музыка
    Ответов: 2
    Последнее: 17.05.2009, 18:49
  2. В чем фишка ?
    от F0lken в разделе Несортированное железо
    Ответов: 9
    Последнее: 17.05.2007, 22:54
  3. [FWD] Фишка
    от Alexey Ivanov (500:95/100) в разделе Зарубежные компьютеры
    Ответов: 2
    Последнее: 04.05.2006, 19:12

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •