Эквиваленты инструкции Z80 DJNZ на других архитектурах?
-
22-09-2019 - |
Вопрос
Сначала небольшая предыстория.Процессор z80 имеет инструкцию, называемую DJNZ ( ДЖНЗ ) который может быть использован аналогичным образом в качестве for
петля.По сути, DJNZ уменьшает регистр B и переходит к метке, если она не равна нулю.Например:
ld b,96 ; erase all of the line
disp_version_erase_loop:
call _vputblank ; erase pixels at cursor (uses b reg)
djnz disp_version_erase_loop ; loop
Конечно, вы можете сделать то же самое, используя обычные инструкции по сравнению и переходу, но часто бывает удобно использовать одну инструкцию.
Учитывая это, мой вопрос заключается в том, включают ли другие архитектуры процессоров аналогичную инструкцию управления?
Решение
Это была довольно распространенная инструкция на машинах той эпохи, которая встречается и во многих других местах.
- Corewar поддерживает это с помощью инструкции DJN с режимом адресации с предварительным уменьшением.
- Аналогично m68k поддерживает BNE с режимом адресации с предварительным уменьшением.
- Минималистский PDP-8 имеет аналогичную инструкцию
ISZ - увеличить операнд и пропустить, если результат равен нулю.
И так далее
Другие советы
На самом деле в IA-32 прямым эквивалентом DJNZ является LOOPcc (LOOPZ).Помните, что Z80 и 8086 имеют одного и того же предшественника Процессор Intel 8080.Таким образом, все процессоры x86 напрямую наследуют инструкцию DJNZ!
IA-32 имеет различные REP*
инструкции, которые используют CX в качестве своего счетчика
PowerPC имеет bdnz
и специальный регистр обратного отсчета ctr
.Уменьшающийся ctr
и условное ветвление не зависит от фактического теста условий, поэтому вы можете добавить условие поверх bdnz
, например bdnzlt cr5, label
(если память не изменяет) проверит, сохранен ли бит меньше, чем в cr5, и либо И, либо или что с условием ctr
становление 0.
По иронии судьбы, ctr
также используется для хранения любого назначения косвенного вызова функции.Таким образом, можно закодировать инструкцию "decrement ctr
и переходите к его новому значению, если оно не равно нулю", но это специально запрещено.(В любом случае, он не будет проверять наличие нулевого указателя.) Несколько значительно, bdnz
становится довольно бесполезным в цикле с косвенным вызовом.
Некоторые микроконтроллеры PIC, такие как PIC18, имеют инструкцию DECFSZ (Уменьшать размер файла и пропускать, если он равен нулю).Я часто ставил DECFSZ, за которым следует branch .
Существуют компьютеры с одним набором команд, которые на самом деле не используются.Но одна из машин с одним набором команд - это "вычесть и разветвлять, если меньше или равно нулю" (subleq
) машина. В Википедии есть больше информации по этому поводу
Однако я не знаю ни о каких других реальных машинах, у которых есть точно такая инструкция.Мне нравятся RISC-машины, и на самом деле я тоже не вижу в этом необходимости.
PDP-11 (около 1970 года) предшествовал Z-80 примерно на 5 лет, и, по крайней мере, некоторые модели (хотя, вероятно, не самые ранние) имели вычтите единицу и разветвляйте инструкция:
sob R, offset
На x86 есть инструкция ЦИКЛА, которая делает точно то же самое (со счетчиком в ECX).Существует также инструкция JECXZ (Перейти, если ECX равно нулю), которая предназначена для использования вместе с циклом - вы помещаете ее ПЕРЕД циклом, чтобы вы могли пропустить весь цикл, если в начале счетчик был равен нулю.
Вот так:
;number of iterations in ECX
JECXZ end
start:
;loop body
LOOP start
end:
Но обратите внимание, что эти инструкции ужасно неэффективны на современных процессорах.Гораздо лучше использовать обычные инструкции CMP / SUB и Jcc.На заметку - процессоры Intel Core2 на самом деле способны обрабатывать пару команд compare + jump, как если бы это была одна инструкция - они называют это "macro-op fusion".
Z80 был процессором CISC.DJNZ - это классический пример сложной инструкции.Современная мода направлена на наборы команд RISC, которые предпочитают меньшие, более простые и быстрые инструкции, но могут обрабатывать их быстрее - особенно с расширенными возможностями конвейерной обработки.Я не думаю, что вы получите что-то подобное, например, в семействе ARM.