Pergunta

(IA32) por exemplo,

test $eax, $eax

Por que você gostaria de fazer isso? Isso faz $eax & $eax, certo? não deveria sempre Defina o registro da bandeira para dizer que eles são iguais ..?

termo aditivo:Portanto, o teste definirá o ZF (como mencionado abaixo) se o registro for zero. Então, o teste (como usado acima) é usado principalmente para saber se um registro está vazio? E ZF está definido se sim?

Foi útil?

Solução

Vai definir ZF (o sinalizador zero) se o registro for zero. Provavelmente é isso que é mais comumente usado para testar. Também definirá outras bandeiras adequadamente, mas provavelmente há muito menos uso para elas.

Além disso, devo mencionar isso test Realmente não executa uma comparação - ele tem um desempenho bit -in and Operação (jogando fora o resultado, exceto as bandeiras).

Para realizar uma comparação dos operandos, o cmp a instrução seria usada, que executa um sub Operação, jogando fora os resultados, exceto os sinalizadores. Você está correto que um

cmp $eax, $eax

Não teria muito sentido, pois as bandeiras seriam definidas de acordo com um resultado zero todas as vezes.

Outras dicas

Isso está definindo a bandeira zero, da mesma maneira que o uso or $eax,$eax Também pode ser destrutivamente testar o sinalizador zero.

Ele define as bandeiras Z e S no processador, para que você possa dizer depois de "teste eax, eax" (ou qualquer outro registro 8, 16, 32 e penso em 64 bits) se o valor for zero, ou se o bit de sinal for Definir, usando "JE/JNE/JZ/JNZ" ou "JS/JNS", respectivamente. Em 30 anos de codificação para arquiteturas x80/x86, fiz isso um grande número de vezes, com a maioria das combinações de registro. (Você não usa isso na prática no ESP!)

IIRC, há um bit de paridade que também é calculado; portanto, com esse teste, você pode dizer se o número de bits definido no registro é par ou ímpar, usando "JP/JNP". Eu tenho Nunca tinha um uso para isso.

Esta instrução não deve verificar apenas se o valor de %eax é zero. Pode ser como um todo usado para verificar se o valor %eax é zero ou positivo ou negativo. A maior vantagem de usá -lo dessa maneira é que não modifica o vale de %eax (depois de se apresentar %eax & %eax, ele apenas descarta o valor) e define os sinalizadores de condições da seguinte forma.

Se %eax valor for zero, OF, CF, ZF = 0 (definido como zero)
senão SF = MSB of the result (aqui, o resultado é %eax & %eax). Então, se o número for negativo, obtemos SF = 1, por outro lado SF = 0.

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