Pular para o conteúdo

ASM: multiplica com resultado em (%esp)

Responder tópico
  • Denunciar
  • Indicar

1. ASM: multiplica com resultado em (%esp)

Enviado em 29/06/2014 - 09:49h


Olá pessoal !

Tenho este código:



#include <stdio.h>

int i;

//
// i = 10 * 20 + 3 * 5; // igual = 215
//
void funcao (void)
{

// push 2 valores:
//
asm ("push $10");
asm ("push $20");

// MULTIPLICA:
asm ("pop %eax");
asm ("imul (%esp), %eax"); // resultado: %eax
asm ("mov %eax, (%esp)"); // copia %EAX para (%ESP)

// push 2 valores:
//
asm ("push $3");
asm ("push $5");

// MULTIPLICA:
asm ("pop %eax");
asm ("imul (%esp), %eax"); // resultado: %eax
asm ("mov %eax, (%esp)"); // copia %EAX para (%ESP)

// SOMA:
asm ("pop %eax");
asm ("add %eax, (%esp)"); // resultado: (%esp) ---- EXCELENTE RESULTADO

#ifdef _WIN32
asm ("pop _i");
#endif
#ifdef __linux__
asm ("pop i");
#endif
}

int main (void)
{
funcao();
printf("\nresult( 10 * 20 + 3 * 5 ) = %d\n", i); // 215
return 0;
}

Gostaria que a multiplicação sete (%esp) igual a adicao:

Uma adicao, ok:
-------------------------------------------------
asm ("add %eax, (%esp)"); // resultado: (%esp) ---- EXCELENTE RESULTADO
-------------------------------------------------

Gostaria de fazer algo assim ... mas não funciona:
-------------------------------------------------
asm ("imul %eax, (%esp)); // resultado: (%esp) ... ASSIM NAO EH POSSIVEL
-------------------------------------------------

Alguém saberia como fazer para conseguir isso ...

OBS: parece que isso será impossível( eu acho )... ;)

Grato !

Responder tópico

2. Re: ASM: multiplica com resultado em (%esp)

Enviado em 30/06/2014 - 14:09h

não sei que sintaxe vc tá usando, mas pelo que eu me lembro, na sintaxe intel os valores resultantes das instruções são armazenados no primeiro registrador, não no segundo como vc pôs nos comentários.

3. Re: ASM: multiplica com resultado em (%esp)

Enviado em 30/06/2014 - 16:36h

Olá!

Estou usando AT&T sintaxe, a mesma usada pelo gcc.

4. Re: ASM: multiplica com resultado em (%esp)

Enviado em 30/06/2014 - 20:13h

Eu *acho* que a multiplicação em ESP não é possível porque o resultado da multiplicação de dois números de 32 bits gera um número de 64 bits. Quando você multiplica normalmente, os 32 MSBs ficam em EDX e os 32 LSBs em EAX. Colocando (ESP) como destino da multiplicação, como ficaria o layout das duas metades do resultado?

5. Re: ASM: multiplica com resultado em (%esp)

Enviado em 01/07/2014 - 00:07h

Ok "paulo" também acho que não seria possível.

Agora o mais interessante eh que usando tipo float já existem opcodes(assembly) para isso usando %st como pilha.

Resumindo: operações matemáticas usando assembly com float fica mais fácil que usando int/long.

Responder tópico

Responder tópico

Entre na sua conta para responder.

Fazer login para responder