sábado, 21 de janeiro de 2012

SO Simples em Assembly

Bem...

Neste tutorial irei utilizar algumas coisas deste tutorial:
http://www.fergonez.net/files/tut_sistoper.pdf

Irei apenas ajudá-los um pouco mais....
Obs.: Este tutorial não visa ensinar o Basico-do-Basico do Assembly... É uma coisa um pouco avançada, para algo mais básico o tutorial acima é bem indicado....



Bem vamos lá:

Para começarmos baixamos o Emu8086(uma espécie de IDE para Assembly e Assembler tabém :D)
http://www.emu8086.com/

O Fergo RawImage Maker(Usado para Gravar um arquivo .img com o nosso SO)
http://www.fergonez.net/download.php?file=frim.zip

O Ken Kato´s Virtual Floppy Drive(Para Emular um disquete)
http://sourceforge.net/projects/vfd/files/2.1%20%28February%2006%2C%202008%29/vfd21-080206.zip/download (Tutorial sobre ele: http://jefferson-ryan.blogspot.com/2007/10/drive-de-disquete-virtual.html)

E por fim o RawWrite(Usado para gravar o arquivo .img no disquete emulado pelo VFD)
http://www.chrysocome.net/rawwrite

Após ter instalado os programas acima em um diretório esocolhido por você vamos ao que interessa...

Abra o Emu8086 e clique em new como a imagem abaixo:

Agora clique em "empty workspace" como na imagem abaixo:

Agora cole o Codigo abaixo:

org 7C00h                         ;organiza o offset
;inicialização da pilha
mov     ax, 07C0h              
mov     ss, ax                      ;seta o SS para 07C0h
mov     sp, 03FEh               ;aponta para o topo da pilha
;seta segmento de dados
xor     ax, ax                       ;zera AX
mov     ds, ax                      ;seta o segmento de dados par 0000h
;altera o modo de vídeo
mov     ah, 00h                    ;subfucao para setar modo de vídeo
mov     al, 03h                     ;03h = 80x25, 16 cores
int     10h                             ;interrupt de vídeo
;le dados do disquete
mov     ah, 02h                     ;subfunção de leitura
mov     al, 1                          ;numero de setores para ler
mov     ch, 0                         ;trilha ( cylinder )
mov     cl, 2                          ;setor
mov     dh, 0                         ;cabeça
mov     dl, 0                          ;drive ( 00h = A: )
mov     bx, 0800h                 ;ES:BX aponta para o local da memória_
mov     es, bx                       ;onde vai ser escrito os dados_
mov     bx, 0                         ;0800:0000h ( ES = 0800h, BX = 0000h )
int     13h                              ;interrupt de disquete
jmp     0800h:0000h             ;pula para o local onde está o kernel
                                            ;e passa a execução para ele

Este código será responsável por dar o Boot e Abrir o kernel(arquivo que terá uma mensagem básica);

Ok, agora salve este arquivo com um nome qualquer(de preferencia bootloader) e compile-o como arquivo ".bin";

Agora Crie um novo arquivo e cole este codigo:


org 0000h                       ;organiza o offset
                               
push cs                            ;CS = endereço do programa atual
pop ds                             ;DS = CS
call clearscreen                 ;chama procedure de limpar a tela  
lea si, Mensagem              ;SI = endereço da mensagem              
mov ah, 0Eh                     ;subfuncao para imprimir caractere
repeticao:
    mov al, [si]                   ;move para AL o caractere em SI
    cmp al, 0h                    ;compara com 0 ( fim da string )
    jz terminou                   ;caso terminou, pule para ‘terminou’
    int 10h                         ;interrupção de video
    inc si                            ;próximo caractere                    
    jmp repeticao               ;repete o processo ate achar o 0
