• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

n_digo

Multiplicaçao em Assembly

3 mensagens neste tópico

Boas preciso de saber fazer a multiplicaçao em assembly para 8086 ...vi isto num site

Propósito: Efetuar uma multiplicação não sinalizada entre o conteúdo do acumulador (AL ou AX) pelo operando fonte, devolvendo o resultado no acumulador AX (caso a operação tenha envolvido AL com um operando de 8 bits), ou em DX e AX (caso a operação tenha envolvido AX e um operando de 16 bits).

Formato: MUL fonte

Flags: Afetados CF, OF, indefinidos AF, PF, SF, ZF.

Exemplos:  MOV  AL, 83H

                  MOV  CL, 44H

                  MUL  CL              ; realiza o produto entre AL e CL, resultado em AX

                  MOV AX,1234H

                  MOV BX,6000H

                  MUL  BX              ; realiza o produto de 16 bits entre AX e BX, resultado                                        em DX(parte alta) e AX(parte baixa)

1º Se eu kiser por exmplo subtrair um grande valor a a minha ultima multiplicaçao como fa-so se tenho dados em DX e dados em AX ?

2º outra questao, ao fazer MUL X ... vai multiplicar X por kual registo AL DX ??

3º quando é que devemos utilizar uma stack ?

[[]]

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Boas!  :cheesygrin:

1º Ponto:

Bom, subtrais apenas ao AX (parte baixa), já que seriam ambos WORDs. Depois disto, verifica o estado da Sign Flag devendo decrementar o DX no caso de ela estar on.

2º Ponto:

O MUL nunca irá multiplicar por DX, mas sim por AL ou AX dependendo do tamanho do teu x (BYTE ou WORD, respectivamente).

3º Ponto:

Usa e abusa dela!!  :D

Força  :cheesygrin:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
1º Se eu kiser por exmplo subtrair um grande valor a a minha ultima multiplicaçao como fa-so se tenho dados em DX e dados em AX ?

Primeira hipótese:

Desempacotas o Produto para um registo de 32 bits e fazes a subtracção normalmente:

mov bx, dx
shl ebx, 16
mov bx, ax

sub ebx, (qualquer coisa)

Mas este código não vai funcionar senão em >= 306...

Segunda hipótese:

A maneira "standard" de trabalhar com aritmética de 32 bits em < 386 é utilizar a Carry flag. Neste caso:

sub ax, LOW_WORD_DO_VALOR
sbb dx, HIGH_WORD_DO_VALOR              ; Subtracção com empréstimo: subtrai
                                        ; 1 se a carry flag estiver marcada, além
                                        ; do operando que lá puseste.

Para adições, a High Word deve ser somada com a instrução ADC.

2º outra questao, ao fazer MUL X ... vai multiplicar X por kual registo AL DX ??

Ele só faz multiplicações entre operandos com o mesmo tamanho. Portanto, se puseres um operando de 8 bits, ele muitiplica por AL e mete o resultado em AX. Se puseres um de 16 bits, ele multiplica por AX e o produto vai para DX:AX. Se puseres um de 32 bits, multiplica por EAX e mete o resultado em EDX:EAX. Se multiplicas por uma QuadWord (64 bits), ele muitiplica por RAX e mete o resultado em RDX:RAX

Mnemonic      Opcode Description

MUL reg/mem8  F6 /4  Multiplies an 8-bit register or memory operand by the contents

                      of the AL register and stores the result in the AX register.

MUL reg/mem16  F7 /4  Multiplies a 16-bit register or memory operand by the contents of

                      the AX register and stores the result in the DX:AX register.

MUL reg/mem32  F7 /4  Multiplies a 32-bit register or memory operand by the contents of

                      the EAX register and stores the result in the EDX:EAX register.

MUL reg/mem64  F7 /4  Multiplies a 64-bit register or memory operand by the contents

                      of the RAX register and stores the result in the RDX:RAX register.

Faz uma tabela e usa como cábula. Aviso-te que a divisão é mais complexa, até porque envolve o resto e tal...

sujestão: para multiplicações por constantes, é habitual usar shifts e adições... fica mais rápido (ou pelo menos em tempos foi).

3º quando é que devemos utilizar uma stack?

- Quando o processador obriga a isso (p.ex. instrução CALL)

- Quando não tens mais registos e queres guardar mais variaveis;

- Queres chamar uma rotina que aceita argumentos nos registos mas tens variaveis guardadas nesses registos e não as queres corromper;

-  Quando a rotina que queres chamar não garante preservação de um registo em que tens uma variável importante;

- Quando queres escrever uma rotina que se chama recursivamente (i.e. a si própria).

- Quando te apetece :-D

JJ

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora