Jump to content
Sign in to follow this  
almostF

Duvida Assembly do IA-32 em ambiente linux

Recommended Posts

almostF

eis o código em assembly "desmontando" através do gdb :

1-  0x080483f4 <main+0>: push  %ebp

2-  0x080483f5 <main+1>: mov    %esp,%ebp

3-  0x080483f7 <main+3>: push  %ebx

4-  0x080483f8 <main+4>: sub    $0x8,%esp

5-  0x080483fb <main+7>: and    $0xfffffff0,%esp

6-  0x080483fe <main+10>: sub    $0xc,%esp

7-  0x08048401 <main+13>: push  $0x8048520

(...)

A minha duvida é interpretar a linha 4, a linha 5 e a 6 ... Alguem ajuda ?

(penso que a 4 tenha a ver com as variaveis locais da função(em C) que são 2 variaveis ...)

cumps ( :


almost there .

Share this post


Link to post
Share on other sites
KTachyon

4: Subtraír 8 ao $esp.

5: Fazer and ao $esp. Basicamente, coloca os 4 primeiros do registo a zero.

6: Subtrái 12 ao $esp


“There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult.”

-- Tony Hoare

Share this post


Link to post
Share on other sites
almostF

sim eu isso sei, gostava era de saber o porque de ele subtrair 8 ao %esp e depois subtrair 12 ao %esp ...

5: Coloca os 4 primeiros do registo a zero, como assim ?

cumps


almost there .

Share this post


Link to post
Share on other sites
almostF

se ajudar vou colocar o código C que deu origem a isso,

main ()
{
printf ("blablabla: %d\n", funcao ("Olaaa"));
return 0;
}

funcao (char *s)
{
int i, count =0;
(...)


almost there .

Share this post


Link to post
Share on other sites
KTachyon

sim eu isso sei, gostava era de saber o porque de ele subtrair 8 ao %esp e depois subtrair 12 ao %esp ...

5: Coloca os 4 primeiros do registo a zero, como assim ?

cumps

Faltou-me a palavra "bits", mas precisa de uma correcção, de qualquer forma: Coloca os 4 bits menos significativos a zero (1 dígito hexadecimal são 4 bits).

A forma como o código encaixa aí, não te sei explicar, exactamente, visto que não tenho noção da correspondência entre o código C e o assembly, mas o facto de ele fazer o AND entre as duas subtracções não te permite fazer as duas subtracções em conjunto, se é isso que pretendes.


“There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult.”

-- Tony Hoare

Share this post


Link to post
Share on other sites
JD557

Se não me engano é isto:

1- Coloca o base pointer (EBP) na stack;

2- Coloca o EBP a seguir ao stack pointer (ESP);

3- Coloca o EBX na stack (por norma este registo deve ser preservado)

4- Avança 8 bytes no stack pointer para as variáveis locais

5- Coloca os 4 bits menos significativos a 0, ou seja, avança na stack de forma a que as zona de variáveis locais seja um conjunto de blocos de 4bytes, mesmo que algum espaço fique vazio (se não estou em erro).

6- Avança 12bits no ESP (não estou a entender porque)

7- Guarda o endereço de retorno.

Não te esqueças que a stack cresce "para baixo"... ao inicio não me estava a lembrar disso, por isso o cortar dos 4 bits menos significativos não me estava a fazer sentido.


MIEIC @ FEUP

http://project557.blogspot.com/ --- Development Blog

Proteja a sua pen: http://lastknight.pt.vu

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.