|
Маленькие хитрости - Нюанс в использовании команд переброски.
|
Нюанс в использовании команд переброски
Н.Новгород, 1995.
Сообщаю один интересный фактик . Команды блоковых операций микропроцессора Z80 (LDIR, LDDR, CPIR, CPDR и им подобные) считы-ваются процессором из памяти в каждом цикле выполнения, то есть так же, как и простые команды. Пример:
8000 210070 LD HL,#7000 8003 110170 LD DE,#7001 8006 01FF8F LD BC,#8FFF 8009 75 LD (HL),L
800A EDBO LDIR 800C C9 RET
Если при вызове этой программы стек установлен ниже #7000 или выше #9000, то по команде RANDO
MIZE USR 32768 выполнится очистка памяти не по адресам #8000-#FFFF, а всего лишь #7000-#800А.
Это происходит потому, что N раз процессор считывает из памяти код команды LDIR (#ED #В0), И последний раз - #00 #В0 (то есть NOP и OR В, которые и выполняет), а затем - команду RET.
При этом возникает огромное поле для экспериментов на тему защиты, ''извращенных" методов переброски блоков, когда блок при переброске накладывается на уже переброшенную свою часть, которая модифицировала команду LDIR (LDDR), заменив ее, например, на LDDR (LDIR) или на какой-нибудь ЭР (например #18 #В0).
Примечание: к сожалению, не было возможности проверить этот факт на советских аналогах Z80.
|