1. Este site usa cookies. Ao continuar a usar este site está a concordar com o nosso uso de cookies. Saber Mais.

Assembly 8086 - Dúvida

Discussão em 'Programação' iniciada por JPSV, 18 de Maio de 2012. (Respostas: 5; Visualizações: 906)

  1. Boas,

    Estou a começar a aprender a programar em Assembly e surgiu-me uma dúvida que espero que algum de vocês seja capaz de me a esclarecer.
    Trata-se de um programa que multiplica dois números de 16 bits e guarda o resultado de 32 bits em memória :

    Código:
    PILHA  SEGMENT  PARA  STACK  ‘STACK’
    DB 1024 DUP(‘PILHA’)
    PILHA  ENDS
    
    DADOS SEGMENT  PARA ‘DATA’
    MULT1   DW   204Ah
    MULT2   DW   382Ah
    PRODUTO   DW   2 DUP(0)
    DADOS  ENDS
    
    CODIGO   SEGMENT  PARA ‘CODE’
    ASSUME CS:CODIGO, DS:DADOS, SS:PILHA
    
    
    MOV AX, DADOS
    MOV DS, AX
    MOV AX, MULT1
    MUL MULT2
    MOV PRODUTO, AX
    MOV PRODUTO+2, DX
    
    
    MOV AH, 4CH
    INT 21H
    
    
    CODIGO   ENDS
    END    INICIO
    
    A minha dúvida está no seguinte,

    MOV AX, MULT1 <- Aqui eu sei que estou a guardar em AX o valor da variável MULT1
    MUL MULT2 <- Aqui multiplico a variável MULT2 pelo valor que está guardado em AX pois trata-se de uma word

    MOV PRODUTO, AX
    MOV PRODUTO+2, DX <- Não percebo é estas duas instruções, já tive a ler que por o resultado ser um numero de 32 bits ele guarda o MSB e o LSB no DX e AX respectivamente, mas estas duas intruções não me fazem sentido!

    Se me conseguissem esclarecer agradecia a ajuda :)
     
  2. Já não pego em ASM ha algum tempo, mas parece-me que:
    o PRODUTO tem 32bits (4 bytes).
    MOV PRODUTO, AX -> Guarda o AX (16 bits) no endereço do PRODUTO, preenchendo os 2 primeiros bytes
    MOV PRODUTO+2, DX -> Guarda o DX (16 bits) no endereço do terceiro byte do PRODUTO, preenchendo os 2 ultimos bytes

    Espero que ajude
     
  3. Ajudou imenso! não fazia ideia que PRODUTO+2 está basicamente a apontar para o 3º byte do PRODUTO.
    Obrigado ptchaos!
     
  4. Mas agora surgiu-me outra dúvida :

    Supostamente a parte maior do resultado (que fica guardada em DX) é a parte mais para a esquerda e a parte menor (que fica em AX) para a direita, então não seria antes:

    MOV PRODUTO, DX
    MOV PRODUTO+2, AX

    Ou estou errado?
     

Partilhar esta Página