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
test
em 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
test
faz.O que a instrução
test
faz?A instrução
test
executa uma operaçãoAND
lógica bit a bit entre dois operandos (por exemplo,test rax, rbx
). O resultado dessa operaçãoAND
nã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.SF
será definida como 1 (indicando um número negativo em notação de complemento de dois).SF
será definida como 0 (indicando um número positivo).Portanto, a instrução
test
afeta aSF
da 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
.SF
será 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
=0xFFFFFFFFFFFFFFFF
AND
:0x9000... AND 0xFFFF...
resulta em0x9000...
.0x9000000000000000
.SF
será 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 rax
sempre resulta no próprio valor derax
.rax
.rax
for negativo (ex:0x8...
), o resultado terá o bit de sinal 1, e aSF
será 1.rax
for positivo (ex:0x7...
), o resultado terá o bit de sinal 0, e aSF
será 0.rax
for 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 seSF
for 1 (número negativo).jns
(Jump if Not Sign): Salta seSF
for 0 (número positivo ou zero).jz
(Jump if Zero): Salta seZF
for 1 (número é zero).Resumo
SF
test op1, op2
resultado = op1 AND op2
SF
recebe o valor do bit mais significativo doresultado