Testando se um registro se iguala no IA32
-
25-09-2019 - |
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?
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
.