Curso Fudeba de ASM |
Nesta aula vamos fazer algumas coisas diferentes... Primeiramente vamos dar uma olhada em como podemos tornar a nossa vida mais simples na programação Assembly para o MSX (que, convenhamos, é algo muito mais útil que uma programação Assembly Z80 pura) com o material que temos, que é o M80/L80 para PC e o BrMSX.
Também vamos aprender algumas brincadeiras novas com o nosso já bem estudado programinha, e não vamos acrescentar nenhuma nova funcionalidade a ele por enquanto: vamos apenas melhorar sua estrutura, tornando-o mais "adequado", digamos assim.
Antes disso, vamos dar uma olhadinha no que vimos na ultima aula, que já
faz um tempinho, visto que tive uns probleminhas de saúde aí no meio do caminho que me
deixaram mais de 15 dias de cama.
Na aula passada estendemos o nosso programa para apresentar informações na
tela de uma forma um pouco mais padronizada, como é feito pela maioria dos programas para
MSX-DOS (CP/M). Para isso, usamos sucessivas chamadas à função STROUT do BDOS. Como
isso começou a tornar o programa 'meio confuso', foi introduzida a técnica de
comentários por blocos, de forma a deixar o programa um pouco mais 'legível'.
Ao colocar mais informações na tela, aprendemos a lidar com alguns
caracteres de controle como o Carriage Return (CR, 13) e o Line Feed (LF, 10), que nos
permite escolher um pouco melhor qual o posicionamento que queremos dar ao texto na tela.
Depois desse processo, aprendemos como usar a função CONIN para receber uma entrada do
usuário, aprendemos como guarda-la na memória e como usar a função CONOUT para colocar
o caractere desta tecla novamente na tela. No meio do caminho deste aprendizado topamos
com um imprevisto, que foi o fato de a função STROUT sumariamente sumir com o resultado
que havíamos obtido com a função CONIN, problema que foi resolvido guardando-se a
informação na memória logo após usarmos a função CONIN e antes de usar a função
STROUT. Ao recuperarmos o valor da memória, topamos novamente com um problema:
precisávamos do valor no registrador E é devido a uma limitação do Z80 (que é a de
só podermos usar o registrador A como 'cola' para escrever ou ler dados que estão na
memória) acabamos tendo que descobrir uma das formas de se lidar com isso, trocando dados
entre os registradores A e E, aprendendo neste processo todo ainda algumas pequenas
técnicas de debug (knock-out, o processo de sair removendo partes do programa e ver se o
que foi removido sumiu com o que deveria sumir e se o problema sumiu junto).
Bem, vamos aos tópicos da aula de hoje...
Com as duas primeiras aulas vocês devem ter observado que, realmente, o
Assembly não é um bicho de sete cabeças, apesar de ser meio chatinho, por ser
detalhista. No entanto, uma coisa que deve ter incomodado bastante a vocês (a mim
incomodou) foi o fato de termos de
assemblar-no-PC,-copiarmos-no-disquete-e-levar-para-o-MSX. Isso é aborrecedor! Contra
isso teríamos a alternativa de assemblar direto no MSX, usando a versão M80/L80 do MSX,
mas contra isso temos que o MSX é muito mais lento para assemblar, e os editores de texto
do MSX conseguem, em sua maioria, ser piores (ou mais lentos ou com menos recursos) que o
próprio Notepad.
O que fazer então? Porque não podemos fazer exatamente como no Basic, que
escrevemos e rodamos?
Bem, se você escrevessem em linguagem de maquina (aquele monte de
numerozinhos em base hexadecimal) você efetivamente teria como executar o programa
diretamente, mas adianto a você que isso é extremamente pouco pratico, principalmente no
que se refere à variáveis e alguns outros detalhes. Então... não podemos escapar muito
da rotina de assemblar antes de testar o programa (vocês vão ver que o Assemblador traz
algumas vantagens extras nas próximas aulas), mas a gente pode, se não eliminar a
peregrinação ao MSX, diminui-la. Mas como? Com o BrMSX.
Antes de mais nada, vá no seu diretório "\ASMMSX" e crie dentro
dele o seguinte diretório: BRMSX. Você deverá ter então:
\ASMMSX
[arquivos das aulas anteriores]
\ASMMSX\BRMSX
E dentro deste \ASMMSX\BRMSX descomprima o BrMSX, que você encontra na
pagina do Ricardo Bittencourt ( http://www.lsi.usp.br/~ricardo/brmsx.htm
ou http://www.lsi.usp.br/~ricardo/brmsx206.zip
diretamente ) e também crie, dentro deste diretório \ASMMSX\BRMSX o diretório: TESTE
(\ASMMSX\BRMSX\TESTE ).
Você vai precisar de dois arquivos do MSXDOS: MSXDOS.SYS e COMMAND.COM.
Coloque-os dentro deste diretório ( \ASMMSX\BRMSX\TESTE ).
Mude para o diretório das aulas anteriores com
CD\ASMMSX [enter]
e depois copie o arquivo da aula anterior para este novo diretório:
COPY PROG2.COM .\BRMSX\TESTE
Com isso, tudo que você precisa para rodar o seu programa já está no diretório \ASMMSX\BRMSX\TESTE . Agora vamos aprender a executar isso usando o BrMSX, o que é muito simples... mude para o diretório do BrMSX:
CD BRMSX
e comande:
BRMSX -mount teste
E você observará milagrosamente que o BrMSX já entrou com um MSX-DOS, e se você digitar DIR verá que os arquivos existentes neste "disquete virtual" são exatamente os arquivos que estavam no diretório:
\ASMMSX\BRMSX\TESTE
Para executar seu programa no BrMSX, a partir deste prompt do MSXDOS, basta você digitar:
PROG2 [enter]
Garanto que funciona. Para sair e voltar ao MS-DOS (ou ao seu Windows),
digite F10 e depois pressione Q. Quando você pressionar F10 verá uma tela cheia de
números e uns dados em Assembly e outros.
Essa tela é chamada FuDebug e é a melhor coisa que existe no BrMSX para
quem quer programar Assembly. Daqui algumas aulas nos vamos utilizar extensivamente o
BrMSX exatamente para tirarmos proveito do FuDebug... assim, é bom que você já vá se
acostumando a executar seus programas no BrMSX.
Você pode automatizar esse procedimento todo criando arquivos de lote no
MS-DOS/Windows, e tudo ficará bem automático, mas lembre-se que é importante executar
seu programa no MSX real e testa-lo com alguma freqüência... simplesmente para conferir
se as coisas estão andando como deviam. Em geral estarão, mas não custa nada dar uma
verificada (jamais libere uma versão nova do seu software para MSX sem te-lo executado
antes no MSX. Você pode ter alguma surpresa bem desagradável).
Aprenda bem esse procedimento de executar os programas no BrMSX.
Futuramente irei comentar sobre utilização de funções do BrMSX mais
aprofundadas, e é importante que você já esteja familiarizado com a execução do seu
software dentro do ambiente do BrMSX, de forma que você possa se preocupar somente com a
explicação da nova função, e não com o procedimento de como carregar o software pelo
BrMSX.
Otimizando nosso programa
Bem, agora já nos livramos de ter que, a cada compilação, jogar num
disquete, levar até o MSX e executar para então ver que não funciona etc. e tal...
Agora já podemos trabalhar um pouco mais confortavelmente no PC, usando o BrMSX.
Vamos ver como podemos dar uma otimizada no nosso programa da aula passada... que no fim,
ficou da seguinte forma:
--- Cortar Aqui --- BDOS EQU 5 CONIN EQU 1 CONOUT EQU 2 STROUT EQU 9 START: ; Mostra nome do programa LD DE,NOMEDOPRG ; Indica texto do nome do programa LD C,STROUT ; Indica função de mostrar texto do BDOS CALL BDOS ; Manda o BDOS executar. ; Mostra nome do programador LD DE,AUTOR ; Indica texto do nome do autor LD C,STROUT ; Indica função de mostrar texto do BDOS CALL BDOS ; Manda o BDOS executar. ; Mostra a pergunta LD DE,PERGU1 ; Indica texto da pergunta LD C,STROUT ; Indica função de mostrar texto do BDOS CALL BDOS ; Manda o BDOS executar. ; Espera tecla ser pressionada e coloca seu valor em A LD C,CONIN ; Indica a função que pega uma tecla CALL BDOS ; Chama BDOS LD (VAR1),A ; Grava o valor da tecla na MEMORIA. ; Mostra a resposta LD DE,RESP1 ; Indica texto da resposta LD C,STROUT ; Indica função de mostrar texto do BDOS CALL BDOS ; Manda o BDOS executar. LD A,(VAR1) ; Copia para A o conteúdo de VAR1 LD E,A ; Copia para E o conteúdo de A LD C,CONOUT ; Indica a função exibe um caractere na tela CALL BDOS ; Chama BDOS JP 0 ; Volta ao MSX-DOS NOMEDOPRG: DB 'Programa 2 - Conversando com o usuario',13,10,'$' AUTOR: DB ' Por Daniel Caetano',13,10,10,'$' PERGU1: DB ' Pressione alguma tecla: $' RESP1: DB 13,10,10,' A tecla pressionada foi: $' VAR1: DB 0 END --- Cortar Aqui ---
Vocês devem ter reparado uma certa repetição, ao menos na parte de mostrar algum texto:
; Mostra nome do programa LD DE,NOMEDOPRG ; Indica texto do nome do programa LD C,STROUT ; Indica função de mostrar texto do BDOS CALL BDOS ; Manda o BDOS executar. ; Mostra nome do programador LD DE,AUTOR ; Indica texto do nome do autor LD C,STROUT ; Indica função de mostrar texto do BDOS CALL BDOS ; Manda o BDOS executar. ; Mostra a pergunta LD DE,PERGU1 ; Indica texto da pergunta LD C,STROUT ; Indica função de mostrar texto do BDOS CALL BDOS ; Manda o BDOS executar. ; Mostra a resposta LD DE,RESP1 ; Indica texto da resposta LD C,STROUT ; Indica função de mostrar texto do BDOS CALL BDOS ; Manda o BDOS executar.
Preste atenção na padronização. Podemos dizer que em todas essas chamadas, tem uma parte que não muda jamais:
; Comentário LD DE,xxxx ; Indica texto LD C,STROUT ; Indica função de mostrar texto do BDOS CALL BDOS ; Manda o BDOS executar.
Como dá pra observar, apenas UM parâmetro muda numa seqüência inteira
de instruções. Esse parâmetro é justamente o endereço do texto. Bem, e se a gente
transformasse esse bloco todo em algo que pudesse ser chamado com apenas um comando?
É o que nos vamos aprender a fazer agora... vamos criar uma função NOSSA,
nossa primeira função. A primeira coisa que precisamos definir em uma função é o seu
nome. Essa função faz exatamente o que? Mostra um texto, não é? Que tal darmos o nome
MOSTRATXT para ela? Numa primeira etapa nossa função fica assim:
MOSTRATXT
Mas... isso vai dar erro, seguramente, no nosso assemblador. Precisamos
dar um jeito de dizer a ele que raios significa esse "MOSTRATXT". E como fazemos
isso? Dizendo a ele que ele que este é um ponto de entrada, ou, de forma mais simples,
que esta é uma função. E como dizemos isso a ele?
Usando o caractere ":" na frente do nome da função:
MOSTRATXT:
Isso já vai passar, ao menos, no nosso assemblador. Bem, também é conveniente colocar alguns comentários no inicio da função, dizendo o que esta função faz:
;------ ; MOSTRATXT - Função que mostra um texto cuja seqüência é terminada por '$'. ;------ MOSTRATXT:
Já começou a ficar com uma aparência melhor, não? Bem, agora a gente pega e joga o nosso código dentro:
;------ ; MOSTRATXT - Função que mostra um texto cuja seqüência é terminada por '$'. ;------ MOSTRATXT: ; Comentário LD DE,xxxx ; Indica texto LD C,STROUT ; Indica função de mostrar texto do BDOS CALL BDOS ; Manda o BDOS executar.
Bem, esse primeiro comentário pode ser suprimido, já que não acrescenta nada neste lugar (a função dele já é feita pela descrição da função).
;------ ; MOSTRATXT - Função que mostra um texto cuja seqüência é terminada por '$'. ;------ MOSTRATXT: LD DE,xxxx ; Indica texto LD C,STROUT ; Indica função de mostrar texto do BDOS CALL BDOS ; Manda o BDOS executar.
Alem disso, o LD DE,xxxx é algo que muda sempre, então também deve ser retirado daí, e é um valor que já deve vir pronto de fora. Ao suprimirmos essa linha, devemos acrescentar um comentário na descrição da função, dizendo que o texto deve estar indicado em DE, e teremos como resultado:
;------ ; MOSTRATXT - Função que mostra um texto cuja seqüência é terminada por '$'. ; Entrada: DE - Aponta para seqüência a ser mostrada, terminada por '$' ;------ MOSTRATXT: LD C,STROUT ; Indica função de mostrar texto do BDOS CALL BDOS ; Manda o BDOS executar.
E pronto, nossa função está pronta. A questão é: onde vamos colocar
isso em nosso programa? Um bom lugar é entre o fim do nosso programa (JP 0) e as
variáveis.
Vamos fazer isso?
--- Cortar Aqui --- BDOS EQU 5 CONIN EQU 1 CONOUT EQU 2 STROUT EQU 9 START: ; Mostra nome do programa LD DE,NOMEDOPRG ; Indica texto do nome do programa LD C,STROUT ; Indica função de mostrar texto do BDOS CALL BDOS ; Manda o BDOS executar. ; Mostra nome do programador LD DE,AUTOR ; Indica texto do nome do autor LD C,STROUT ; Indica função de mostrar texto do BDOS CALL BDOS ; Manda o BDOS executar. ; Mostra a pergunta LD DE,PERGU1 ; Indica texto da pergunta LD C,STROUT ; Indica função de mostrar texto do BDOS CALL BDOS ; Manda o BDOS executar. ; Espera tecla ser pressionada e coloca seu valor em A LD C,CONIN ; Indica a função que pega uma tecla CALL BDOS ; Chama BDOS LD (VAR1),A ; Grava o valor da tecla na MEMORIA. ; Mostra a resposta LD DE,RESP1 ; Indica texto da resposta LD C,STROUT ; Indica função de mostrar texto do BDOS CALL BDOS ; Manda o BDOS executar. LD A,(VAR1) ; Copia para A o conteúdo de VAR1 LD E,A ; Copia para E o conteúdo de A LD C,CONOUT ; Indica a função exibe um caractere na tela CALL BDOS ; Chama BDOS JP 0 ; Volta ao MSX-DOS ;------ ; MOSTRATXT - Função que mostra um texto cuja seqüência é terminada por '$'. ; Entrada: DE - Aponta para seqüência a ser mostrada, terminada por '$' ;------ MOSTRATXT: LD C,STROUT ; Indica função de mostrar texto do BDOS CALL BDOS ; Manda o BDOS executar. NOMEDOPRG: DB 'Programa 3 - Otimizando a estruturá,13,10,'$' AUTOR: DB ' Por Daniel Caetano',13,10,10,'$' PERGU1: DB ' Pressione alguma tecla: $' RESP1: DB 13,10,10,' A tecla pressionada foi: $' VAR1: DB 0 END --- Cortar Aqui ---
Pronto! Nosso programa já tem uma função agora. Experimente salvar esse
texto como PROG3.MAC e assembla-lo com o já manjado CL80 PROG3 e depois executa-lo no
BrMSX como explicado no inicio desta aula. Funcionou, não? Claro que sim, mas se você
observar, não ganhamos nada com isso. Na verdade, perdemos. Nosso programa ficou maior e
mais confuso de ler.
Mas isso só aconteceu devido ao fato de que não acrescentamos a função em nosso
programa, mas ainda não a utilizamos! Para que nosso programa ganhe benefícios desta
função, precisamos modificar as partes dele para que estas se utilizem da função. E
como fazemos isso? Bem, peguemos cada parte do programa que se assemelhe a:
; Mostra nome do programa LD DE,NOMEDOPRG ; Indica texto do nome do programa LD C,STROUT ; Indica função de mostrar texto do BDOS CALL BDOS ; Manda o BDOS executar.
E faca com que fique na forma:
; Mostra nome do programa LD DE,NOMEDOPRG ; Indica texto do nome do programa CALL MOSTRATXT ; Mostra texto
O que indica que usamos a instrução CALL para chamar a nossa função.
Quando o Z80 for executar esses comandos, o que ele vai fazer? Ele vai
carregar DE com NOMEDOPRG:
LD DE,NOMEDOPRG
Depois ele vai pular para a função MOSTRATXT, onde ele vai encontrar uma instrução dizendo para ele carregar C com STROUT:
LD C,STROUT
E finalmente vai mandar o BDOS executar a nossa função:
CALL BDOS
Ou seja, no fim das contar, para o Z80 o programa continuou o mesmo, a menos do fato as instruções agora estão 'espalhadas' pelo programa. Se mudarmos todas as partes que estão na forma:
; Comentário LD DE,xxxx ; Indica texto LD C,STROUT ; Indica função de mostrar texto do BDOS CALL BDOS ; Manda o BDOS executar.
para
; Comentário LD DE,xxxx ; Indica texto CALL MOSTRATXT ; Mostra texto
Ficaremos com o programa assim:
--- Cortar Aqui --- BDOS EQU 5 CONIN EQU 1 CONOUT EQU 2 STROUT EQU 9 START: ; Mostra nome do programa LD DE,NOMEDOPRG ; Indica texto do nome do programa CALL MOSTRATXT ; Mostra texto ; Mostra nome do programador LD DE,AUTOR ; Indica texto do nome do autor CALL MOSTRATXT ; Mostra texto ; Mostra a pergunta LD DE,PERGU1 ; Indica texto da pergunta CALL MOSTRATXT ; Mostra texto ; Espera tecla ser pressionada e coloca seu valor em A LD C,CONIN ; Indica a função que pega uma tecla CALL BDOS ; Chama BDOS LD (VAR1),A ; Grava o valor da tecla na MEMORIA. ; Mostra a resposta LD DE,RESP1 ; Indica texto da resposta CALL MOSTRATXT ; Mostra texto LD A,(VAR1) ; Copia para A o conteúdo de VAR1 LD E,A ; Copia para E o conteúdo de A LD C,CONOUT ; Indica a função exibe um caractere na tela CALL BDOS ; Chama BDOS JP 0 ; Volta ao MSX-DOS ;------ ; MOSTRATXT - Função que mostra um texto cuja seqüência é terminada por '$'. ; Entrada: DE - Aponta para seqüência a ser mostrada, terminada por '$' ;------ MOSTRATXT: LD C,STROUT ; Indica função de mostrar texto do BDOS CALL BDOS ; Manda o BDOS executar. NOMEDOPRG: DB 'Programa 3 - Otimizando a estruturá,13,10,'$' AUTOR: DB ' Por Daniel Caetano',13,10,10,'$' PERGU1: DB ' Pressione alguma tecla: $' RESP1: DB 13,10,10,' A tecla pressionada foi: $' VAR1: DB 0 END --- Cortar Aqui ---
E o programa já ficou mais limpo. No entanto, percebemos que aqueles comentários de blocos tão pertinentes anteriormente agora estão mais poluindo o nosso programa do que ajudando. Podemos modifica-los de forma que continuem explicando o que está acontecendo, sem que fiquem poluindo tudo. Isso pode ser conseguido assim:
--- Cortar Aqui --- BDOS EQU 5 CONIN EQU 1 CONOUT EQU 2 STROUT EQU 9 START: ; Mostra informações do programa e faz pergunta LD DE,NOMEDOPRG ; Indica texto do nome do programa CALL MOSTRATXT ; Mostra texto LD DE,AUTOR ; Indica texto do nome do autor CALL MOSTRATXT ; Mostra texto LD DE,PERGU1 ; Indica texto da pergunta CALL MOSTRATXT ; Mostra texto ; Espera tecla ser pressionada e coloca seu valor em A LD C,CONIN ; Indica a função que pega uma tecla CALL BDOS ; Chama BDOS LD (VAR1),A ; Grava o valor da tecla na MEMORIA. ; Mostra a resposta LD DE,RESP1 ; Indica texto da resposta CALL MOSTRATXT ; Mostra texto LD A,(VAR1) ; Copia para A o conteúdo de VAR1 LD E,A ; Copia para E o conteúdo de A LD C,CONOUT ; Indica a função exibe um caractere na tela CALL BDOS ; Chama BDOS JP 0 ; Volta ao MSX-DOS ;------ ; MOSTRATXT - Função que mostra um texto cuja seqüência é terminada por '$'. ; Entrada: DE - Aponta para seqüência a ser mostrada, terminada por '$' ;------ MOSTRATXT: LD C,STROUT ; Indica função de mostrar texto do BDOS CALL BDOS ; Manda o BDOS executar. NOMEDOPRG: DB 'Programa 3 - Otimizando a estruturá,13,10,'$' AUTOR: DB ' Por Daniel Caetano',13,10,10,'$' PERGU1: DB ' Pressione alguma tecla: $' RESP1: DB 13,10,10,' A tecla pressionada foi: $' VAR1: DB 0 END --- Cortar Aqui ---
Uau! Bem mais limpo, não? Sim. Experimente assemblar esse programa e
executa-lo, tanto no BrMSX quanto no MSX real. Não funcionou?
Bem, em ambos os casos ele deve ter mostrado o nome do programa, uma
seqüência de lixo e o computador deve ter travado ou voltado ao MSX-DOS. Por que isso
aconteceu? Vamos seguir o programa passo a passo e ver onde está o erro? Bem, o programa
começa com:
START: ; Mostra informações do programa e faz pergunta LD DE,NOMEDOPRG ; Indica texto do nome do programa
Jóia... até aqui o programa carregou a posição do texto em DE.
CALL MOSTRATXT ; Mostra texto
Agora ele chama a nossa função... vamos até lá?
MOSTRATXT: LD C,STROUT ; Indica função de mostrar texto do BDOS
Carregou o valor de STROUT em C...
CALL BDOS ; Manda o BDOS executar.
Chamou o BDOS... e ao voltar...
NOMEDOPRG: DB 'Programa 3 - Otimizando a estruturá,13,10,'$'
Epa! Tem alguma coisa errada aí. Não era para ele seguir por esse caminho, e sim voltar lá para cima e continuar com:
LD DE,AUTOR ; Indica texto do nome do autor
Não é mesmo? Sim, é... mas a gente precisa avisar o Z80 quando é pra voltar de um CALL. O comando que usamos para isso é o RET (RETurn, de retorne). Assim, precisamos, sempre que fazemos uma função, criar a instrução RET no fim da função. Nossa função deve então ser modificada para ficar assim:
;------ ; MOSTRATXT - Função que mostra um texto cuja seqüência é terminada por '$'. ; Entrada: DE - Aponta para seqüência a ser mostrada, terminada por '$' ;------ MOSTRATXT: LD C,STROUT ; Indica função de mostrar texto do BDOS CALL BDOS ; Manda o BDOS executar. RET ; Retorna
E o nosso programa fica assim:
--- Cortar Aqui --- BDOS EQU 5 CONIN EQU 1 CONOUT EQU 2 STROUT EQU 9 START: ; Mostra informações do programa e faz pergunta LD DE,NOMEDOPRG ; Indica texto do nome do programa CALL MOSTRATXT ; Mostra texto LD DE,AUTOR ; Indica texto do nome do autor CALL MOSTRATXT ; Mostra texto LD DE,PERGU1 ; Indica texto da pergunta CALL MOSTRATXT ; Mostra texto ; Espera tecla ser pressionada e coloca seu valor em A LD C,CONIN ; Indica a função que pega uma tecla CALL BDOS ; Chama BDOS LD (VAR1),A ; Grava o valor da tecla na MEMORIA. ; Mostra a resposta LD DE,RESP1 ; Indica texto da resposta CALL MOSTRATXT ; Mostra texto LD A,(VAR1) ; Copia para A o conteúdo de VAR1 LD E,A ; Copia para E o conteúdo de A LD C,CONOUT ; Indica a função exibe um caractere na tela CALL BDOS ; Chama BDOS JP 0 ; Volta ao MSX-DOS ;------ ; MOSTRATXT - Função que mostra um texto cuja seqüência é terminada por '$'. ; Entrada: DE - Aponta para seqüência a ser mostrada, terminada por '$' ;------ MOSTRATXT: LD C,STROUT ; Indica função de mostrar texto do BDOS CALL BDOS ; Manda o BDOS executar. RET ; Retorna NOMEDOPRG: DB 'Programa 3 - Otimizando a estruturá,13,10,'$' AUTOR: DB ' Por Daniel Caetano',13,10,10,'$' PERGU1: DB ' Pressione alguma tecla: $' RESP1: DB 13,10,10,' A tecla pressionada foi: $' VAR1: DB 0 END --- Cortar Aqui ---
Assemblando esse código e executando-o no MSX real ou no BrMSX, você
verá que agora ele funciona bem, ficou menor e mais fácil de ler. O ganho é maior
quanto mais vezes a repetição aparecer e maior for o trecho repetido.
Neste exemplo o ganho é até pequeno, mas este tipo de otimização, em um
programa complexo, pode ser a diferença entre ele ter um tamanho ou ser muito maior,
podendo chegar a ser seis, sete, n vezes maior.
Na aula que vem vamos aprender a usar o BrMSX para achar falhas como essa
falta do "RET" ao invés de ficar lendo o código até encontra-la por nos
mesmos, e também vamos aprender algo um pouco mais complicado, que é como otimizar ainda
mais o programa, transformando isso:
LD DE,NOMEDOPRG ; Indica texto do nome do programa CALL MOSTRATXT ; Mostra texto LD DE,AUTOR ; Indica texto do nome do autor CALL MOSTRATXT ; Mostra texto LD DE,PERGU1 ; Indica texto da pergunta CALL MOSTRATXT ; Mostra texto
Em algo mais otimizado, visto que você deve ter observado que isso segue uma lógica bem explicita, principalmente se você observar que os valores variáveis (NOMEDOPRG, AUTOR e PERGU1) estão assim na memória:
NOMEDOPRG: DB 'Programa 3 - Otimizando a estruturá,13,10,'$' AUTOR: DB ' Por Daniel Caetano',13,10,10,'$' PERGU1: DB ' Pressione alguma tecla: $'
Até lá, espero que mais rapidamente, finalmente livre das enfermidades.
Quaisquer duvidas, enviem para a lista, eu ou qualquer um dos programadores
da lista responderão tão breve quanto possível.
Abraços,
Daniel Caetano.
PS: Sugestões e comentários são bem-vindos. (^=