Relatório MC404 - Trabalho 2 - Prof. Rodolfo

Documentos relacionados
EEL Microprocessadores. Parâmetros e Variáveis Locais 4/5/2010. Capítulo 7 Livro Ziller. Prof. Raimes Moraes GpqCom EEL UFSC

7. A pilha e subrotinas

Relatório MC404 - Trabalho 3 - Prof. Rodolfo

Universidade de São Paulo

Interface Hardware/Software. Centro de Informática - UFPE Paulo Maciel prmm@cin.ufpe.br

Os 3 principais tipos de Instruções (INSTRUTION SET) dos up são:

INT 5h - Print screen Modo Resolução Caract. INT 10h - Vídeo INT 10h - Vídeo

Sistemas de Computação

UNIVERSIDADE DA BEIRA INTERIOR Faculdade de Engenharia Departamento de Informática

Sistemas de Computação para Controle e Automação CIC132. Assembly. Assembly. Notas. Décima quarta aula: Introdução a programação Assembly

Introdução. Programando em Assembly. Primeiro Exemplo (2) Primeiro Exemplo (1) Linguagem Assembly do 8086/8088

EEL Microprocessadores

8. Instruções de multiplicação e divisão

Anderson L. S. Moreira

Laboratório de Sistemas Processadores e Periféricos Lista de comandos de Assembly

Universidade de São Paulo

CRIANDO UM SISTEMA OPERACIONAL BÁSICO Por: Fernando Birck aka Fergo

Registradores. Os processadores possuem espaços específicos onde são guardados valores, os chamados registradores.

Data types. In C: char. short. int/long. double/long long AC 2017/2018. Pedro Serra / Sérgio Ferreira

A linguagem ASSEMBLY

LABORATÓRIO DE LINGUAGEM DE MONTAGEM INTERRUPÇÕES DO DOS E DA BIOS

Laboratório de Sistemas Processadores e Periféricos

Programando em Assembly

No. de bits. O primeiro IBM PC foi construído com o 8088 (versão de 8 bits do 8086).

Tópicos: 1 - Modos de endereçamento do Pilha e instruções de Pilha. 3 - Instruções que usam pilha: - instrução CALL - instrução RET

Instruções Assembly x Código de máquina Microprocessador Didático

Microprocessadores I ELE Aula 7 Conjunto de Instruções do Microprocessador 8085 Desvios

FORMATO DO PROGRAMA FONTE

Prof. Adilson Gonzaga

CPU. CPU Unidade Central de Processamento. Função: leitura, escrita e processamento de dados

Instruções funcionamento em 16 bits. 8B bytes W Mod 000 r/m

Professor: Dr. Rogério Rodrigues de Vargas.

A arquitectura IA32. A arquitectura de um processador é caracterizada pelo conjunto de atributos que são visíveis ao programador.

Sistemas de Microprocessadores I Lista de exercícios (questões de provas de semestre anteriores)

Arquitetura de Computadores Conceitos Fundamentais. Graduação em Engenharia Elétrica - UFPR Prof. Carlos Marcelo Pedroso 2016

Para facilitar o entendimento das rotinas escritas em assembly, apresentadas em aula, estudar as seguintes instruções da linguagem assembly:

José Augusto Fabri. Assembly Básico

Arquitetura do 8086/8088

Boot, BIOS, Bootloader

CONJUNTO DE INSTRUÇÕES

MATA49 Programação de Software Básico

ARQUITETURA E ORGANIZAÇÃO DE COMPUTADORES A UNIDADE LÓGICA ARITMÉTICA E AS INSTRUÇÕES EM LINGUAGEM DE MÁQUINA

ASSEMBLER. Autor: Rodrigo Ferreira Markus Vinicius Home Page

OTermo Assembly significa montagem, ou seja, linguagem

Linguagem de Montagem e Assembly. André Luiz da Costa Carvalho

Intel x AT&T - recapitulação

Arquitetura e Organização de Computadores

7. Instruções lógicas, de deslocamento e de rotação

7. PROGRAMANDO O MICROCONTROLADOR. Microcontroladores - Prof: Demantova

Microprocessadores I ELE Conjunto de Instruções do Microprocessador 8085 Aula 9 - PILHA E SUBROTINAS -

Universidade de São Paulo

mov R1,10H ; Carrega o dado do endereço 10H em R1 mov R1,#10H ; Carrega 10H em R1

Arquitectura de Computadores 3º TESTE

Prof. Adilson Gonzaga

ARQUITETURA E ORGANIZAÇÃO DE COMPUTADORES A UNIDADE LÓGICA ARITMÉTICA E AS INSTRUÇÕES EM LINGUAGEM DE MÁQUINA

