ASM: multiplica com resultado em (%esp)

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

???
gokernel

(usa Linux Mint)

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 !



  


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

Dantas
augustold

(usa Arch Linux)

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)

???
gokernel

(usa Linux Mint)

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)

Paulo
paulo1205

(usa Ubuntu)

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)

???
gokernel

(usa Linux Mint)

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.







Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts