User Tag List

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

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

Комбинированный просмотр

Предыдущее сообщение Предыдущее сообщение   Следующее сообщение Следующее сообщение
  1. #1

    Регистрация
    04.05.2006
    Адрес
    St.-Petersburg
    Сообщений
    2,234
    Спасибо Благодарностей отдано 
    490
    Спасибо Благодарностей получено 
    989
    Поблагодарили
    641 сообщений
    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

    Регистрация
    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

    Регистрация
    04.05.2006
    Адрес
    St.-Petersburg
    Сообщений
    2,234
    Спасибо Благодарностей отдано 
    490
    Спасибо Благодарностей получено 
    989
    Поблагодарили
    641 сообщений
    Mentioned
    6 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

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

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

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

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

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

  5. #4

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

    По умолчанию

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

  6. #5

    Регистрация
    24.07.2008
    Адрес
    г. Курган
    Сообщений
    2,062
    Спасибо Благодарностей отдано 
    10
    Спасибо Благодарностей получено 
    17
    Поблагодарили
    17 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    [QUOTE=Denn;921470]В общем-то, все наши (и не очень) восьмибитки таковыми системами и являются. Однако я впервые встречаю такой приём! А дизассемблировал я всякого немало.
    - - - Добавлено - - -

    Я такое встречал повсеместно, и сам то же так писал.

    Скрытый текст

    Profi 5.06 1024K 12Mhz (кварц на 24), палитра, COM-порт, часы, hdd, covox, программатор
    ZX-Spectrum +3, ZX-Spectrum +2B, ZX-Spectrum +2, ZX Spectrum 48, ZX Spectrum 48+
    ZX Evolution Rev B.
    Color 48 + Beta Disk Interface +FDD+YM2149F
    Орель-08БК
    Pentagon-48 (недоссобранный кем-то)
    Pentagon-128 (полуубитый)
    Кворум-128 (в ремонте)
    Магик-05 (в ремонте)
    Robotron 1715
    Корвет ПК8020 и ПК8010
    Amstrad CPC 464
    Amstrad CPC 6128
    [свернуть]

  7. #6

    Регистрация
    09.03.2017
    Адрес
    г. Троицк
    Сообщений
    609
    Спасибо Благодарностей отдано 
    125
    Спасибо Благодарностей получено 
    64
    Поблагодарили
    48 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от bigral Посмотреть сообщение
    Это стандартный прием для систем с общим адресным пространством кода и данных.
    И не только. На 51-ом нечто подобное часто использовал. И для сообщений, и для табличных преобразований.

  8. #7

    Регистрация
    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.

  9. #8

    Регистрация
    04.05.2006
    Адрес
    St.-Petersburg
    Сообщений
    2,234
    Спасибо Благодарностей отдано 
    490
    Спасибо Благодарностей получено 
    989
    Поблагодарили
    641 сообщений
    Mentioned
    6 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

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


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

  10. #9
    HardWareMan
    Гость

    По умолчанию

    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.

  11. #10

    Регистрация
    04.05.2006
    Адрес
    St.-Petersburg
    Сообщений
    2,234
    Спасибо Благодарностей отдано 
    490
    Спасибо Благодарностей получено 
    989
    Поблагодарили
    641 сообщений
    Mentioned
    6 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

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

Страница 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

Ваши права

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