[Assembler no Delphi] Uso de quot;jzquot; e quot;jequot;

Delphi

10/05/2004

Tenho um código que num dado momento executa as seguintes instruções:

    dec  ECX
    jnz  @Loop


Mas eu aprendi que os jumps funcionam após a instrução CMP. Então pergunto: Os jumps operam sobre a operação anterior, seja ela qual for, ou é um caso especial para o registrador ECX (contador) :?:

Segunda questão:

em outro código tenho o seguinte:

      cmp  Al, [EDI]
      jz   @Found


trocando-se jz (jump if zero) por je (jump if equal) que pra mim seria o certo (uma vez que o objetivo é ver se os dois são iguais), o resultado é o mesmo. Então qual a diferença? É questão de performance?


Akelle Kara

Akelle Kara

Curtidas 0

Respostas

Paulo_amorim

Paulo_amorim

10/05/2004

Olá

Sobre a primeira questão eu não estou muito certo, mas creio que opera sobre a linha anterior...
Mas d qualquer maneira tenta fazer um teste ue...se funcionar, sinal que ele opera na anterior :D

---------------------------------------
Sobre a segunda, eu aprendi que JZ e JE significa a mesma coisa:
JZ - Jump se a subtração for zero
JE - Jump se os termos forem iguais
Como subtração de termos iguais resulta em 0, da na mesma!

Assim como JBZ (ou JBE nao lembro) = JNA - Jump se for menor ou igual eh a mesma coisa que Jump se nao for maior...

Até+


GOSTEI 0
Beppe

Beppe

10/05/2004

Como dizia nosso amigo Jack o estripador, vamos por partes.

- As instruções de jump não operam sobre a instrução anterior. Operam sobre um conjunto de variáveis do processador, chamados FLAGS, que são modificados quase que exclusivamente pelas instruções aritméticas. Isto é, nem todas as instruções modificam estes FLAGS, e nem todos os FLAGS são modificados pela mesma instrução.

Algumas instruções, com os flags alterados:
INC: N, Z
DEC: N, Z
ADD: N, Z, C, O
SUB: N, Z, C, O
CMP: N, Z, C, O
TEST: N, Z

-JZ e JE são simples mnemômicos diferentes para a mesma instrução. Use um ou outro, conforme a lógica do problema. Existem vários casos assim, por questão de ortogonalidade.


GOSTEI 0
Akelle Kara

Akelle Kara

10/05/2004

Muito obrigado Paulo_Amorim e Beppe!

Agora vou pesquisar mais um pouco sobre as flags...


GOSTEI 0
Beppe

Beppe

10/05/2004

Como é que tá teu inglês? Visita essa página: [url]http://www.intel.com/design/pentium4/manuals/index2.htm[/url]
O volume 1 tem a arquitetura do Pentium(parte exposta somente), os volumes 2A e 2B tem a listagem das instruções do processador.


GOSTEI 0
Akelle Kara

Akelle Kara

10/05/2004

Vlw, mas são uns manuais bem grandinhos... se eu tiver tempo eu leio eles com calma... por enquanto fico com o PC Help (que eu achei recentemente no NumaBoa.com.br), trás muitas instruções, o que elas fazem e as flags que elas alteram, é bem resumido, mas excelente pra iniciantes em assembler como eu.


GOSTEI 0
Kroki

Kroki

10/05/2004

Ajudando mais um pouc:
JZ - pula se o flag de ZERO está setado ;
JE - pula se AX for IGUAL a BX;


GOSTEI 0
Paulo_amorim

Paulo_amorim

10/05/2004

Ajudando mais um pouc: JZ - pula se o flag de ZERO está setado ; JE - pula se AX for IGUAL a BX;


Olá

Mas dá na mesma colocar
CMP AX, BX
JE ...


ou
CMP AX, BX
JZ ...


Então eles só fazem a mesma coisa após um [b:ce3f78f5a8]CMP[/b:ce3f78f5a8]?
Se meu pensamento está correto, isso é porque CMP altera o flag de zero?

Até+


GOSTEI 0
Kroki

Kroki

10/05/2004

Nao estou com o Set de instrucoes agora mas amanha te respondo melhor,Toda Linha em assembler é executado uma por vez e a comparacao foi depois de CMP alterando as Flag.
Uma delas é mais rapida do que a outra em termos de clock.


GOSTEI 0
Cebikyn

Cebikyn

10/05/2004

Não é bem isso não... a descrição de JE e JZ é a mesma:

JE/JZ - Jump Equal / Jump Zero

Usage:  JE  label
        JZ  label
Modifies flags: None


Causes execution to branch to "label" if the Zero Flag is set.Uses
unsigned comparision.

                          Clocks            Size
Operands          808x  286   386   486     Bytes

label:    jump     16   7+m   7+m    3      2-4
          no jump  4     3     3     1



GOSTEI 0
Cebikyn

Cebikyn

10/05/2004

A instrução CMP:

CMP - Compare

Usage:  CMP dest,src
Modifies flags: AF CF OF PF SF ZF

Subtracts source from destination and updates the flags but does
not save result. Flags can subsequently be checked for conditions.

                   Clocks       Size
Operands    808x   286 386 486  Bytes
reg,reg       3     2   2   1   2
mem,reg      9+EA   7   5   2   2-4
reg,mem      9+EA   6   6   2   2-4
reg,immed     4     3   2   1   3-4
mem,immed   10+EA   6   5   2   3-6
accum,immed   4     3   2   1   2-3



GOSTEI 0
Akelle Kara

Akelle Kara

10/05/2004

É, faz sentido isso que o Cebikyn colocou. O CMP subtrai um valor do outro e muda as flags, se forem iguais o resultado será sempre zero (então tanto o JE e o JZ serão ativados).

Valeu!


GOSTEI 0
POSTAR