Exercícios Resolvidos Assembly NOTA: Seguem propostas para resolução dos exercícios das folhas práticas. Tenha em consideração que existem sempre diversas possibilidades para a resolução de um problema. [FP_N], em que FP é o número da folha prática e N é o número de exercício nessa folha prática. [FP2_1] Desenvolva um programa para escrever no ecrã 20 vezes a palavra "UBI"; escrita equ 40h ;função de escrita ecran equ 1 ;ecran mov [cont], 20 ciclo: mov ah, escrita mov bx, ecran mov cx, 4 mov dx, msg dec [cont] jnz ciclo mov ah, 4ch msg db "UBI", 10 cont rb 1 [FP2_2] Desenvolva um programa que contenha um ciclo em que a cada iteração escreve o próprio valor da variável de controlo. Considere que o ciclo se repete no máximo 9 vezes; escrever equ 40h ;função de escrita ler equ 07h ;função de leitura ecran equ 1 ;ecran terminar equ 4ch ;retorno ao SO mov [cont], 20 ciclo: ;separar a variável de controlo em dezenas/unidades mov ah,0 mov al,[cont] ;AX=dividendo mov dl,10 ;DL=divisor
div dl ;AL=quociente AH=resto mov [dezenas],al ;guarda o algarismo das dezenas mov [unidades],ah ;guarda o algarismo das unidades ;escrever algarismo das dezenas add byte[dezenas],48 ;converte para ASCII mov ah,escrever mov cx,1 mov dx, dezenas sub byte[dezenas],48 ;algarismo das unidades add byte[unidades],48 ;converte para ASCII mov ah,escrever mov cx,1 mov dx, unidades sub byte[unidades],48 ;mudar de linha mov ah,escrever mov dx,novalinha dec [cont] jnz ciclo ;para o programa parar mov ah, ler ;terminar (retorno ao SO) ;dados cont rb 1 dezenas rb 1 unidades rb 1 novalinha db 10 msg db "UBI" [FP3_1] Desenvolva um programa para ler do teclado dois números, entre 0 e 9 inclusive, e apresente no ecrã o valor da sua soma; escrita equ 40h ;escrita ecran equ 01 ;ecran leitura equ 3Fh ;leitura teclado equ 00 ;teclado CR equ 0Dh ;Carriage Return
LF equ 0Ah ;Line Feed terminar equ 4Ch ;terminar ;pedir um número mov cx,16 mov dx,pergunta_primeiro_valor ;ler o valor do teclado (um só algarismo, 0..9) mov ah,leitura ;ler mov bx,teclado ;do teclado ;nº de bytes a ler mov dx,primeiro_valor ;aponta para a variável que guarda os dados lidos ;consumir o CR+LF inseridos pelo teclado ;nada vai ser feito com eles mov ah,leitura mov bx,teclado mov cx,2 mov dx,crlf sub byte[primeiro_valor],48 ;pedir um número mov cx,16 mov dx,pergunta_segundo_valor ;ler o valor do teclado (um só algarismo, 0..9) mov ah,leitura ;ler mov bx,teclado ;do teclado ;nº de bytes a ler mov dx,segundo_valor ;aponta para a variável que guarda os dados lidos ;consumir o CR+LF inseridos pelo teclado ;nada vai ser feito com eles ;mov ah,leitura ;mov bx,teclado ;mov cx,2 ;mov dx,crlf ; sub byte[segundo_valor],48 mov al,[primeiro_valor] add al,[segundo_valor] mov [soma],ax ;guarda a soma
;separa as dezenas das unidades mov ax,[soma] mov dl,10 div dl mov [dezenas],al mov [unidades],ah ;escreve mensagem mov cx,12 mov dx,resultado ;escreve dezenas add byte[dezenas],48 mov dx,dezenas ;escreve unidades add byte[unidades],48 mov dx,unidades ;muda de linha mov cx,02 mov dx,mudalinha pergunta_primeiro_valor db 'Primeiro Valor? ' pergunta_segundo_valor db 'Segundo Valor? ' resultado db 10,'Resultado = ' mudalinha db CR,LF primeiro_valor rb 1 ;primeiro valor a ser lido do teclado segundo_valor rb 1 ;segundo valor a ser lido do teclado crlf rb 2 ;para ler o CR+LF do teclado soma rw 1 ;vai conter o quadrado de 'valor' dezenas rb 1 ;algarismo das dezenas unidades rb 1 ;algarismo das unidades
[FP3_2] Desenvolva um programa para ler do teclado um número, entre 0 e 9 inclusive, e apresente no ecrã o valor do seu quadrado; escrita equ 40h ;escrita ecran equ 01 ;ecran leitura equ 3Fh ;leitura teclado equ 00 ;teclado CR equ 0Dh ;Carriage Return LF equ 0Ah ;Line Feed terminar equ 4Ch ;terminar ;pedir um número mov cx,8 mov dx,pergunta ;ler o valor do teclado (um só algarismo, 0..9) mov ah,leitura ;ler mov bx,teclado ;do teclado ;nº de bytes a ler mov dx,valor ;aponta para a variável que guarda os dados lidos ;consumir o CR+LF inseridos pelo teclado ;nada vai ser feito com eles ;mov ah,leitura ;mov bx,teclado ;mov cx,2 ;mov dx,crlf ; sub byte[valor],48 mov al,[valor] mov bl,[valor] ;multiplica por si própio mul bl ;ax=al*bl=valor*valor mov [quadrado],ax ;guarda o quadrado ;separa as dezenas das unidades mov ax,[quadrado] mov dl,10 div dl mov [dezenas],al mov [unidades],ah ;escreve mensagem mov cx,12 mov dx,resultado
;escreve dezenas add byte[dezenas],48 mov dx,dezenas ;escreve unidades add byte[unidades],48 mov dx,unidades ;muda de linha mov cx,02 mov dx,mudalinha pergunta db 'Valor? ' resultado db 'Resultado = ' mudalinha db CR,LF valor rb 1 ;valor a calcular o quadrado crlf rb 2 ;para ler o CR+LF do teclado quadrado rw 1 ;vai conter o quadrado de 'valor' dezenas rb 1 ;algarismo das dezenas unidades rb 1 ;algarismo das unidades
[FP4_1] Desenhar linha vertical terminar equ 4ch ;selecciona modo de vídeo mov ah, 4FH mov al, 02 mov bx, 13h ;modo 13H int 10h ;desenha uma recta horizontal/vertical mov byte[cont], 100 ;tamanho da linha (em pixeis) ;coordenadas iniciais mov cx,50 ;coluna mov dx,50 ;linha ciclo: mov ah,0ch ;pixel mov al,2 ;verde mov bh,0 int 10h inc cx ;para a linha horizontal inc dx ;para a linha vertical dec byte[cont] jnz ciclo ;desenhar mais um pixel ;leitura dummy para parar o ecran cont rb 1 ;vai controlar o tamanho da linha