UNIVERSIDADE DA BEIRA INTERIOR Faculdade de Engenharia | Departamento de Informática Arquitectura Computadores II
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"; org 100h 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 int 21h dec [cont] jnz ciclo mov ah, 07h int 21h mov ah, 4ch int 21h 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; org 100h 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 2014/2015
Nuno Pombo |
[email protected] Paulo Fazendeiro|
[email protected]
UNIVERSIDADE DA BEIRA INTERIOR Faculdade de Engenharia | Departamento de Informática Arquitectura Computadores II 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 bx,ecran mov cx,1 mov dx, dezenas int 21h sub byte[dezenas],48 ;algarismo das unidades add byte[unidades],48 ;converte para ASCII mov ah,escrever mov bx,ecran mov cx,1 mov dx, unidades int 21h sub byte[unidades],48 ;mudar de linha mov ah,escrever mov bx,ecran mov cx,01 mov dx,novalinha int 21h dec [cont] jnz ciclo ;para o programa parar mov ah, ler int 21h ;terminar (retorno ao SO) mov ah, terminar int 21h ;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; org 100h escrita equ 40h ;escrita ecran equ 01 ;ecran leitura equ 3Fh ;leitura teclado equ 00 ;teclado CR equ 0Dh ;Carriage Return 2014/2015
Nuno Pombo |
[email protected] Paulo Fazendeiro|
[email protected]
UNIVERSIDADE DA BEIRA INTERIOR Faculdade de Engenharia | Departamento de Informática Arquitectura Computadores II LF equ 0Ah ;Line Feed terminar equ 4Ch ;terminar ;pedir um número mov ah,escrita mov bx,ecran mov cx,16 mov dx,pergunta_primeiro_valor int 21h ;ler o valor do teclado (um só algarismo, 0..9) mov ah,leitura ;ler mov bx,teclado ;do teclado mov cx,01 ;nº de bytes a ler mov dx,primeiro_valor ;aponta para a variável que guarda os dados lidos int 21h ;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 int 21h sub byte[primeiro_valor],48 ;pedir um número mov ah,escrita mov bx,ecran mov cx,16 mov dx,pergunta_segundo_valor int 21h ;ler o valor do teclado (um só algarismo, 0..9) mov ah,leitura ;ler mov bx,teclado ;do teclado mov cx,01 ;nº de bytes a ler mov dx,segundo_valor ;aponta para a variável que guarda os dados lidos int 21h ;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 ;int 21h sub byte[segundo_valor],48 mov al,[primeiro_valor] add al,[segundo_valor] mov [soma],ax ;guarda a soma
2014/2015
Nuno Pombo |
[email protected] Paulo Fazendeiro|
[email protected]
UNIVERSIDADE DA BEIRA INTERIOR Faculdade de Engenharia | Departamento de Informática Arquitectura Computadores II ;separa as dezenas das unidades mov ax,[soma] mov dl,10 div dl mov [dezenas],al mov [unidades],ah ;escreve mensagem mov ah,escrita mov bx,ecran mov cx,12 mov dx,resultado int 21h ;escreve dezenas add byte[dezenas],48 mov ah,escrita mov bx,ecran mov cx,01 mov dx,dezenas int 21h ;escreve unidades add byte[unidades],48 mov ah,escrita mov bx,ecran mov cx,01 mov dx,unidades int 21h ;muda de linha mov ah,escrita mov bx,ecran mov cx,02 mov dx,mudalinha int 21h mov ah, 07h int 21h mov ah, terminar int 21h 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
2014/2015
Nuno Pombo |
[email protected] Paulo Fazendeiro|
[email protected]
UNIVERSIDADE DA BEIRA INTERIOR Faculdade de Engenharia | Departamento de Informática Arquitectura Computadores II
[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; org 100h 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 ah,escrita mov bx,ecran mov cx,8 mov dx,pergunta int 21h ;ler o valor do teclado (um só algarismo, 0..9) mov ah,leitura ;ler mov bx,teclado ;do teclado mov cx,01 ;nº de bytes a ler mov dx,valor ;aponta para a variável que guarda os dados lidos int 21h ;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 ;int 21h 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 ah,escrita mov bx,ecran mov cx,12 mov dx,resultado
2014/2015
Nuno Pombo |
[email protected] Paulo Fazendeiro|
[email protected]
UNIVERSIDADE DA BEIRA INTERIOR Faculdade de Engenharia | Departamento de Informática Arquitectura Computadores II int 21h ;escreve dezenas add byte[dezenas],48 mov ah,escrita mov bx,ecran mov cx,01 mov dx,dezenas int 21h ;escreve unidades add byte[unidades],48 mov ah,escrita mov bx,ecran mov cx,01 mov dx,unidades int 21h ;muda de linha mov ah,escrita mov bx,ecran mov cx,02 mov dx,mudalinha int 21h mov ah, 07h int 21h mov ah, terminar int 21h 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
2014/2015
Nuno Pombo |
[email protected] Paulo Fazendeiro|
[email protected]
UNIVERSIDADE DA BEIRA INTERIOR Faculdade de Engenharia | Departamento de Informática Arquitectura Computadores II
[FP4_1] Desenhar linha vertical org 100h 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 mov ah, 07h int 21h mov ah, terminar int 21h cont rb 1 ;vai controlar o tamanho da linha
2014/2015
Nuno Pombo |
[email protected] Paulo Fazendeiro|
[email protected]