Explorar E-books
Categorias
Explorar Audiolivros
Categorias
Explorar Revistas
Categorias
Explorar Documentos
Categorias
J executamos alguns comandos de adio, subtrao, diviso, multiplicao, movimento e exibio de dados utilizando o DEBUG (modo DOS). Com ele, tivemos contato com as INSTRUES, seus OPCODES e os respectivos MNEMNICOS (instrues). No final da ltima aula, vimos a seqncia de edio, compilao, ligao e execuo de programas em Assembly. Neste processo de desenvolvimento de programas em linguagem Assembly, uma das ferramentas mais utilizadas e importantes o DEBUG, pois alm de nos possibilitar a construo de programas, ele permite a verificao (depois de compilado e ligado) de um programa em execuo, permitindo o controle da execuo, como por exemplo, execuo passo a passo. No se importando ainda com a estrutura e os comandos da linguagem Assembly, vamos digitar o programa abaixo que carregar dois registradores, AX e BX, com os valores 000B e 00A1 e far a soma desses dois valores, e armazenar o resultado em AX. Logo em seguida, carregar o valor 0005 em BX e far a subtrao com o resultado obtido na operao anterior, armazenando o resultado em AX. E por fim, o programa encerrar sua execuo, devolvendo o controle ao Sistema Operacional. Programa 7.1
TITLE PRM71:ADICAO E SUBTRACAO ;Programa para ilustrao do programa DEBUG .MODEL SMALL .STACK 100H .CODE MAIN PROC MOV AX,000BH ;carrega o primeiro valor em AX MOV BX,00A1H ;carrega o segundo valor em BX ADD AX,BX ;soma os dois valores e armazena ; o resultado em AX MOV BX,0005H ;carrega o terceiro valor em BX SUB AX,BX ;subtrai o terceiro valor do resultado ; da operao anterior MOV AH,4CH ;cdigo para devolver o controle p/ DOS INT 21H ;interrupo que executa a funo em AH MAIN ENDP END MAIN
LIGAO:
C:\TASM>TLINK PRM71.OBJ <enter> Turbo Link Version 7.1.30.1. Copyright (c) 1987, 1996 Borland International
EXECUO:
C:\TASM>PRM71 <enter> C:\TASM>_
Como podemos perceber, nada visvel aconteceu. Mas as operaes foram executadas, adequadamente? Como podemos verificar isto? Uma das formas utilizando o programa DEBUG Digite na linha de comando logo aps a execuo:
C:\TASM>DEBUG PRM71.EXE -
Agora o programa DEBUG est em execuo. Mas executando o qu? O programa PRM71.EXE !! Utilizando os comandos do programa DEBUG que j vimos anteriormente,vamos verificar a situao dos registradores:
Tecle R <enter>
-R AX=0000 BX=0000 DS=152B ES=152B 153B:0000 B80B00 CX=0011 DX=0000 SP=0100 SS=153D CS=153B IP=0000 MOV AX,000B BP=0000 SI=0000 DI=0000 NV UP EI PL NZ NA PO NC
Como podemos notar, os registradores de dados esto zerados e a prxima instruo a ser executada a instruo MOV AX,000B (a primeira instruo do nosso programa PRM71.EXE !!) Estamos, portanto, dentro da execuo do programa. Vamos executar a instruo corrente com o comando T (trace).
-T AX=000B BX=0000 DS=152B ES=152B 153B:0003 BBA100 CX=0011 DX=0000 SP=0100 SS=153D CS=153B IP=0003 MOV BX,00A1 BP=0000 SI=0000 DI=0000 NV UP EI PL NZ NA PO NC
Note que aps a execuo da instruo corrente (T), o registrador AX agora armazena o valor 000B como queramos. Veja que a instruo corrente agora MOV BX,00A1 (segunda instruo no programa PRM71.EXE!!) E assim, executando instruo a instruo, ou executando um determinado trecho de programa (at posio final, com o comando G) podemos verificar se tudo o que programamos est sendo executado adequadamente. A ttulo de ilustrao, abaixo segue a execuo do programa utilizando os comandos T e G.
-T AX=000B BX=00A1 DS=152B ES=152B 153B:0006 03C3 -T AX=00AC BX=00A1 DS=152B ES=152B 153B:0008 BB0500 CX=0011 DX=0000 SP=0100 SS=153D CS=153B IP=0006 ADD AX,BX CX=0011 DX=0000 SP=0100 SS=153D CS=153B IP=0008 MOV BX,0005 BP=0000 SI=0000 DI=0000 NV UP EI PL NZ NA PO NC
-T AX=00AC BX=0005 DS=152B ES=152B 153B:000B 2BC3 -T AX=00A7 BX=0005 DS=152B ES=152B 153B:000D B44C -G
CX=0011 DX=0000 SP=0100 SS=153D CS=153B IP=000B SUB AX,BX CX=0011 DX=0000 SP=0100 SS=153D CS=153B IP=000D MOV AH,4C
Mesmo agora tendo o controle, podendo verificar o que est ocorrendo no processador a cada instruo, essa forma de trabalho no muito utilizada (pela visibilidade limitada). Existe um outro programa DEBUG, chamado TURBO DEBUGGER da Borland. A partir de agora, vamos utiliz-lo. Entretanto, para faz-lo, no processo de COMPILAOLIGAO, temos que informar ao compilador e ao ligador (linker) que carregue, juntamente com o cdigo, informaes para que o programa TURBO DEBUGGER possa controlar a execuo do programa. Para tanto, no processo de compilao, utilize a diretiva /zi . E no processo de ligao, utilize a diretiva /v Dessa forma, a compilao e ligao do programa PRM71.ASM ficaria da seguinte forma:
C:\TASM>TASM /zi PRM71.ASM <enter> Turbo Assembler Version 4.1 Copyright (c) 1988, 1996 Borland International Assembling file: Error messages: Warning messages: Passes: Remaining memory: PRM71.ASM None None 1 411k
C:\TASM>TLINK /v PRM71.OBJ <enter> Turbo Link Version 7.1.30.1. Copyright (c) 1987, 1996 Borland International C:\TASM>
Pronto! Agora nosso programa PRM71.EXE possui informaes que possibilitaro ao TD (Turbo Debugger) gerenciar a execuo do cdigo. Para executar o programa com o Turbo Debugger, digite na linha de comando do DOS: TD <nome do programa.exe> No nosso caso: TD PRM71.EXE <enter> Se tudo der certo, voc ter a seguinte tela:
File Edit View Run Breakpoints Data Options Window Help READY []CPU 804861[][] cs:0000B80B00 mov ax,000B ax 0000 c=0 cs:0003 BBA100 mov bx,00A1 bx 0000 z=0 cs:0006 03C3 add ax,bx cx 0000 s=0 cs:0008 BB0500 mov bx,0005 dx 0000 o=0 cs:000B 2BC3 sub ax,bx si 0000 p=0 cs:000D B44C mov ah,4C di 0000 a=0 cs:000F CD21 int 21 bp 0000 i=1 cs:0011 0000 add [bx+si],al sp 0100 d=0 cs:0013 0000 add [bx+si],al ds 5C6D cs:0015 0000 add [bx+si],al es 5C6D cs:0017 0000 add [bx+si],al ss 5C7F cs:0019 0000 add [bx+si],al cs 5C7D cs:001B 0000 add [bx+si],al ip 0000 ds:0000 CD 20 FF 9F 00 9A F0 FE ds:0008 1D F0 E6 01 4F 23 B0 01 O# ds:0010 4F 23 83 02 B3 1D 32 0F O#2 ss:0102 0403 ds:0018 01 01 01 00 02 FF FF FF ss:010052FB F1-Help F2-Bkpt F3-Mod F4-Here F5-Zoom F6-Next F7-Trace F8-Step F9-Run F10-Menu
<enter>
Esta a tela do TURBO DEBUGGER. Ela bem semelhante ao TURBO PASCAL!! Temos na primeira linha uma srie de opes de comandos. Na ltima linha as teclas de atalho para os comandos mais freqentes, tais como: F8 Step (executa o prximo comando um passo do programa), F9 Run (executa o programa at encontrar um final). Alm disso, pode-se ver que existem reas de exibio:
REGISTRADORES
File Edit View Run Breakpoints Data Options Window Help READY []CPU 804861[][] cs:0000B80B00 mov ax,000B ax 0000 c=0 cs:0003 BBA100 mov bx,00A1 bx 0000 z=0 cs:0006 03C3 add ax,bx cx 0000 s=0 cs:0008 BB0500 mov bx,0005 dx 0000 o=0 cs:000B 2BC3 sub ax,bx si 0000 p=0 cs:000D B44C mov ah,4C di 0000 a=0 cs:000F CD21 int 21 bp 0000 i=1 cs:0011 0000 add [bx+si],al sp 0100 d=0 cs:0013 0000 add [bx+si],al ds 5C6D cs:0015 0000 add [bx+si],al es 5C6D cs:0017 0000 add [bx+si],al ss 5C7F cs:0019 0000 add [bx+si],al cs 5C7D cs:001B 0000 add [bx+si],al ip 0000 ds:0000 CD 20 FF 9F 00 9A F0 FE ds:0008 1D F0 E6 01 4F 23 B0 01 O# ds:0010 4F 23 83 02 B3 1D 32 0F O#2 ss:0102 0403 ds:0018 01 01 01 00 02 FF FF FF ss:010052FB F1-Help F2-Bkpt F3-Mod F4-Here F5-Zoom F6-Next F7-Trace F8-Step F9-Run F10-Menu
FLAGS
Observe que no segmento do cdigo, o ponteiro (que no segmento de registradores identificado por IP Instruction Pointer) aponta para a instruo MOV AX,000B, ou seja, a primeira instruo... a instruo que ser executada. Vamos execut-la... Pressione F8 e observe o que aconteceu...
File Edit View Run Breakpoints Data Options Window Help READY []CPU 804861[][] cs:0000 B80B00 mov ax,000B ax 000B c=0 cs:0003BBA100 mov bx,00A1 bx 0000 z=0 cs:0006 03C3 add ax,bx cx 0000 s=0 cs:0008 BB0500 mov bx,0005 dx 0000 o=0 cs:000B 2BC3 sub ax,bx si 0000 p=0 cs:000D B44C mov ah,4C di 0000 a=0 cs:000F CD21 int 21 bp 0000 i=1 cs:0011 0000 add [bx+si],al sp 0100 d=0 cs:0013 0000 add [bx+si],al ds 5C6D cs:0015 0000 add [bx+si],al es 5C6D cs:0017 0000 add [bx+si],al ss 5C7F cs:0019 0000 add [bx+si],al cs 5C7D cs:001B 0000 add [bx+si],al ip 0003 ds:0000 CD 20 FF 9F 00 9A F0 FE ds:0008 1D F0 E6 01 4F 23 B0 01 O# ds:0010 4F 23 83 02 B3 1D 32 0F O#2 ss:0102 0403 ds:0018 01 01 01 00 02 FF FF FF ss:010052FB F1-Help F2-Bkpt F3-Mod F4-Here F5-Zoom F6-Next F7-Trace F8-Step F9-Run F10-Menu
Teste tambm os comandos (opo RUN no menu): Run Run (Executa todo o cdigo)
Run Go to cursor (Reset o cdigo (Run Program Reset). Selecione a 4 linha de instruo com o ponteiro do mouse. Execute novamente o cdigo, com a opo Rn Go to cursor. Observe que agora ele parou onde voc tinha selecionado. Run Animated Reset o cdigo. Execute o programa com Run Animated. Coloque um tempo igual a 20 e tecle Ok. Breakpoints Toggle (estabelea um ponto de parada no endereo 000B. Depois Reset o programa (Run Program Reset). E logo em seguida execute-o com Run Run. Veja que agora o programa executado at o ponto de parada estabeledido. Depois, com mais calma, como exerccio, explore as outras opes do TD. Exerccio 1. Crie um programa em Assembly para somar dois valores (A001h e 00C1h). A este resultado, deve ser subtrado o valor de 00FFh. Em seguida, coloque o resultado nos registradores BX e CX. Termine o programa, devolvendo o controle para o DOS. Depois disso, compile, ligue e execute o programa. Em seguida, faa novamente a compilao e a ligao com as opes para execuo do programa com o Turbo Debugger. Execute o programa, passo-a-passo, e verifique se as operaes so executadas.
Exemplo:
START: MOV CX,5 ;inicializa o contador
Esses campos devem ser separados por espao(s) ou tab START um rtulo. b) Campo Nome Pode ser um rtulo de instruo, um nome de subrotina, um nome de varivel, contendo de 1 a 31 caracteres, iniciando por uma letra e contendo somente letras, nmeros e os caracteres ? . @ _ : $ % . Exemplos: LOOP1: .TEST @caracter SOMA_TOTAL4 $100
nomes vlidos
nomes invlidos
Observao: O Montador traduz os nomes por endereos de memria. c) Dados do Programa Nmeros:
binrio: 1110101b ou 1110101B decimal: 64223 ou 64223d ou 64223D, 1110101 considerado decimal (ausncia do B), -2184D (nmero negativo) hexa: 64223h ou 64223H, 0FFFFh (comea com um decimal e termina com h), 1B4Dh
Variveis:
Variveis Byte:
Nome DB valor_inicial
Exemplo:
ALPHA TESTE DB DB 4 ?
Variveis Word
Nome DW valor_inicial
Exemplos:
WRD TESTE DW DW -2 ?
Constantes:
EQU (Equates)
Nome EQU EQU constante 0AH
Exemplo:
LF
Isto associa a LF (constante) o valor em hexa 0A, que corresponde ao cdigo ascii do caracter Line Feed. d) Instrues Bsicas: Movimentao de dados: MOV usado para transferir dados entre registradores, entre registradores e memria e para mover valores concretos (nmeros) para registradores e locais de memria.
Exemplos:
Exemplos:
Exemplos:
ADD ADD SUB SUB ADD AX,DX WRD,AX AX,BX WRD,AX AL,5
Exemplos:
INC DEC INC INC DEC DEC WORD1 BYTE1 AX AL AX BL
Exemplo 1:
B = A
Exemplo 2:
Exemplo 3:
Exerccio 2: Quais nomes abaixo so ilegais para a linguagem Assembly no IBM-PC? a) TWO_WORDS b) ?1 c) Two words d) .@? e) $145 f) LETS_GO g) T = . Exerccio 3: Quais dos nmeros abaixo so ilegais? Se so legais, diga se sero tratados como binrio, decimal ou hexa a) 246 b) 246h c) 1001 d) 1,101 e) 2A3h f) FFFEh g) 0Ah h) Bh i) 1110b Exerccio 4: Suponha que os dados abaixo esto armazenados, iniciando no offset (deslocamento) 0000h:
A B C DB DW DB 7 1ABCh HELLO
a) b) c) d)
D D D D
o o o o
de do do de
offset associado s variveis A,B,C byte no offset 0002h byte no offset 0004h offset do caracter O in HELLO.
Exerccio 5: Usando apenas MOV, ADD, SUB, INC e DEC, traduza as expresses abaixo em linguagem de alto-nvel para linguagem Assembly. a) A = B A b) C = A + B c) B = 3 X B + 7
Digite este documento em um Editor de texto puro (por exemplo o Bloco de Notas). Salve o documento com um nome significativo e com a extenso .ASM. Por exemplo: Ex01.ASM Faa a compilao (TASM) e a ligao (TLINK). Em seguida, execute o arquivo e verifique se ele mostra o caracter * na tela.
Neste programa foi apresentado o comando INT 21H. Este comando pode ser utilizado para realizar uma srie de funes do DOS. A funo que ser executada tem o seu cdigo (nmero) armazenado em AH (indicando o que deve ser feito). Dependendo da funo a ser executada, deve-se utilizar outros registradores para guardar a informao de entrada e sada. No nosso exemplo, est sendo executada a funo de escrita na sada padro (cdigo 2 em AH). Esta funo requer algo a ser exibido na sada padro, que no caso deve, sempre para esta funo, ser armazenado em DL (no caso o caracter *). Em Resumo: 02H - Funo para exibio de um caracter. Entradas AH = 2 DL = cdigo ASCII do caracter a ser exibido Sadas AL = cdigo ASCII do caracter exibido
Exerccio 6: Faa um programa para exibir um caracter e logo em seguida o programa deve soar um bip. Dica: Cdigo ASCII de = 01h e Bip = 07h
Vamos montar um segundo programa, que agora ir solicitar a digitao de um caracter. Depois de digitada uma determinada tecla, o caracter correspondente ser exibido na tela. Em seguida, vamos exibir novamente este mesmo caracter, separado por um hfen do primeiro.
Como voc j pode deduzir, acabamos de envidenciar mais uma funo do DOS que pode ser utilizada: entrada de caracter. 01H - Funo para Leitura (entrada) de uma tecla. Entradas AH = 1 Sadas AL = cdigo ASCII da tecla pressionada = 0 se tecla no-caracter Usamos nos dois programas anteriores uma terceira funo: Retorno do controle ao Sistema Operacional.
Acho que vocs j sabem do que estou falando: 4CH - Funo para retorno ao S.O. (DOS) Entradas AH = 4CH AL = cdigo de retorno Sadas Nenhuma Exerccio 7: Faa um programa programa para receber uma tecla (caracter) e mostr-lo na linha seguinte entre asterisco. Por exemplo: Se voc teclou A, ele exibir:
Ex07 <enter> A *A*
Vamos agora, montar um programa para exibir uma seqncia de caracteres (conhecida como String). Para faz-lo, devemos armazenar esta String em um local de memria. Digamos em uma varivel chamada MSG:
MSG DB HELLO!$
Note que o ltimo caracter da mensagem $. Este caracter indica o final da string para o S.O. e ele no exibido. Bem, mas agora como podemos exibir esta mensagem? Devemos utilizar uma funo do DOS que faz esta tarefa: Exibio de uma String. 09H Funo para exibio de um String Entradas AH = 9 DX = endereo de offset da String Sadas Nenhuma Temos um problema: como vamos carregar em DX o endereo de offset da String? Uma das formas de se fazer isso utilizando o comando LEA.
LEA acrnico de Load Effective Address, ou seja, carrega o endereo efetivo de algo (offset).
LEA destino, fonte
Assim, ele colocar o endereo da fonte no destino (por exemplo o registrador DX). Voltando ao nosso exemplo, onde colocamos a nossa mensagem na varivel MSG, teramos o seguinte comando:
LEA DX,MSG
Mas ainda temos um problema... Quando um programa carregado na memria, o DOS cria e faz uso de um segmento de memria de 256 bytes que contem informaes sobre o programa (este segmento conhecido como PSP program segment prefix). Com isso, o DOS coloca o nmero deste segmento nos registradores DS e ES antes de executar o programa. O resultado disso que, no incio do programa, DS no contm o endereo do segmento de dados. Dessa forma, devemos colocar em DS o endereo correto do segmento de dados corrente. Para tanto, usamos:
MOV AX,@DATA MOV DS,AX
@DATA o nome do segmento de dados definido em .DATA O Assembly traduz @DATA para o nmero do segmento. Um outro detalhe que no podemos mover este nmero diretamente para DS. Por isso temos que utilizar duas instrues. Pronto! Agora s construir o programa!!
Exerccio 8: Escreva um programa para: (a) mostrar um character ?; (b) ler dois dgitos decimais cuja soma seja < 10; (c) mostre-os e o resultado de sua soma na linha seguinte, com uma mensagem apropriada, por exemplo: ?27
A SOMA DE 2 E 7 EH 9
Exerccio 9: Escreva um programa para: (a) Apresentar uma mensagem: entre com trs iniciais: (b) Ler a primeira, a segunda e a terceira iniciais (c) Apresent-las, uma em cada linha, conforme exemplo abaixo:
Entre com tres iniciais: JFK J F K
Exerccio 10: Escreva um programa para apresentar uma caixa de 10x10 asteriscos.