Эквиваленты Z80 DJNZ инструкции по другим архитектурам? - PullRequest
3 голосов
/ 22 февраля 2010

Сначала немного фона. ЦП 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 

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

В связи с этим мой вопрос таков: есть ли в других архитектурах ЦП аналогичная инструкция управления?

Ответы [ 9 ]

6 голосов
/ 22 февраля 2010

Фактически в IA-32 прямой эквивалент для DJNZ - LOOPcc (LOOPZ). Помните, что у Z80 и 8086 один и тот же предшественник Intel 8080 . Таким образом, все процессоры x86 напрямую наследуют инструкции DJNZ!

3 голосов
/ 22 февраля 2010

IA-32 имеет различные REP* инструкции, которые используют CX в качестве счетчика

2 голосов
/ 17 декабря 2012

Некоторые микроконтроллеры PIC, такие как PIC18, имеют инструкцию DECFSZ (Decrement File и Skip if Zero). Я часто ставлю DECFSZ с последующей веткой.

2 голосов
/ 22 февраля 2010

PowerPC имеет bdnz и специальный регистр обратного отсчета ctr. Уменьшение ctr и условное ветвление не зависят от фактического теста условий, поэтому вы можете добавить условие поверх bdnz, например, bdnzlt cr5, label (если память служит) проверит, хранится ли младший бит в cr5, и И или ИЛИ что с условием ctr становится 0.

Как ни странно, ctr также используется для хранения любого косвенного назначения вызова функции. Таким образом, можно закодировать инструкцию «декремент ctr и перейти к ее новому значению, если не к нулю», но это специально запрещено. (В любом случае он не будет проверять NULL-указатель.) Довольно существенно, что bdnz становится довольно бесполезным в цикле с косвенным вызовом.

2 голосов
/ 22 февраля 2010

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

и т. Д.

1 голос
/ 15 марта 2010

На x86 есть инструкция LOOP, которая делает то же самое (со счетчиком в ECX). Существует также инструкция JECXZ (переход, если ECX равен нулю), которая предназначена для использования вместе с LOOP - вы помещаете ее ПЕРЕД циклом, чтобы можно было пропустить весь цикл, если в начале счетчик был нулевым.

Как это:

  ;number of iterations in ECX
  JECXZ end
start:
  ;loop body
  LOOP start
end:

Но обратите внимание, что эти инструкции ужасно неэффективны на современных процессорах. Гораздо лучше использовать обычные инструкции CMP / SUB и Jcc. Напомним, что процессоры Intel Core2 на самом деле способны обрабатывать пару команд сравнения + перехода, как если бы это была одна инструкция - они называют это «макрооперацией».

1 голос
/ 22 февраля 2010

PDP-11 (около 1970 г.) предшествовал Z-80 примерно на 5 лет, и, по крайней мере, некоторые модели (хотя, возможно, и не ранние) имели инструкцию вычитать одну ветвь :

sob R, offset
1 голос
/ 22 февраля 2010

Существуют компьютеры с одним набором команд, которые фактически не используются. Но одна из машин с одним набором команд - это машина "вычитания и ветвления, если она меньше или равна нулю" (subleq). В Википедии больше об этом

Я не знаю ни о каких других реальных машинах, у которых есть инструкция, точно такая же, как эта. Мне нравятся машины RISC, и я действительно не вижу в этом необходимости.

0 голосов
/ 27 февраля 2010

Z80 был процессором CISC. DJNZ - классический пример сложной инструкции. Современная мода направлена ​​на наборы команд RISC, которые предпочитают меньшие, более простые и быстрые инструкции, но могут обрабатывать их быстрее - особенно с расширенными функциями конвейерной обработки. Я не думаю, что вы получаете что-то подобное в семье ARM, например.

...