[ +/- ] [ Data/Hora: 19 Mai 2013, 04:36 ]


Criar um novo TópicoWrite comments Página 1 de 1   [ 9 posts ]
Autor Mensagem
 Assunto da Mensagem: Problemas com Assembly Inline
MensagemEnviado: 29 Dez 2011, 21:02 
Membro Ativo
Avatar do Utilizador

Registado: 23 Jul 2011, 04:03
Mensagens: 164
Seguinte, é que eu queria "transformar" os Opcodes do Assembly em funções de C++ ^^" Pra ficar mais legal sabem rsrs

Mas é que tá dando meio errado... Eu fiz isso com o MOV:

Code:
inline void MOV(long operand1, long operand2)
{
   _asm
   {
      MOV EAX, operand2 ;Move conteúdo de "operand2" para o registrador EAX
      MOV operand1, EAX ;Move conteúdo do registrador EAX para operand1
   }
}


e ai no main eu coloquei:
Code:
   int X = 0;
   int Y = 1;
   MOV(X, Y); //X deveria ser igual à Y!
   cout << X;
loop: goto loop;


Não deveria aparecer 1 na tela? Mas aparece 0! Eu até tentei fazer no MOV colocar assim:
Code:
MOV operand1, operand2

Mas dá o erro de "Invalid operand type".

E o que fazer então? Eu queria fazer algo que funcionasse como um "X=Y", tipo isso, mas não tô conseguindo.

_________________
"Cuidado quando tomar uma Fanta. Pode conter dorgas." =3


Topo
 Perfil  
 
 Assunto da Mensagem: Re: Problemas com Assembly Inline
MensagemEnviado: 29 Dez 2011, 21:17 
Membro Ativo

Registado: 02 Jun 2011, 22:24
Mensagens: 167
Faz o seguinte: Escreve a função em C e gera o código em asm. Se não me engano, no Visual C++ vc compila assim:
Code:
cl -O2 -Fa test.c

E veja o que o compilador gerou!


Topo
 Perfil  
 
 Assunto da Mensagem: Re: Problemas com Assembly Inline
MensagemEnviado: 29 Dez 2011, 21:22 
Membro Ativo

Registado: 02 Jun 2011, 22:24
Mensagens: 167
Colocando de outra forma... Se você fizesse:
Code:
void f(int x, int y) { x = y; }

A função jamais alteraria o valor de 'x' passado para a função, fora da função:
Code:
x = 10; y = 20;
f(x, y);
/* x continua sendo 10 e y continua sendo 20 aqui */


Topo
 Perfil  
 
 Assunto da Mensagem: Re: Problemas com Assembly Inline
MensagemEnviado: 29 Dez 2011, 21:41 
Membro Ativo
Avatar do Utilizador

Registado: 23 Jul 2011, 04:03
Mensagens: 164
Desculpa manolo, obrigado pela ajuda mas não deu certo =/ O comando NÃO gerou código em asm...

E o segundo post foi meio confuso :huh: Isso não faz sentido, x e y são variáveis locais da função f(int x, int y). Você não pode usá-las assim.

EDIT:

Agora eu modifiquei seu código e deu pra ver o que cê tava falando:
Code:
#include <iostream>
void f(int x, int y)
{
   x = y;
}

void main()
{
   int x = 10;
   int y = 20;
   f(x,y);
   std::cout << x << '\n' << y << '\n';
loop: goto loop;
}

Mas mesmo assim não sakei por que X ainda continua com 10 e Y com 20. E também não entendi como isso vai ajudar :?

_________________
"Cuidado quando tomar uma Fanta. Pode conter dorgas." =3


Topo
 Perfil  
 
 Assunto da Mensagem: Re: Problemas com Assembly Inline
MensagemEnviado: 30 Dez 2011, 09:44 
Membro
Avatar do Utilizador

Registado: 09 Mar 2011, 12:13
Mensagens: 40
@Lucas:
Os valores nunca vão mudar pq do jeito q vc fez a função os valores dos parâmetros que vc passa para a função vão ser "clonados/copiados". Vc tem que passar os parâmetros por referencia. Assim.

Code:
#include <iostream>
void f(int *x, int *y)
{
   x = y;
}

void main()
{
   int x = 10;
   int y = 20;
   f(&x,&y);
   std::cout << x << '\n' << y << '\n';
}


E serio q vc ta usando goto?


Topo
 Perfil  
 
 Assunto da Mensagem: Re: Problemas com Assembly Inline
MensagemEnviado: 30 Dez 2011, 12:57 
Membro Ativo
Avatar do Utilizador

Registado: 23 Jul 2011, 04:03
Mensagens: 164
O goto foi só pra pausar a tela nesse exemplo. Pra não ter que incluir outra Biblioteca além da iostream. Esse projeto em console é só pra testar minhas tentativas de "transformar" os Opcodes em funções.

E mano, eu testei seu código e dá na mesma do último código que eu postei =P

E tem mais alguma coisa do Asm que eu precise levar em concideração?

_________________
"Cuidado quando tomar uma Fanta. Pode conter dorgas." =3