PCS-2529 Introdução aos Processadores. Prof. Dr. Paulo Sérgio Cugnasca

LISTA 02 CONJUNTO DE INSTRUÇÕES - GABARITO

1. Instruções de Desvio

2º Estudo Dirigido CAP 3

Laboratório de Microprocessadores e Microcontroladores

Organização de Computadores 1

Arquitectura de Computadores

PRÁTICAS. Microcontroladores: (LT36D) Prof: DaLuz. Práticas - 2º sem Microcontroladores LT36D - 26/04/ :56 1/16

ARQUITETURA E ORGANIZAÇÃO DE COMPUTADORES A UNIDADE LÓGICA ARITMÉTICA E AS INSTRUÇÕES EM LINGUAGEM DE MÁQUINA

Assembly x86. Hugo Bessa - hrba Paulo Serra Filho ptvsf

EXEMPLO DE ARQUITETURAS REAIS INTEL 8086 AULA 07 Arquitetura de Computadores Gil Eduardo de Andrade

ORGANIZAÇÃO BÁSICA DE COMPUTADORES E LINGUAGEM DE MONTAGEM

EXERCÍCIOS RESOLVIDOS

Sumário. Aula Anterior. Exercício 7.1 Contagem de bits a 1 numa palavra Exercício 7.2 Deslocamento de n bits num operando de 64 bits.

SEL-614 MICROPROCESSADORES E APLICAÇÕES. Adilson Gonzaga

Programação de Microcontroladores II

Nível do Conjunto de Instruções Prof. Edson Pedro Ferlin

Definição DSPTI II. Surgimento - Brasil

Interrupção. Prof. Adilson Gonzaga

emachine: Simulador Didático de um Computador Paralelo

Aula 14 Funcionamento de Processadores (Visão específica)

A forma como podemos selecionar essas cores todas será mostrada mais abaixo (Como sempre as coisas boas säo sempre deixadas pra depois, né?! hehe).

x86 Assembly Mini-Course

Organização de Computadores

Linguagem de Montagem

Guia Rápido MIPS. Tipos de Dados e Formatações

Programação de Microprocessadores. Programação de Microprocessadores SEL-433 APLICAÇÕES DE MICROPROCESSADORES I

Sistemas Operacionais. Rodrigo Rubira Branco

Laboratório de Microprocessadores e Microcontroladores

SEL 0415 INTROD. À ORGANIZAÇÃO DE COMPUTADORES

Atividade prática: Criando e rodando um programa assembly

Periféricos e Interfaces Ano lectivo 2003/2004 Docente: Ana Paula Costa. Aula Teórica 6

x86 arquitetura e instruções básicas

AJProença, Sistemas de Computação, UMinho, 2017/18 1. Componentes (físicos) a analisar: a unidade de processamento / o processador:

Ferramentas Programação. UDESC - Prof. Juliano Maia 1

Organização de Computadores 1

Laboratório de Microprocessadores e Microcontroladores

A Memória do MSX na Prática

Universidade de São Paulo

As 5 partes fundamentais. Linguagem de Programação Pinagem Características Elétricas Ambiente de Desenvolvimento Integrado - IDE

ASSEMBLER PARA IBM-PC

Organização Funcional

Sistema Gráfico VGA. Sistema Gráfico VGA

Linguagem de Montagem do NeanderX

Transcrição:

