Pergunta

Primeiro um pouco de fundo. A CPU Z80 tem uma instrução chamada DJNZ que pode ser usado de maneira semelhante a um for ciclo. Basicamente, o DJNZ diminui o registro B e salta para um rótulo, se não zero. Por exemplo:

    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 

É claro que você pode fazer a mesma coisa usando instruções regulares de comparação e salto, mas geralmente é útil usar a instrução única.

Com isso fora do caminho, minha pergunta é: outras arquiteturas da CPU incluem uma instrução de controle semelhante?

Foi útil?

Solução

Essa foi uma instrução bastante comum sobre máquinas daquela época e também ocorre em muitos outros lugares.

E assim por diante

Outras dicas

Atualmente no IA-32 equivalente direto para DJNZ é loopcc (loopz). Lembre -se de que o Z80 e 8086 têm o mesmo antecessor Intel 8080. Então, todas as CPUs X86 herdam diretamente a instrução DJNZ!

IA-32 tem vários REP* Instruções que usam CX como seu contador

PowerPC tem bdnz e um registro de contagem especial ctr. Decrementando ctr e ramificação condicionalmente é independente do teste de condição real, para que você possa adicionar uma condição em cima bdnz, por exemplo bdnzlt cr5, label (se a memória servir) verificará se o bit menos do que armazenado no CR5 e e ou ou aquilo com a condição de ctr tornando -se 0.

Ironicamente, ctr também é usado para armazenar qualquer destino de chamada de função indireta. Portanto, é possível codificar a instrução "decremento ctr e ramificar seu novo valor, se não zero ", mas isso é especificamente proibido. (Não verificaria um ponteiro nulo de qualquer maneira.) Um pouco significativamente, bdnz torna -se bastante inútil em um loop com uma chamada indireta.

Alguns microcontroladores PIC, como o PIC18, possuem uma instrução DECFSZ (arquivo de decrementar e pular se zero). Costumo colocar um DECFSZ seguido de ramo.

Existem computadores de conjunto de instruções únicos, que realmente não são usados. Mas uma das máquinas de conjunto de instruções únicas é o "subtrair e ramificar se menor ou igual a zero" (subleq) máquina. Wikipedia tem mais sobre isso

Não estou ciente de nenhuma outra máquina real que tenha uma instrução exatamente assim. Eu gosto de máquinas RISC e também não vejo necessidade disso.

O PDP-11 (por volta de 1970) antecedeu o Z-80 por cerca de 5 anos, e pelo menos alguns modelos (embora provavelmente não os primeiros) tivessem um Subtraia um e ramo instrução:

sob R, offset

No x86, há a instrução de loop que faz exatamente a mesma coisa (com contador no ECX). Há também a instrução JECXZ (salto se o ECX for zero), que deve ser usado junto com o loop - você o coloca antes do loop para poder pular todo o loop se a contagem for zero no início.

Assim:

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

Mas observe que essas instruções são terrivelmente ineficientes nas CPUs contemporâneas. É muito melhor usar instruções regulares de CMP/Sub e JCC. Em uma nota lateral - as CPUs Intel Core2 são realmente capazes de tratar um par de instruções de comparação+salto como se fosse uma única instrução - elas chamam de "fusão macro -op".

O Z80 era um processador CISC. DJNZ é um exemplo clássico de uma instrução complexa. A moda moderna é para os conjuntos de instruções RISC que preferem instruções menores, mais simples e rápidas, mas podem processá -las mais rapidamente - especialmente com recursos avançados de pipelining. Eu não acho que você obtenha algo assim na família ARM, por exemplo.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top