terminou:
mov ah, 0h                       ;subfuncao de aguardar tecla
int 16h                             ;interrupção de teclado
mov ax, 0040h                 ;método de reboot consiste em setar_                
mov ds, ax                        ;o valor do endereço 0040:0072h_                        
mov w.[0072h], 1234h     ;para 1234h e pular para o endereço_
jmp 0FFFFh:0000h          ;FFFF:0000h
clearscreen proc               ;procedure de limpar a tela
    pusha                           ;coloca todos os reg na pilha    
    mov     ah, 06h             ;subfuncao de rolar a tela pra cima
    mov     al, 0                  ;limpa a tela
    mov     bh, 0000_1111b      ;seta as cores ( fundo_texto )
    mov     ch, 0                  ;linha do canto sup. esq.
    mov     cl, 0                   ;coluna do canto sup. esq.
mov     dh, 19h                  ;linha do canto inf. dir. ( 25 )
    mov     dl, 50h               ;coluna do canto inf. dir. ( 80 )
    int     10h                       ;interrupção de vídeo
    popa                              ;repõe os valores dos registradores
    ret                                  ;retorna para o código
clearscreen endp  
Mensagem db ‘Asembly Brasil SO :D’,0 ;nossa string que vai ser exibida

Agora salve-o e compile-o da mesma forma que fizemos como bootloader(porém salve-o com outro nome de preferencia kernel).

Ok após os dois arquivos acima compilados vamos lá:
Abra o Fergo Raw



Execute o programa. A interface é bem simples e intuitiva. Siga estes passos para criar a imagem ( os números em parênteses fazem relação com a imagem ).
 • Escolha o arquivo de destino ( 1 )
 • Selecione o loader.bin na segunda caixa de texto ( 2 )
 • Marque Head = 0, Cylinder = 0 e Sector = 1 ( 3 )
 • Clique em Add ( 4 )
 • Selecione o kernel.bin na segunda caixa de texto ( 2 )
 • Marque Head = 0, Cylinder = 0 e Sector = 2 ( 3 )
 • Clique em Add ( 4 )
 • E em seguida clique em ‘Create File!’ ( 5 )
 Preste bastante atenção nos setores que você for gravar. Verifique se o resultado final ficou semelhante ao da lista na imagem.

Ok... Agora vamos emular o disquete com o VFD, Abra o arquivo vfdwin.exe como administrador(caso contrário não conseguirá montar o driver virtual)...



Selecione um arquivo para ser o driver virtual(o VFD já tem um arquivo pronto) (1)
Selecione Manual (para ter controle em quando iniciar em quando parar o driver) (2)
Clique em Install (para instalar o VFD) (3)
Clique em Start (para iniciar o VFD) (4)
Abra a aba Drive0 (5)



Clique em Open/Create (1)



Selecione um arquivo (podes colocar um arquivo que ainda não exite mas com extensão ".img") (1)
Clique em File (2)
Clique em Create (para criar o Driver Virtual) e deixe o VFD aberto... (3)

Agora vamos gravar o SO no "disquete"...

Abra o arquivo RawWrite com o arquivo "rawwritewin.exe".


Em Floppy drive deixe o que está "\\\A:" (1)
Em Image file Selecione o arquivo que foi criado com FergoRaw (2)
Clique em Write (para que seja gravado no disquete virtual) (3)

Ok, agora pode fechar o RawWrite novamente...

Na tela do VDF:


Clique em Save... se abrirá uma nova janela:


Selecione um arquivo já existente(ou coloque o nome de um arquivo que ainda não existe com extensão ".img") (1)
Clique em Save (2)

Voltando a tela principal do VFD:


Clique em Close para desmontar o driver virtual...

Pronto!
Seu SO está salvo em Arquivo .img. 
Caso tenha um emulador de máquina virtual que reconheça este tipo de arquivo é só usá-lo que já estará funcionando...
Caso não tenha o emulador...
Não se preocupe que no proximo tuto eu ensinarei como emular este SO no Virtual Box...

Comentem Por favor pois é o meu primeiro tuto :D...

Até lá...
Fiquem com DEUS!!

Um comentário:

  1. Galera!!!

    Quando copiar os codigos Altere as 'aspas' pois se deixar do geito que é copiado do site vai dar erro!!

    Desde já Grato!! ;)

    Fiquem com DEUS!!

    ResponderExcluir