2010-02-22 2 views
3

Сначала немного фона. Процессор z80 имеет команду под названием DJNZ, которая может использоваться аналогично циклу for. В принципе DJNZ уменьшает регистр B и переходит на метку, если не равен нулю. Например:Эквиваленты инструкции Z80 DJNZ на другие архитектуры?

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 

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

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

ответ

2

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

И так далее

3

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

1

Там существует единый набор инструкций компьютеров, которые не являются на самом деле используются. Но одной из машин с одним набором команд является «вычитание и ветвление, если оно меньше или равно нулю» (subleq). Wikipedia has more on this

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

+0

Это полезно, потому что проверка счетчика циклов не использует никаких флагов. Не нужно путаться, если флаги используются для чего-то в цикле/в любом случае есть только один набор флагов/управление зависимостями регистра не очень умно (например, чипы POWER могут иметь только 1 переименование для регистра условий). Уменьшение - просто удобный бонус для обычного случая. (Например, у ARM есть бит сравнения и ветвления, если нуль/не нуль.) (MIPS, как альтернативный пример, не имеет регистра флагов. Это другой способ решения этой проблемы.) – 2010-05-03 21:07:01

1

НДП-11 (около 1970), предшествовавших Z-80 около 5 лет, и по крайней мере, некоторые модели (хотя, вероятно, не ранние) имели вычитать-Одно- и ветви инструкции:

sob R, offset 
2

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

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

6

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

0

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

+0

CBZ/CBNZ ? Это половина. Мой ARM немного ржавый, хотя ... это может быть недоступно во всех режимах? – 2010-05-03 21:13:45

1

На x86 есть инструкция LOOP, которая делает то же самое (с счетчиком в ECX). Существует также инструкция JECXZ (Jump if ECX is Zero), которая предназначена для использования вместе с LOOP - вы помещаете ее перед циклом, чтобы вы могли пропустить весь цикл, если в начале отсчет был равен нулю.

Как это:

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

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

2

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

Смежные вопросы