Porque é que quererias fazer isso?
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
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...
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
codigo
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
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;
}
}
; 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: