Ajuda Programa Assembly

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:
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:
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

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...
 
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...

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:


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!
 
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:
Back
Topo