Re: Duvida questão 1...

9 views
Skip to first unread message

magno ferreira

unread,
Dec 6, 2010, 8:46:33 AM12/6/10
to comp...@googlegroups.com
questão 1 da lista 3:

int main(void) {
   int x = 10, y, z=-1;
   asm ("movl %1, %0; andl %2, %0"
        :"=d"(y)                                       /* retorno da rot asm*/
        :"c"(x), "r"(z)                               /*  parametros da rot asm  */
       );
   return y;
}

pela ordem nesse caso
%0 referencia a variavel y da main e coloca no reg edx   ( o "=d" foi uma abreviação poderia ser "=edx")
%1 referencia a variavel x da main e coloca no reg ecx
%2 referencia a variavel z da main e coloca num reg dinamico

daí é só substituir
não sei se usei termos certos pra explicar, mas creio q esteja certo

2010/12/6 Mário Luís Sá Morais <mario...@gmail.com>
Prezados colegas,

Será que alguém que tenha entendi a questão 1 pode me explicar?

Fico grato pela atenção.



--
*
{agf}

Mário Luís Sá Morais

unread,
Dec 6, 2010, 8:49:31 AM12/6/10
to comp...@googlegroups.com
A minha dúvida é como sei que %0, %1 ou %2 referência que variável.
Com o gabarito é mole deduzir, mas se nao tivesse o gabarito como
sei?

Stefan Teixeira

unread,
Dec 6, 2010, 8:52:47 AM12/6/10
to comp...@googlegroups.com
É na ordem que vc tá declarando os parâmetros, nesse caso primeiro foi declarado o y, depois na segunda linha foi declarado na ordem x e z.

magno ferreira

unread,
Dec 6, 2010, 8:53:38 AM12/6/10
to comp...@googlegroups.com

exato!
2010/12/6 Stefan Teixeira <stef...@gmail.com>



--
*
{agf}

Stefan Teixeira

unread,
Dec 6, 2010, 11:35:07 AM12/6/10
to comp...@googlegroups.com
Só uma coisa, pq o andl de -1 com 10 vai dar 10? Sempre me confundo com essa instrução...

Rafael Souza

unread,
Dec 6, 2010, 12:11:22 PM12/6/10
to comp...@googlegroups.com
Pois é uma operação bit a bit ... 
10 -> 01010   
-1  -> 11111
--
Carlos Rafael Baur de Souza

Fernando Silva

unread,
Dec 6, 2010, 12:21:57 PM12/6/10
to comp...@googlegroups.com
Mário, é isso mesmo que o Stefan falou.

quanto ao ANDL, ou a qualquer operação lógica, sempre lembrem que as operações lógicas são bit a bit.
No caso, -1 em bits é 1111...11, logo, and de -1 com qualquer coisa, dá sempre o outro operando.

Stefan Teixeira

unread,
Dec 6, 2010, 12:27:45 PM12/6/10
to comp...@googlegroups.com
Tem alguma maneira fácil de passar pra binário ou hexa números negativos? :P
Na P1 tinha que fazer -2 em binário e eu fiquei que nem idiota sem saber como fazer

Fernando Silva

unread,
Dec 6, 2010, 12:36:09 PM12/6/10
to comp...@googlegroups.com
Cara, na época que eu não tinha prática, e precisei achar -32 em binário na hora da prova, o que eu fiz foi achar o hexadecimal, porque com o hexa, achar o binário é muito tranquilo, ai eu montei um esquema assim:

-1 = FFFFFFFFh
-2 = FFFFFFFEh
-3 = FFFFFFFDh
-4 = FFFFFFFCh
-5 = FFFFFFFBh
-6 = FFFFFFFAh
-7 = FFFFFFF9h
-8 = FFFFFFF8h
-9 = FFFFFFF7h
-10 = FFFFFFF6h
-11 = FFFFFFF5h
-12 = FFFFFFF4h
-13 = FFFFFFF3h
-14 = FFFFFFF2h
-15 = FFFFFFF1h
-16 = FFFFFFF0h

Dai para frente, é fácil, por exemplo, -32 é (-16) (-16), logo, é FFFFFFE0h
se, por exemplo, eu precisasse do - 27, ele é (-16) (-11), logo, é FFFFFFE5h

Não sei se te ajuda, mas resolveu meu problema na hora que eu precisei...

Stefan Teixeira

unread,
Dec 6, 2010, 12:48:53 PM12/6/10
to comp...@googlegroups.com
Ajudou legal sim cara, valeu!

Fernando Silva

unread,
Dec 6, 2010, 2:23:08 PM12/6/10
to comp...@googlegroups.com
Lembrando sempre que é só fazer o complemento a dois para converter, por exemplo:

10  = 0000000000001010
-10 = 1111111111110110

Ai no caso você pode pensar como:
1) Inverto todos bits e depois somo 1
ou
2) Vindo da direita para a esquerda, acho o primeiro 1, mantenho o valor dele e de todos anteriores, e depois inverto dos os bits seguintes.
Reply all
Reply to author
Forward
0 new messages