Topo
 Perfil  
 
 Assunto da Mensagem: Re: Problemas com Assembly Inline
MensagemEnviado: 01 Jan 2012, 12:31 
Membro Ativo

Registado: 02 Jun 2011, 22:24
Mensagens: 167
Lucas B. Luna Escreveu:
Desculpa manolo, obrigado pela ajuda mas não deu certo =/ O comando NÃO gerou código em asm...


Manolo não... Fred!

Consulte o manual do compilador (ou cl /? na linha de comando).

Quote:
E o segundo post foi meio confuso :huh: Isso não faz sentido, x e y são variáveis locais da função f(int x, int y). Você não pode usá-las assim.

EDIT:

Agora eu modifiquei seu código e deu pra ver o que cê tava falando:
Code:
#include <iostream>
void f(int x, int y)
{
   x = y;
}

void main()
{
   int x = 10;
   int y = 20;
   f(x,y);
   std::cout << x << '\n' << y << '\n';
loop: goto loop;
}

Mas mesmo assim não sakei por que X ainda continua com 10 e Y com 20. E também não entendi como isso vai ajudar :?


Ué?! Você mesmo respondeu a sua própria pergunta...
x e y são variáveis locais à função f()... Quando você faz a chamada a f(), as variáveis x e y, locais à função main() são copiadas para as variáveis x e y, locais à função f(). Qualquer alteração de x e y dentro da função f() só ocorrerá dentro de f(). Se quiser alterar o valor do parâmetro é mais prático passa-lo como ponteiro:
Code:
void f(int *x, int y)
{ *x = y; }

int main(void)
{
  int x = 10, y = 20;
  f(&x, y);
  printf("x = %d\n", x);
  return 0;
}


Entendeu, Lucas?

PS: Com o gcc você pode gerar o código em asm assim:
Code:
gcc -S -masm=intel test.c

Ou usar o g++, se for usar ios.


Topo
 Perfil  
 
 Assunto da Mensagem: Re: Problemas com Assembly Inline
MensagemEnviado: 02 Jan 2012, 09:17 
Membro Ativo

Registado: 02 Jun 2011, 22:24
Mensagens: 167
Para esclarecer de vez a sua dúvida. O código que você postou no início dessa thread:
Code:
inline void MOV(long operand1, long operand2)
{
   _asm
   {
      MOV EAX, operand2 ;Move conteúdo de "operand2" para o registrador EAX
      MOV operand1, EAX ;Move conteúdo do registrador EAX para operand1
   }
}

gera algo mais ou menos assim:
Code:
_MOV:
  mov eax,[esp-8]
  mov [esp-4],eax
  ret

Node que os parâmetros "operand1" e "operand2" estão localizados na pilha e essa é "desfeita" depois da chamada:
Code:
  push dword ptr [y]
  push dword ptr [x]
  call _MOV
  add esp,8   ; joga fora os parâmetros empilhados.

Assim, "operand1" e "operand2" são locais à função MOV().


Topo
 Perfil  
 
 Assunto da Mensagem: Re: Problemas com Assembly Inline
MensagemEnviado: 04 Jan 2012, 17:11 
Membro Ativo
Avatar do Utilizador

Registado: 23 Jul 2011, 04:03
Mensagens: 164
Opa, muito obrigado... Fred! o/

Mas agora eu percebi que é meio anti-produtivo fazer o que eu tava tentando fazer. E detalhe que eu tinha que transferir os dados diretamente, se os dados passassem pelo registrador EAX (como eu tava fazendo) eu acho que isso ia tirar o sentido do MOV real. Mas esquece, deixa pra lá. Obrigado pela ajuda de todos.

E vou estudar mais Assembly, percebi que tava tendo viagem.

_________________
"Cuidado quando tomar uma Fanta. Pode conter dorgas." =3


Topo
 Perfil  
 
Mostrar mensagens anteriores:  Ordenar por  
Criar um novo TópicoWrite comments Página 1 de 1   [ 9 posts ]
Similar topics
Problemas com C::B
Fórum: C/C++
Autor: brwnow_w
Respostas: 9
Dois problemas de lógica
Fórum: Pascal/Delphi
Autor: uulinn
Respostas: 11
[ajuda]Com o div e mul do assembly
Fórum: C/C++
Autor: _GuGa_
Respostas: 18
PROBLEMAS COM O MILKSHAPE!!!ME AJUDEM PLZ! Ó.Ò
Fórum: Modelagem 3D
Autor: Eric Draven
Respostas: 3
Tablet x Mouse = Problemas!
Fórum: Hardware
Autor: Dragoom
Respostas: 0
Topo


Quem está ligado:

Utilizador a ver este Fórum: Nenhum utilizador registado e 1 visitante


Criar Tópicos: Proibído
Responder Tópicos: Proibído
Editar Mensagens: Proibído
Apagar Mensagens: Proibído

Pesquisar por:
Ir para:  

cron


Powered by phpBB ©

Virtual Object Informtica Ltda. Fone/Fax: (15)3231-6840