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

Ajuda Programa Assembly

Discussão em 'Programação' iniciada por Myself*, 23 de Maio de 2008. (Respostas: 7; Visualizações: 1026)

  1. Myself*

    Myself* Power Member

    Olá pessoal!

    Tenho uma dúvida em Assembly 8086.

    Como e k eu atraves de um programa em assembly, copio o codigo do proprio programa para outra posicao de memoria?

    Respostas!!

    Postem!!
     
    Última edição pelo moderador: 23 de Maio de 2008
  2. souto

    souto To fold or to FOLD?

    Porque é que quererias fazer isso?
     
  3. Myself*

    Myself* Power Member

    È para um trabalho...
     
  4. rj.rodrigues

    rj.rodrigues Power Member

    penso que dê assim:

    Código:
    start: #label pra 1a instrução
      posCp EQU 0xXXXX #endereço pra ondes vais copiar o codigo
      (..) # codigo do programa
    #inicio copiar codigo
      mov si, start
      mov di, posCp # posCp
      mov dx, endProgram
      inc dx
    ciclo1:
      mov ax, [si]
      mov [di], ax
      inc si
      inc di
      cmp si, dx
      jbe ciclo1
    #fim copiar codigo
      (..) #+ codigo
    endProgram: #label pra última instrução
    
     
    Última edição: 23 de Maio de 2008
  5. Myself*

    Myself* Power Member

    Obrigada pela ajuda... Já testei no meu programa e está a funcionar bem. Muito obrigada.

    Agora, tenho outra duvida:
    Como posso fazer n copias sendo n um valor desconhecido, isto é, o utilizador pode fazer o número de cópias que quiser.

    Aguardo resposta...
     
  6. rj.rodrigues

    rj.rodrigues Power Member

    Código:
    start: #label pra 1a instrução
      posCp EQU 0xXXXX #endereço pra ondes vais copiar o codigo
      (..) # codigo do programa
    
    #inicio copiar codigo
      # fazer aqui readInt() e colocar o resultado em al
      mov di, posCp # posCp que esta defenida acima
      mov ah, 0
    repeat:
    
      mov si, start
      mov dx, endProgram
      inc dx
    ciclo1:
      mov bx, [si]
      mov [di], bx
      inc si
      inc di
      cmp si, dx
      jbe ciclo1
    
      inc ah
      cmp ah, al
      jb repeat
    #fim copiar codigo
    
      (..) #+ codigo
    endProgram: #label pra última instrução
    
     
    Última edição: 24 de Maio de 2008
  7. Myself*

    Myself* Power Member


    Desde já, muito obrigada pela ajuda que me têm proporcionado.
    Tenho mais outra dúvida, aqui:

    Código:
    imprime:
      xor dx , dx    ;limpa dx para divisão
      mov bx , 0Ah   ;poe 0Ah para divisão em bx
      mov di , c_a  ;salva o endereço do ultimo byte de buffer em destination index
     converte:
      mov ax , [copia_anterior]   ;coloca a var primeiro em ax para divisão
      div bx    ;divide dx:ax por bx
      mov [copia_anterior] , ax       ;primeiro resultado de ax em primeiro
      add dl , 030h   ;incrementa 030h ao resto da ultima divisão para ficar ASCII
      mov [di] , dl   ;põe o valor de dh no conteudo desse endereço
      dec di    ;decrementa em um di
      xor dx , dx
      cmp word [copia_anterior] , 0
      jne converte
      
      mov ah , 09h    ;printa o que estiver em ds:dx  
      int 21h
      ret
     
    

    Supostamente, deveria estar a imprimir o valor da variavel copia_anterior, mas está a imprimir outro valor muito mais elevado. Alguem me consegue descobrir onde está o erro?!

    Aguardo resposta... urgente!
     
  8. rj.rodrigues

    rj.rodrigues Power Member

    Código em C
    Código:
    void itoa(int n, char s[])
    {
        int i, sign;
        if ((sign = n) < 0)  /* record sign */
            n = -n;          /* make n positive */
        i = 0;
        do {       /* generate digits in reverse order */
            s[i++] = n % 10 + '0';   /* get next digit */
        } while ((n /= 10) > 0);     /* delete it */
        if (sign < 0)
            s[i++] = '-';
        s[i] = '\0';
        reverse(s);
    } 
    
    /* reverse:  Serve pra colocar a String ao contrario */
    void reverse(char s[])
    {
        int c, i, j;
    
        for (i = 0, j = strlen(s)-1; i<j; i++, j--) {
            c = s[i];
            s[i] = s[j];
            s[j] = c;
        }
    }
    Código:
    ; copia_anterior -> enderço do valor a ser conv
    ; c_a -> endereço de onde vai ficar a String
    ; esquecendo a situação do sinal e consider/º base 10 e o numero tem no max 2bytes
    
      mov di, c_a ; di = endereço alvo
      mov cl, 0x30 ; cl = '0'
      mov ax, [copia_anterior] ; ax = valor a se conv
    converte:
      idiv 10  ; divide por 10 -> AL = ax/10 || AH = ax%10
      add ah, cl ; ah = ax%10 + '0'
      mov byte[di], ah ; guarda o 1o caracter
      mov ah, 0 ; força ah a 0 pra aproveitar o valor de al usando assim ax
      inc di ; di ++
      cmp al, 0
      jg converte
      mov byte[di], 0 ; termina a String (guarda '\0')
      ; Agora vamos colocar a String pela ordem correcta
      mov si, c_a ; si = inicio da String || di já esta no fim da String
    reverse:
      cmp si, di
      jae endReverse
      mov bl, byte[si]  ; aux = [si]
      mov bh, byte[di]
      mov byte[di], bl
      mov byte[si], bh
      inc si ; si ++
      dec di ; di --
      jmp reverse
    endReverse:
    
    Atenção isto so funciona para um numero ate 16 bits (2 bytes) ou seja ate 65535, para funcionar com mais terias k fazer algumas alterações, por ex usar o dx:ax na divisão
     
    Última edição: 26 de Maio de 2008

Partilhar esta Página