Diferença entre “ou eax, eax” e “test eax, eax” [duplicado]
Esta pergunta já tem uma resposta aqui:
Teste se um registro é zero com CMP reg, 0 vs OR reg, reg? 2 respostasQual é a diferença entreor eax,eax
etest eax,eax
? Eu já vi compiladores diferentes produzirem para a mesma comparação e, no que diz respeito à documentação, eles fazem exatamente a mesma coisa, por isso estou me perguntando por que nem todos usamtest eax,eax
. A pensar nissoand eax,eax
definiria os sinalizadores de maneira idêntica, mas eu não o vi em freepascal, delphi ou msVC +
Eu compilei alguns blocos asm no delphi e verifiquei a fonte do assembler e todos os três formulários têm exatamente o mesmo comprimento em opcodes e também verifiquei o PDF do desempenho da intel e diz que eles têm a mesma latência e taxa de transferênci
Editar
A pergunta é especificamente sobre a diferença entre os casos específicostest eax,eax
, or eax,eax
eand eax,eax
. Todos os três fornecem resultados completamente idênticos para registros, sinalizadores, comprimento do código de operação, latência e taxa de transferência. E ainda para testar se 0, se não for zero ou se for assinado, alguns compiladores usarãotest eax,eax
enquanto alguns usamor eax,eax
, e eu queria saber por que eles não estão todos usandotest eax,eax
, pois torna o código um pouco mais clar
Edit2:
Para referência, estou em casa e só tenho o msvc ++ e o Delphi mais antigos aqui, mas testando uma variável se zero, o msvc ++ faztest eax,eax
, enquanto Delphi fazor eax,eax
.