Heisenberg OS: Evidências do que falei no último post

Nada melhor que verificar por si próprio as alegações feitas… Abaixo, temos um código para um setor de boot que, ao “bootá-lo” numa VM obtenho isso:

É o que a BIOS nos entraga!
É o que a BIOS nos entraga!

Repare que CS:IP aponta para 0x0000:0x7c00, todos os seletores de segmento apontam para o segmento 0 e SP aponta para logo abaixo do offset 0x7c00 (0x7800, ou seja, 512 bytes abaixo do nosso código). Exceto pelo conteúdo de DH (que contém o número do drive — com o bit 7 setado se for HD ou zerado se for disquete), os demais registradores de uso geral contém lixo que pode ser ignorado.

O programinha abaixo imprime esses valores:

;==============
; showregs.asm
;
; Imprime os registradores vindos da INT 19h durante
; o bootstrap.
;
; Compile com:
;   nasm -f bin -o showregs.img showregs.asm
;
; O arquivo showregs.img pode ser usado como uma imagem 
; binária do setor 0. E você pode usar isso como se fosse
; um disco (ou um disquette) e bootá-lo numa VM. Pode também
; copiá-lo para o setor 0 de um disquette de verdade se 
; quiser! :)
;==============
bits 16

; Estrutura da pilha...
; Facilita encontrar os valores empilhados.
struc stk
  ._ip: resw 1  ; CALL deixará isso na pilha.

  ._es: resw 1
  ._ds: resw 1
  ._cs: resw 1

  ._di: resw 1  ; PUSHA empilha AX,CX,DX,BX,SP,BP,SI e DI.
  ._si: resw 1
  ._bp: resw 1
  ._sp: resw 1
  ._bx: resw 1
  ._dx: resw 1
  ._cx: resw 1
  ._ax: resw 1   
endstruc

_start:
  ; Salva os registradores originais na pilha.
  pusha
  push cs
  push ds
  push es
  call  here    ; Incluindo IP.
here:

  jmp   0x07c0:_real_start
_real_start:

  mov   ax,cs
  mov   ds,ax
  mov   es,ax
  mov   bp,sp

  mov   di,_ax
  mov   ax,[bp+stk._ax]
  call  itoh

  mov   di,_bx
  mov   ax,[bp+stk._bx]
  call  itoh

  mov   di,_cx
  mov   ax,[bp+stk._cx]
  call  itoh

  mov   di,_dx
  mov   ax,[bp+stk._dx]
  call  itoh

  mov   di,_si
  mov   ax,[bp+stk._si]
  call  itoh

  mov   di,_di
  mov   ax,[bp+stk._di]
  call  itoh

  mov   di,_bp
  mov   ax,[bp+stk._bp]
  call  itoh

  mov   di,_sp
  mov   ax,[bp+stk._sp]
  call  itoh

  mov   di,_ip
  mov   ax,[bp+stk._ip]
  sub   ax,here-_start   ; Temos que descontar as 
                         ; instruções anteriores ao
                         ; CALL, inclusive!
  call  itoh

  mov   di,_cs
  mov   ax,[bp+stk._cs]
  call  itoh

  mov   di,_ds
  mov   ax,[bp+stk._ds]
  call  itoh

  mov   di,_es
  mov   ax,[bp+stk._es]
  call  itoh

  mov   di,_ss
  mov   ax,ss
  call  itoh

  mov   si,msg
  call  puts

  ; Pára tudo!
.L1:
  cli
  hlt
  jmp .L1

;---------------
msg:
  db  "Conteudo dos registradores entregues pela INT 0x19:"
  db  13,10,"AX=0x"
_ax: db "0000 BX=0x"
_bx: db "0000 CX=0x"
_cx: db "0000 DX=0x"
_dx: db "0000",13,10
  db  "SI=0x"
_si: db "0000 DI=0x"
_di: db "0000 BP=0x"
_bp: db "0000 SP=0x"
_sp: db "0000",13,10
  db  "CS=0x"
_cs: db "0000 DS=0x"
_ds: db "0000 ES=0x"
_es: db "0000 SS=0x"
_ss: db "0000",13,10,
  db  "IP=0x"
_ip: db "0000",13,10,13,10,"System Halted!",0

hextable: db  "0123456789ABCDEF"

;---------------------------
puts:
  lodsb
  test  al,al
  jz    .end
  mov   ah,0x0e
  int   0x10
  jmp   puts
.end:
  ret

; Converte AX para string em hexadecimal.
;
; Entrada:
;   ES:DI = buffer onde a string será colocada.
;   AX    = valor a ser convertido.
; Destroi:
;   AX, BX, DX e DI.
;
itoh:
  mov   dx,ax
  mov   bx,ax

  shr   bx,12
  and   bx,0x0f
  mov   al,[hextable+bx]
  stosb

  mov   bx,dx
  shr   bx,8
  and   bx,0x0f
  mov   al,[hextable+bx]
  stosb

  mov   bx,dx
  shr   bx,4
  and   bx,0x0f
  mov   al,[hextable+bx]
  stosb

  mov   bx,dx
  and   bx,0x0f
  mov   al,[hextable+bx]
  stosb
  ret

  ; Assinatura do bootsector.
  times 510 - ($-$$) db 0
  db  0x55, 0xaa
Anúncios

Deixe um comentário

Faça o login usando um destes métodos para comentar:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s