Relatório MC404 - Trabalho 2 - Prof. Rodolfo Gustavo Sverzut Barbieri, Ivens Prates Telles Alves Grupo: Gustavo Sverzut Barbieri RA: 008849 Ivens Prates Telles Alves RA: 008908 1 O Projeto O segundo projeto de mc404 consta em implementar um boot loader, ou seja, um programa que carregue um outro programa de menos de 512 bytes para o primeiro setor de um disquete com uma assinatura que permite à BIOS reconhecer que esse disquete trata-se de um disquete de boot. Fizemos esse programa como um programa que carregasse qualquer outro programa em assembly, com menos de 8,5kb, no boot. Esse segundo programa será copiado juntamente com o primeiro pelo nosso boot loader, mas para o setor 2 até o setor 18 (por isso cabendo 8,5Kb (17*512/1024). Assim, pudemos rodar o Escalonador dentro dele, o que provavelmente nos garantirá mais 20% em cada trabalho! 2 Funções/Procedimentos: Nosso programa está basicamente dividido em 3 partes: 2.1 Boot Loader O arquivo G27-Boot.asm contém o nosso programa que copia os outros 2 programas para o local correto no disquete para serem bootados. Ele se divide em: Carregar Prog1.com: Carrega um arquivo chamado Prog1.com, que deve estar no mesmo diretório do programa compilado a partir do arquivo G27-Boot.asm, que deverá ter menos de 512 bytes. Esse parte ainda escreve a assinatura nos 2 ultimos bytes desse setor. Carregar Prog2.com: Carrega um arquivo chamado Prog2.com, que deve estar no mesmo diretório do programa compilado a partir do arquivo G27-Boot.asm, que deverá conter menos de 512 bytes. Esse programa só será rodado se o programa Prog1.com for a compilação do arquivo G27-Carregador.asm. que será explicado adiante. Se o arquivo Prog2.com naum existir, o Boot Loader considera que o Prog1.com é um programa que será rodado sozinho, e assim deixa de copiar o Prog2.com sem maiores problemas. 1

2.2 Carregador O arquivo G27-Carregador.asm é um pequeno programa que se compilado como Prog1.com e colocado no disquete rodando-se o Boot Loader, nos permite carregar na memória os próximos 17 setores do disquete, que seria o Prog2.com. Ele faz isso inicializando todos os registradores e segmentos, e depois copia para um lugar na memória (1234h) esses setores, no offset 0100h, para que o Prog2.com possa ser qualquer arquivo que rode no DOS, sem precisar de mudar o ORG para set bootado. 2.3 Move Objeto É um programa independente que desenha uma cruz na tela e a movimenta pelas setas do teclado. Esse programa deverá ser compilador como Prog2.com, para assim ser carregado pelo Boot Loader no disquete. Como compilado tem menos que 512 bytes, pode ser carregado diretamente como Prog1.com, contanto que mude-se o [ORG 0x0100] para [ORG 0x7C00]. Ele se divide em algumas partes: Movimenta: trata de capturar as setas do teclado e assim chamar as funções corretas para cuidar disso. Teste: testa se a cruz passou dos limites da tela. Pinta/Apaga: rotinas que pintam ou apagam a cruz da tela nas posições passadas por [POSX] e [POSY]. Move: Move para esquerda, direita, cima ou abaixo a cruz, apagando a cruz na posição atual e pintando a cruz na nova posição. 3 Decisões e Dificuldades encontradas: 3.1 Decisões Decidimos fazer o boot loader focado no carregador, pois queríamos os 20%. Assim, desenhamos algo bem simples no Move Objeto (uma Cruz, ou um alvo, como desejar) e gastamos um maior tempo no boot loader e no carregador. Esses dois são padrão, então não tivemos nenhuma decisão muito importante quanto o que usar neles. 3.2 Dificuldades Entender como o boot funciona, descobrir o RESB, e a maior de todas, entender como o carregador funcionaria, pois não sabíamos como dar um JUMP para a posiçào 0100h. Com o IRET, isso foi possível. O Boot Loader em si é simples (depois de ler muito), assim como o Move Figura. 2

;; Esse é o arquivo G27-Boot.asm [BITS 16] [ORG 0x0100] [SEGMENT.text] ; Aqui temos o carregamento de um arquivo chamado prog1.com no ; primeiro setor do disquete. mov ah,3dh mov al,00h mov dx,arkivo1 ; serviço da 21h para abrir arquivo ; o arquivo será aberto com permiss~ao ; de ler apenas ; nome do arquivo a ser lido (prog1.com) ; chama a mov dx,msg1 ; coloca mensagem de erro Abrir Arquivo jc Pulo ; se o carry for 1, deu pau. OBS: Pulo ; muito longo, usei uma ponte! mov [pontero],ax mov ah,3fh mov bx,[pontero] mov cx,512 mov dx,bloko ; coloca o file handle em pontero ; serviço da 21h para abrir arquivo ; copia o file handle contido em ; pontero para bx ; teremos até 512 bytes lidos ; e será alocado na memória reservada ; pela variável bloko ; chama a mov dx,msg2 ; coloca mensagem de erro Ler Arquivo jc Pulo ; se o carry for 1, deu pau. OBS: uso ; pulo pq senaum naum ia ;; Faz a assinatura mov al,0x55 mov [ds:bloko+510], al; Primeiro Byte mov al,0xaa mov [ds:bloko+511], al; Segundo Byte ; ajusta os 2 bytes do bloko para ser ; identificado como boot 3

mov ah,03h mov al,1 mov ch,0 mov cl,1 mov dh,0 mov dl,0 mov bx,bloko int 13h mov dx,msg4 jc msg_erro ; ------------- jmp Pula_o_pulo Pulo: jmp msg_erro Pula_o_pulo: ; ------------- mov ah,3eh mov bx,[pontero] ; coloca os dados da memória no setor ; desejado ; numero de setores a serem lidos ; track ; sector ; head number ; 0 = drive de diskete ; mov ES:BX ; coloca mensagem de erro Copiar para ; Setor ; se o carry for 1, deu pau ; PONTE!!! ; Ignore ; essa ; parte!!! ; serviço da 21h para fechar arquivo ; seleciona o file handle ; chama a mov dx,msg3 ; coloca mensagem de erro Fechar Arquivo jc msg_erro ; se o carry for 1, deu pau ; Aqui começa o carregamento do segundo arquivo, prog2.com, que pode ; ter no máximo 8704 bytes (8,5Kb), q eh o que cabe em 17 ; setores. Caso o arquivo prog2.com naum exista, essa parte será ; pulada para o fim do programa. mov ah,3dh mov al,00h mov dx,arkivo2 ; serviço da 21h para abrir arquivo ; o arquivo será aberto com permiss~ao ; de ler apenas ; nome do arquivo a ser lido (prog2.com) ; chama a 4

mov dx,msg5 ; coloca mensagem de erro Abrir Arquivo jc msg_erro ; se o carry for 1, soh carrega ; prog1.com, pois ; prog2.com naum existe. mov [pontero],ax mov ah,3fh mov bx,[pontero] mov cx,8704 mov dx,blokao mov ah,03h mov al,17 mov ch,0 mov cl,2 mov dh,0 mov dl,0 mov bx,blokao int 13h mov dx,msg4 jc msg_erro mov ah,3eh mov bx,[pontero] ; coloca o file handle em pontero ; serviço da 21h para abrir arquivo ; copia o file handle contido em ; pontero para bx ; teremos até 8704 bytes lidos ; e será alocado na memória reservada ; pela variável blokao ; chama a ; coloca os dados da memória no setor ; desejado ; numero de setores a serem lidos ; track ; sector ; head number ; 0 = drive de diskete ; mov ES:BX ; chama a int 13h para copiar ; coloca mensagem de erro Copiar para ; Setor ; se o carry for 1,deu pau ; serviço da 21h para fechar arquivo ; seleciona o file handle ; chama a mov dx,msg3 ; coloca mensagem de erro Fechar Arquivo jc msg_erro ; se o carry for 1, deu pau Fim: int 20h ; sai do programa 5

msg_erro: mov ah,09h int 20h ; imprime string em dx e sai do programa ; imprime string ; sai do programa [SEGMENT.data] pontero dw 0 arkivo1 db "prog1.com",0 arkivo2 db "prog2.com",0 bloko resb 512 blokao resb 8704 msg1 db "Naum consegui abrir o arkivo prog1.com!$" msg2 db "Naum consegui ler o arkivo!$" msg3 db "Naum consegui fechar o arkivo!$" msg4 db "Naum consegui copiar para o setor desejado!$" msg5 db "O programa soh carregou o arquivo prog1.com!$" 6

;; Esse é o arquivo G27-Carregador.asm [BITS 16] [ORG 0x0100] [SEGMENT.text] ; Instruç~oes básicas para o bom andamento do programa do primeiro setor mov ax,0 ; Inicia mov bx,0 ; os mov cx,0 ; quatro mov dx,0 ; registradores mov ax,cs ; Copia cs para ax. cs e ip jah veem iniciados. mov ds,ax ; copia o cs para ds mov ss,ax ; copia o cs para ss mov es,ax ; copia o cs para es mov sp,0f000h ; inicia a pilha com um valor razoavelmente alto! ; Fim das instruç~oes básicas. Iniciando o programa em si: mov ax,1234h ; Escolhe um lugar na memória mov es,ax ; para o programa rodar. mov ah,02h ; Coloca os dados do setor no lugar desejado de ; memória mov al,17 ; Numero de setores a serem lidos mov ch,0 ; Track mov cl,2 ; Sector mov dh,0 ; Head Number mov dl,0 ; 0 = drive de diskete mov bx,0100h ; Escolhe o local onde será rodado o programa. ; No padr~ao DOS, [ORG 0x0100] int 13h ; chama a int 13 para ler na memória pushf ; coloca as flags na pilha mov ax,1234h ; coloca o endereço de memória escolhido push ax ; acima na pilha, onde o programa está. mov ax,0100h ; coloca o endereço de offset escolhido push ax ; acima na pilha, para o [ORG XXXXXX]. iret ; Joga tudo para ser rodado! 7

;; Esse é o arquivo G27-MoveObjeto.asm [BITS 16] [ORG 0x0100] [SEGMENT.text] mov ah,00h mov al,12h int 10h call Pinta_Cruz Movimenta: mov ah,10h int 16h ; selecionar modo de vídeo ; modo gráfico ; chama o serviço de vídeo da BIOS ; Se assegura de que a primeira cruz ; será pintada no centro ; Pinta uma Cruz (alvo) ; Espera até vir uma entrada pelo ; teclado ; e coloca em ax cmp ah,4bh ; se foi pressionado seta para esquerda, je TesteEsquerda ; vai para TesteEsquerda cmp ah,4dh ; se foi pressionado seta para direita, je TesteDireita ; vai para TesteDireita cmp ah,50h ; se foi pressionado seta para cima, je TesteCima ; vai para TesteCima cmp ah,48h ; se foi pressionado seta para baixo, je TesteBaixo ; vai para TesteBaixo jmp Movimenta ; Loop ; -------------------------------------------------------------- ; ;; Rotinas id^enticas para testar se o objeto n~ao está ;; ultrapassando ;; os limites da tela (640x480) TesteEsquerda: mov ax,[posx] cmp ax,10 je Movimenta jmp Esquerda 8

TesteDireita: mov ax,[posx] cmp ax,630 je Movimenta jmp Direita TesteCima: mov ax,[posy] cmp ax,470 je Movimenta jmp Cima TesteBaixo: mov ax,[posy] cmp ax,10 je Movimenta jmp Baixo ;; Fim das rotinas de teste de ultrapassagem da tela ; -------------------------------------------------------------- ; ;; Rotinas para pintar/apagar o objeto Cruz da tela Pinta_Cruz: mov al,4 call Cruz ret Apaga_Cruz: mov al,0 call Cruz ret Pinta: push ax mov ah,0ch int 10h pop ax ret Cruz: ; color 4 - red ; chama a rotina Cruz ; color 0 - black ; chama a rotina Cruz ; salva ax pois ele será mudado ; function 0Ch - Write ; call BIOS Video Service ; retorna o ax salvo ; Assegura que cx e dx estaum ; nas posiç~oes atuais. 9

mov bx,21 ; Desenha sub cx,10 ; a call Reta1 ; reta ; horizontal mov bx,21 ; Desenha sub dx,10 ; a call Reta2 ; reta ; vertical ret Return: ret Reta1: call Pinta inc cx dec bx cmp bx,0 je Return jmp Reta1 Reta2: call Pinta inc dx dec bx cmp bx,0 je Return jmp Reta2 ; pinta o ponto atual ; anda 1 pixel para a direita ; decrementa o contador ; se o contador eh zero, ; retorna para a funcao q a chamou ; loop ; pinta o ponto atual ; anda um pixel para cima ; decrementa o contador ; se o contador eh zero, ; retorna para a funcao q a chamou ; loop ;; Fim das rotinas para desenhar/apagar a cruz na tela ; -------------------------------------------------------------- ; ;; Rotinas para escrever a Cruz quando elas saum movimentadas Esquerda: call Apaga_Cruz sub cx,5 mov [POSX],cx call Pinta_Cruz ; Apaga a cruz nas coordenadas atuais ; x position ; anda para a esquerda ; salva a nova posiç~ao ; y position ; chama a rotina para pintar nas coordenadas ; escolhidas 10

jmp Movimenta Direita: call Apaga_Cruz add cx,5 mov [POSX],cx call Pinta_Cruz jmp Movimenta Cima: call Apaga_Cruz add dx,5 mov [POSY],dx call Pinta_Cruz jmp Movimenta Baixo: call Apaga_Cruz sub dx,5 mov [POSY],dx call Pinta_Cruz jmp Movimenta ; volta para a rotina de Movimentacao ; Apaga a cruz nas coordenadas atuais ; x position ; anda para a direita ; Salva a posicao ; y position ; chama a rotina para pintar nas coordenadas ; escolhidas ; volta para a rotina de Movimentacao ; Apaga a cruz nas coordenadas atuais ; x position ; y position ; Anda para cima ; Salva a posiç~ao ; chama a rotina para pintar nas coordenadas ; escolhidas ; volta para a rotina de Movimentacao ; Apaga a cruz nas coordenadas atuais ; x position ; y position ; anda para baixo ; salva posiç~ao ; chama a rotina para pintar nas coordenadas ; escolhidas ; volta para a rotina de Movimentacao ;; Fim ; -------------------------------------------------------------- ; [SEGMENT.data] POSX dw 320 POSY dw 240 ; -------------------------------------------------------------- ; 11