Buenas!
Hoje vou dar uma dica sobre como trocar valores entre registradores.
Geralmente quando precisamos trocar valores entre registradores usamos um temporario,EX:
Quero trocar os valores entre EAX e EBX:
movl %eax, %ecx
movl %ebx, %eax
movl %ecx, %ebx
Aqui o ECX foi usado para "intermediar" a troca dos valores.
Isso pode ser muito chato e confuso,felizmente existe uma formar de fazer isso sem um terceiro registrador, o XCHG(Exchange).
Vamos la:
#forum.guiadohacker.com.br
.section .text
.globl _start
_start:
nop
movl $100, %ecx
movl $25, %edx
xchg %ecx, %edx
movl $1, %eax
movl $0, %ebx
int $0x80
salve o arquivo como nome-do-arquivo.s . Depois utilize o Assembler(AS) do linux.
as -gstabs -o nomedoarquivo.o nomedoarquivo.s
O -GSTABS adiciona informações para auxiliar o debugger a percorrer o programa.
Depois link o object file com o linker:
ld -o nomedoarquivo nomedoarquivo.o
Esse "programa" não vai fazer nada que seja visível porem vamos utilizar o debugger para ver oque acontece:
gdb -q nomedoarquivo
O -q (quiet) vai ocultar algumas informações pouco relevantes.
Vamos setar um breakpoint no programa para acompanhar o que vai acontecer durante a execução:
break *_start+1
Aqui o breakpoint vai ser "setado" uma linha depois do label _start da section .text.
Digite "run" para iniciar o programa e "next" para percorrer o mesmo.
Repare que no começo ECX = 100 e EDX = 25, para confirmar isso pode digitar "print/d $ECX" onde /d indica um valor decimal(pode ser trocado para /x ou seja: hexadecimal)
Continue com o "next" até a próxima linha após o XCHG e olhe os valores de ECX e EDX.
Surpresa!Eles foram trocados sem usar um terceiro registrador.
Lembrando que usei a sintaxe AT&T e não a INTEL.
Hoje vou dar uma dica sobre como trocar valores entre registradores.
Geralmente quando precisamos trocar valores entre registradores usamos um temporario,EX:
Quero trocar os valores entre EAX e EBX:
movl %eax, %ecx
movl %ebx, %eax
movl %ecx, %ebx
Aqui o ECX foi usado para "intermediar" a troca dos valores.
Isso pode ser muito chato e confuso,felizmente existe uma formar de fazer isso sem um terceiro registrador, o XCHG(Exchange).
Vamos la:
#forum.guiadohacker.com.br
.section .text
.globl _start
_start:
nop
movl $100, %ecx
movl $25, %edx
xchg %ecx, %edx
movl $1, %eax
movl $0, %ebx
int $0x80
salve o arquivo como nome-do-arquivo.s . Depois utilize o Assembler(AS) do linux.
as -gstabs -o nomedoarquivo.o nomedoarquivo.s
O -GSTABS adiciona informações para auxiliar o debugger a percorrer o programa.
Depois link o object file com o linker:
ld -o nomedoarquivo nomedoarquivo.o
Esse "programa" não vai fazer nada que seja visível porem vamos utilizar o debugger para ver oque acontece:
gdb -q nomedoarquivo
O -q (quiet) vai ocultar algumas informações pouco relevantes.
Vamos setar um breakpoint no programa para acompanhar o que vai acontecer durante a execução:
break *_start+1
Aqui o breakpoint vai ser "setado" uma linha depois do label _start da section .text.
Digite "run" para iniciar o programa e "next" para percorrer o mesmo.
Repare que no começo ECX = 100 e EDX = 25, para confirmar isso pode digitar "print/d $ECX" onde /d indica um valor decimal(pode ser trocado para /x ou seja: hexadecimal)
Continue com o "next" até a próxima linha após o XCHG e olhe os valores de ECX e EDX.
Surpresa!Eles foram trocados sem usar um terceiro registrador.
Lembrando que usei a sintaxe AT&T e não a INTEL.