Divisão usando Assembly. [RESOLVIDO]

1. Divisão usando Assembly. [RESOLVIDO]

???
gokernel

(usa Linux Mint)

Enviado em 23/03/2013 - 11:35h

Olá pessoal !!!

Estou desenvolvendo uma API(que usa ASSEMBLY) e já fiz as 3 operaçoes matemáticas ( +, -, * ) e agora estou estou meio que sem saber fazer a operação matemática ( / ) ...

OBJETIVO:
Queria setar um valor inteiro para qualquer REGISTRO ( exceto %eax ) e depois usar ( idivl %registro ) ...

RESUMO:
Dividir %eax por um %registro ...

Pergunta:
Alguém saberia informar como fazer(uma divisao) +ou- usando assembly do GCC ???

Divirtam-se tambem neste final de semana usando um pouco de ASSEMBLY ;)

Exemplo please ...

Grato !!!



  


2. MELHOR RESPOSTA

Perfil removido
removido

(usa Nenhuma)

Enviado em 23/03/2013 - 14:59h

Divisão até onde sei é colocar o dividendo no registrador ax (ou eax, ou rax ...) e colocar o divisor em um outro registrador exceto dx (ou edx, ou rdx ...)

Por exemplo, 29 / 7 = 4 e sobra 1.

* mover 29 para ax;
* mover 7 para bx ou cx;

No caso, com o valor 7 em cx, ficaria algo como:

div cx

sem mais nada.

O resultado, que é 4, ficará em ax e o resto 1 ficará em dx. Aliás, é por isso que não é bom usar dx.

Em caso de se usar valores maiores, é feita uma combinação de deslocamento dx:ax, como se o número ficasse com o dobro da capacidade de bits na escrita.

Muita coisa eu creio que você deva saber, inclusive se você tem as outras três operações feitas, deve ficar fácil adaptar este exemplo.

Espero que eu tenha compreendido sua dúvida.

********

Editado: corrigi um lugar onde escrevi 4 e era 7.

3. Re: Divisão usando Assembly. [RESOLVIDO]

???
gokernel

(usa Linux Mint)

Enviado em 23/03/2013 - 16:32h

Valeu Listeiro, ajudou bastante !!!

Só nao saquei o porque nao usar ( %edx ), ... usei aqui e deu uma quebra ...


Resolvido, para testar ficou assim:



int x;

void funcao (void)
{
asm ("movl $100, %eax");
asm ("movl $3, %ecx");
asm ("cltd");
asm ("idivl %ecx");

#ifdef __WIN32__
asm ("mov %eax, _x"); // passa o resultado para imprimir ( printf ) na tela
#endif

#ifdef __linux__
asm ("mov %eax, x"); // passa o resultado para imprimir ( printf ) na tela
#endif

printf ("Valor de x: %d\n", x); // 33
}



Obrigado !




4. Re: Divisão usando Assembly. [RESOLVIDO]

Perfil removido
removido

(usa Nenhuma)

Enviado em 23/03/2013 - 16:46h

Voltando no exemplo: 29 / 7 = 4 e sobra 1.

Se o 7 for colocado em dx, o comando fica sendo

div dx

e o 7 acaba sendo sobrescrito pelo valor 1, que é o resto.

Se esse valor 7 por algum acaso tiver de ser usado novamente, causa confusão.

Daí acaba sendo melhor deixar em bx ou cx.

Exceto se for usada em conjunto a dupla combinada dx:ax.

Lembrei-me que na divisão é bom zerar dx antes de executar a divisão, para ele não querer usar dx como extensão.

Para isso um "xor dx, dx" resolve.






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts