Você está na página 1de 13

Programas Exemplos – Parte

II
Ronaldo Luiz Alonso
Terceiro Programa

• Este terceiro programa ilustra o uso de


subrotinas em assembly e também o uso
de intruções de loop.
• O programa principal, chama uma função,
chamada WRITE_CHAR que imprime um
caracter na tela. Esta função é chamada
repetidas vezes para imprimir todos os
caracteres de A até J.
Terceiro Programa
;nome do programa: tree.asm
.model small
.stack
.code
PRINT_A_J PROC
mov DL,'A' ;move o character A para o registrador DL
mov CX,10 ;move o valor decimal 10 para o registrador CX
;este valor é usado para fazer laço com 10 interações
PRINT_LOOP:
call WRITE_CHAR ;imprime o caracter em DL
inc DL ;incrementa o valor do registrador DL
loop PRINT_LOOP ;laço para imprimir 10 caracteres
mov AH,4Ch ;função 4Ch, para sair ao DOS
int 21h ;interrupção 21h
PRINT_A_J ENDP ;finaliza o procedimento

WRITE_CHAR PROC
mov AH,2h ;função 2h, imprime caracter
int 21h ;imprime o caracter que está em DL
ret ;retorna o controle ao procedimento que chamou
WRITE_CHAR ENDP ;finaliza o procedimento
END PRINT_A_J ;finaliza o programa

Note que o programa principal é um procedimento. O ponto de entrada é logo após


o .CODE, que define o segmento de código. Veja que para definir um procedimento
usamos as diretivas nome_procedimento PROC ... nome_procedimento ENDP.
Terceiro Programa
;nome do programa: tree.asm
.model small
.stack
.code
PRINT_A_J PROC
mov DL,'A' ;move o character A para o registrador DL
mov CX,10 ;move o valor decimal 10 para o registrador CX
;este valor é usado para fazer laço com 10 interações
PRINT_LOOP:
call WRITE_CHAR ;imprime o caracter em DL
inc DL ;incrementa o valor do registrador DL
loop PRINT_LOOP ;laço para imprimir 10 caracteres
mov AH,4Ch ;função 4Ch, para sair ao DOS
int 21h ;interrupção 21h
PRINT_A_J ENDP ;finaliza o procedimento

WRITE_CHAR PROC
mov AH,2h ;função 2h, imprime caracter
int 21h ;imprime o caracter que está em DL
ret ;retorna o controle ao procedimento que chamou
WRITE_CHAR ENDP ;finaliza o procedimento
END PRINT_A_J ;finaliza o programa

O parâmetro que é passado para a função WRITE_CHAR é justamente o registrador


DL pois a função 2h da int 21h imprime o caracter que está em DL. Note que a
instrução loop decrementa CX e pula para o label que a segue se CX não for zero.
Se CX for zero executa a instrução seguinte.
Quarto Programa

• Este programa pega dois digitos do teclado e


exibe sua soma.
• Ilustra o uso de operações aritméticas e
conversão ASCII para numérico.
• Inicialmente vamos mostrar uma versão
simplificada deste programa que não checa se o
caracter entrado é um dígito, em seguida uma
versão que checa se o caracter que foi entrado
é realmente um dígito.
Quarto Programa
; Turbo Assembler Copyright (c) 1988, 1991 By Borland International, Inc.

; SUM1.ASM – Soma dois caracteres (que se supõe ser números) sem verificação

; From the Turbo Assembler Users Guide - Getting started

.MODEL small
.STACK 100h
.DATA
newline DB 13,10,'$'
prompt1 DB 'Entre com o primeiro numero:',13,10,'$'
var1 DB 1
prompt2 DB 'Entre com o segundo numero:',13,10,'$'
var2 DB 1
prompt3 DB 'O resultado da soma eh:',13,10,'$'
var3 DB ' ',13,10,'$'

.CODE
mov ax,@data
mov ds,ax ;set DS to point to the data segment

mov ah,9 ;DOS print string function


mov dx,OFFSET prompt1 ;point to "Entre com o primeiro numero"
int 21h ; exibe a primeira mensagem

mov ah,1 ; funcao 1 da int 21 h, pega caracter com eco.


int 21h ; caracter que eu peguei, vai em al
sub al,30h ;subtrai 30h que é o código ascii do caracter 0.

mov [var1],al; salvo caracter que eu peguei em al.


Quarto Programa
mov ah,9 ; pulo uma linha
mov dx,OFFSET newline
int 21h

mov ah,9 ;DOS print string function


mov dx,OFFSET prompt2 ;Entre com o segundo numero
int 21h ;

mov ah,1 ; funcao 1 da int 21 h, pega caracter com eco.


int 21h ; caracter que eu peguei, vai em al
sub al,30h

mov [var2],al; estou supondo sem


;verificar que o caracter é um dígito

mov ah,9 ; vou pular linha


mov dx,OFFSET newline
int 21h
Quarto Programa
mov al,[var2] ;recupera em al o valor armazenado em var2
mov bl,[var1] ;recupera em bl o valor armazenado em var1
add al,bl ; soma al com bl, o resultado fica em al
add al,30h ; soma 30h com al, pois 30h é o código ASCII
mov [var3],al ; do caracter 0. Note que isso dá problema
; se a soma passar de 10!

mov ah,9 ;DOS print string function


mov dx,OFFSET prompt3 ;point to "o resultado é"
int 21h ;

mov ah,9
mov dx, OFFSET var3 ; exibe o resultado
int 21h

mov ah,9 ; vou pular linha


mov dx,OFFSET newline
int 21h

mov ah,4ch ;DOS terminate program function


int 21h ;terminate the program
END
Quinto Programa
• Esta é uma versão melhorada do quarto
programa. Agora verificamos se o
caracter que digitamos no teclado é ou
não um dígito.
• Se o caracter digitado não for um dígito,
pedimos para que o usuário do programa
redigite o caracter entrado.
Quinto Programa
; Turbo Assembler Copyright (c) 1988, 1991 By Borland International,
Inc.

; HELLO.ASM - Display the message "Hello World"

; From the Turbo Assembler Users Guide - Getting started

.MODEL small
.STACK 100h
.DATA
newline DB 13,10,'$'
prompt1 DB 'Entre com o primeiro numero:',13,10,'$'
var1 DB 1
prompt2 DB 'Entre com o segundo numero:',13,10,'$'
var2 DB 1
prompt3 DB 'O resultado da soma eh:',13,10,'$'
var3 DB ' ',13,10,'$'
prompt4 DB 'Caracter nao eh digito!',13,10,'$'
.CODE
mov ax,@data
mov ds,ax ;set DS to point to the data segment

FAZ_DE_NOVO1:
mov ah,9 ;DOS print string function
mov dx,OFFSET prompt1 ;point to "Entre com o primeiro numero"
int 21h ;display "Hello, world"

mov ah,1 ; funcao 1 da int 21 h, pega caracter com eco.


int 21h ; caracter que eu peguei, vai em al
sub al,30h

; verificar se o primeiro caracter pego é um digito


; tenho que verificar se o caracter em al, está entre 0 e 9.
jb NOT_DIGIT
cmp al,9
ja NOT_DIGIT
; senão é digito

mov [var1],al; salvo caracter que eu peguei em al.

jmp FINALIZA1
NOT_DIGIT:

mov ah,9 ;DOS print string function


mov dx,OFFSET prompt4 ;
int 21h ;display "Hello, world"
jmp FAZ_DE_NOVO1

FINALIZA2:

mov ah,9 ; vou pular linha


mov dx,OFFSET newline
int 21h

mov al,[var2]
mov bl,[var1]
add al,bl
add al,30h
mov [var3],al

mov ah,9 ;DOS print string function


mov dx,OFFSET prompt3 ;point to "o resultado é"
int 21h ;

mov ah,9
mov dx, OFFSET var3
int 21h

mov ah,9 ; vou pular linha


mov dx,OFFSET newline
int 21h
mov ah,4ch ;DOS terminate program function
int 21h ;terminate the program
FINALIZA1:
mov ah,9 ; vou pular uma linha
mov dx,OFFSET newline
int 21h

FAZ_DE_NOVO2:

mov ah,9 ;DOS print string function


mov dx,OFFSET prompt2 ;Entre com o segundo numero
int 21h ;display "Hello, world"

mov ah,1 ; funcao 1 da int 21 h, pega caracter com eco.


int 21h ; caracter que eu peguei, vai em al
sub al,30h

; tenho que verificar se o caracter em al, está entre 0 e 9.


jb NOT_DIGIT2
cmp al,9
ja NOT_DIGIT2

mov [var2],al; caracter é um digito

jmp FINALIZA2
NOT_DIGIT2:

mov ah,9 ;DOS print string function


mov dx,OFFSET prompt4 ;
int 21h ;display "Hello, world"
jmp FAZ_DE_NOVO2
FINALIZA2:

mov ah,9 ; vou pular linha


mov dx,OFFSET newline
int 21h

mov al,[var2]
mov bl,[var1]
add al,bl
add al,30h
mov [var3],al

mov ah,9 ;DOS print string function


mov dx,OFFSET prompt3 ;point to "o resultado é"
int 21h ;

mov ah,9
mov dx, OFFSET var3
int 21h

mov ah,9 ; vou pular linha


mov dx,OFFSET newline
int 21h
mov ah,4ch ;DOS terminate program function
int 21h ;terminate the program
END

Você também pode gostar