[Assembler no Delphi] Uso de quot;jzquot; e quot;jequot;
Tenho um código que num dado momento executa as seguintes instruções:
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:
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?
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
Curtidas 0
Respostas
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é+
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
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.
- 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
10/05/2004
Muito obrigado Paulo_Amorim e Beppe!
Agora vou pesquisar mais um pouco sobre as flags...
Agora vou pesquisar mais um pouco sobre as flags...
GOSTEI 0
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.
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
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
10/05/2004
Ajudando mais um pouc:
JZ - pula se o flag de ZERO está setado ;
JE - pula se AX for IGUAL a BX;
JZ - pula se o flag de ZERO está setado ;
JE - pula se AX for IGUAL a BX;
GOSTEI 0
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
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.
Uma delas é mais rapida do que a outra em termos de clock.
GOSTEI 0
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
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
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!
Valeu!
GOSTEI 0