Эквиваленты инструкции Z80 DJNZ на других архитектурах?

StackOverflow https://stackoverflow.com/questions/2308608

  •  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 

Конечно, вы можете сделать то же самое, используя обычные инструкции по сравнению и переходу, но часто бывает удобно использовать одну инструкцию.

Учитывая это, мой вопрос заключается в том, включают ли другие архитектуры процессоров аналогичную инструкцию управления?

Это было полезно?

Решение

Это была довольно распространенная инструкция на машинах той эпохи, которая встречается и во многих других местах.

И так далее

Другие советы

На самом деле в 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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top