Sobre a instrução test... #27
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
A instrução
testem assembly x86-64 afeta a flagSF(Sign Flag) de maneira direta, baseando-se no resultado da operação lógica que ela executa.Para entender o processo, vamos detalhar o que a instrução
testfaz.O que a instrução
testfaz?A instrução
testexecuta uma operaçãoANDlógica bit a bit entre dois operandos (por exemplo,test rax, rbx). O resultado dessa operaçãoANDnão é armazenado em nenhum dos operandos. O único propósito da instruçãotesté definir as flags de status (SF,ZF,PF) de acordo com o resultado dessa operação lógica.Como a
SF(Sign Flag) é afetada?A
SF(Sign Flag) é uma das flags de status no registradorRFLAGS. Sua função é indicar o sinal do resultado de uma operação aritmética ou lógica.SFé uma cópia do bit mais significativo (MSB) do resultado.SFserá definida como 1 (indicando um número negativo em notação de complemento de dois).SFserá definida como 0 (indicando um número positivo).Portanto, a instrução
testafeta aSFda seguinte forma:Exemplos Práticos
Vamos ver como isso funciona com exemplos em 64 bits. O bit mais significativo em um registrador de 64 bits é o bit 63.
Exemplo 1: Resultado Positivo (SF = 0)
Vamos testar um número positivo.
rax=0x7000000000000000(um número positivo, pois o bit 63 é 0)rbx=0xFFFFFFFFFFFFFFFF(todos os bits são 1)AND:0x7000... AND 0xFFFF...resulta em0x7000....0x7000000000000000.SFserá definida como 0.Exemplo 2: Resultado Negativo (SF = 1)
Agora, vamos testar um número negativo.
rax=0x9000000000000000(um número negativo, pois o bit 63 é 1)rbx=0xFFFFFFFFFFFFFFFFAND:0x9000... AND 0xFFFF...resulta em0x9000....0x9000000000000000.SFserá definida como 1.Exemplo 3: Uso Comum - Testando o sinal de um único valor
Um uso muito comum da instrução
testé verificar se um número é positivo, negativo ou zero, testando o registrador contra ele mesmo.AND:rax AND raxsempre resulta no próprio valor derax.rax.raxfor negativo (ex:0x8...), o resultado terá o bit de sinal 1, e aSFserá 1.raxfor positivo (ex:0x7...), o resultado terá o bit de sinal 0, e aSFserá 0.raxfor zero, o resultado será zero, e aZF(Zero Flag) será 1.Após a instrução
test rax, rax, você pode usar instruções de salto condicional como:js(Jump if Sign): Salta seSFfor 1 (número negativo).jns(Jump if Not Sign): Salta seSFfor 0 (número positivo ou zero).jz(Jump if Zero): Salta seZFfor 1 (número é zero).Resumo
SFtest op1, op2resultado = op1 AND op2SFrecebe o valor do bit mais significativo doresultado