;Compilar con MASM 5.0, luego el LINK y ejecuta el fichero.exe obtenido.
;Programa de arranque similar al de los sistemas operativos que arrancan
;desde disquetes o discos duros. Estos programas arrancan en modo real
;X86 basados en un estandar que cumplen todos los ordenadores compatibles
;con IBM-PC. Hasta la fecha los KXP-7 y Pentium-IV lo siguen haciendo.
; Todo ordenador luego de ejecutar el POST de su BIOS, cargan del disco
;duro o disquetes la informacisn contenida en un sector especmfico
;situado en cara 0, pista 0 y sector 1. Estos 512 bytes, de los cuales
;todos no son csdigo de maquina o ejecutable directamente por la CPU,
;se depositan en un segmento y desplazamiento especifico de su ordenador.
; Segmento y desplazamiento 0000:7C00H, y automaticamente se le transfiere el
;control de ejecucion al primer byte del sector cargado, es decir el puntero
;de instruccion IP de la CPU apunta a 0000:7C00H. Generalmente esta posicisn
;contiene un salto intrasegmento, desplazandose unos 53 bytes
;donde se encuentra el resto del codigo ejecutable del arranque de su ordenador.
;Este salto se debe a que cada disquete, tiene una zona especifica para indicar
;su formato, es decir cantidad de caras, sectores por pistas, cantidad de copias
;de la FAT y otros datos de interes que no debemos borrar.
;Este programa vale para su Disco duro, PERO CON MUCHOS CAMBIOS y hay que saber
;que se esta haciendo en todo momento para no perder la informacisn del disco duro.
;BIOS, Sistema basico de entrada y salida brindado por los fabricantes para acceder
;a sus dispositivos sin utilizar los puertos. Son rutinas en csdigo de maquina
;almacenadas en ROM o EPROM en trajetas, perifiricos y metherborad.
;FAT, Tabla de localizacisn de ficheros utilizada por los sistemas operativos MS-DOS,
;Windows 3.XX, 9X, 2000, NT y XP.Para los zltimos, en el caso que no desee utilizar NTFS,
;pues el estnadar segzn la capacidad de su disco duro puede ser FAT 8 bits, FAT 16 bits
;y FAT 32 bits. NTFS, es algo como la FAST, pero con menos documentacisn de su estructura
;para almacenar la informacisn el los discos duros.
;BOOT SECTOR, Sector de arranque de disquetes o Discos duros, el mismo se utiliza para
;almacenar un pequeqo programa de arranque de su ordenador, que ira cargando poco a poco
;su Sistema Operativo. Ademas contiene informacisn del tipo de soporte magnitico, como
;capacidad, sectores por cara, cantidad de FAT, Copias de Fat...
.8086
alfa segment para public 'code'
org 0100h
assume cs:alfa,es:alfa,ds:alfa,ss:alfa
inicio proc near
push cs
pop ds
push cs
pop es
mov ax,0201h ;Servicio 02H para leer un sector del disco
mov cx,0001h ;pista y numero del sector a leer dentro de la pista
mov dh,00h ;Cara donde se encuentra el sector a leer
mov dl,0 ;Unidad fisica a leer,en este caso Torre "A" no cambie esto.
mov bx,offset final ;Zona donde cargaremos los 512 bytes del sector leido
int 13h ;Interrupcion del BIOS dada por el fabricante para
;acceder a los discos.
; todo esto es para leer el sector 1, cara 0, pista 0 de su disquete,
; el cual debe estar ubicado en la torre "A" de su ordenador.
mov si,offset inicio
mov bx,offset mensx
jnc notERRORread ;Salata si no hay error en la lectura del disquete
errorINdisk:
dec cs:[flagDISK] ;Como hay error hago la ultima operacion 3 veces
jz Print ;Si ya se ha intentado realizar 3 veces, Aborto
xor ah,ah ;Servicio 0H para recalibrar unidad de disco
mov dl,0 ;Unidad "A a recalibrar producto a un error
int 13h
jc errorINdisk ;Si hay error al recalibrar salto a chequear veces
recalibro: ;Si salta aqui, es que no hay problemas en recalibracion
push si ;En este registro comienza la rutina pendiente
ret ;Se apila y luego se le dice a la CPU que retorne al valor
;que hay en la pila que es el de la rutina pendiente.
;Esto es un recurso de programacion, pues normalmente
;Un "RET", va acompa$ado de un "CALL"
notERRORread: ;Si salta aqui, es que pudo leer el Boot sector
mov cs:[flagDISK],03h ;Restablece a 3 veces los intentos de la ultima operacion
mov si,offset final+03h ;Posicion donde estan los datos del disquete Para el S.O
mov di,offset reservados;Posicion donde salvare esos datos para cuando escriba
mov cx,0033h ;Cantidad de bytes a mover
cld
rep movsb ;Permite mover bytes de DS:SI a ES:SI segun la cantidad
;puesta en CX
mov si,offset write1 ;Pongo posicion de la rutina a realizar con el disquete
write1:
mov ax,0301h ;Servicio 03H para escribir en disco
mov cx,0001h ;Pista 0, primer sector
mov dh,00h ;Pista 0
mov dl,0 ;Unidad donde escribiremos, Torre "A"
mov bx,offset bootEXEC ;Datos a escribir, en realidad es el BOOT SECTOR personlizado
int 13h ;Interrupcion del BIOS que permite el acceso al disco
jnc exitDOS ;Salta si no hay error
mov bx,offset mensb5 ;Mensaje a Imprimir si no se puede realizar la escritura
jmp errorINdisk ;Rutina que trata de recalibrar el disco para luego escribir
exitDOS:
mov bx,offset mensE7 ;Si salta aqui es que ya se ha escrito correctamente
;el boot sector o sector de arranque personalizado
print: ;Rutina para Imprimir Una cadena en Pantalla
mov ah,09h ;Servico 09H de la interrupcion 21H del S.O
push cs ;Segmento DS debe apuntar al segmento donde esta mi cadena
pop ds
mov dx,bx ;En DX debe estar el puntero donde comienza la cadena
int 21h ;Interrupcion multiple del S.O para varios propositos
exit:
mov ax,4c00h ;Servicio que le indica al S.O que la aplicacion ha finalizado
int 21h
flagDISK db 3 ;Variable para controlar intentos de repeticion de una operacion
mensE7 db 0ah,0dh,' Disco con Arranque Personalizado:',0ah,0dh
mensE8 db ' Ya puede reiniciar su Ordenador, recuerde que debe establecer en su SETUP',0ah,0dh
mensE9 db 'la opcion de arrancar por Unidad A o disquete...',0ah,0dh,'$'
mensx db 0ah,0dh,' ERROR:',0ah,0dh
mensx1 db ' Imposible leer. No hay disco en la Unidad A: o sectores da$ados...',0ah,0dh,'$'
mensb5 db 0ah,0dh,' ERROR:',0ah,0dh
mensb4 db ' Imposible escribir. Disco Protegido contra escritura o sectores da$ados...',0ah,0dh,'$'
;----------------------------------------------------------------------------
bootEXEC:
;reservo 512 bytes para el programa que estar en el
;boot sector, el cual imprimira en pantalla las teclas que pulse
;y saldra para arrancar por su disco duro con la tecla ESCAPE "ESC"
jmp boot ;Cuando esto es escrito en el boot sector de su disquete
;y es cargado por el BIOS en el arranque de su ordenador
;esta es la primera instruccion a ejecutar por la CPU
;SALTAMOS, pues los bytes restantes es el area de datos
;utilizadas por el S.O para saber que tipo de disco es
;reservo los datos de gu!a para el DOS
reservados:
r1 dw 0
r2 dw 0
r3 dw 0
r4 dw 0
r5 dw 0
r6 dw 0
r7 dw 0
r8 dw 0
r9 dw 0
r10 dw 0
r11 dw 0
r12 dw 0
r13 dw 0
r14 dw 0
r15 dw 0
r16 dw 0
r17 dw 0
r18 dw 0
r19 dw 0
r20 dw 0
r21 dw 0
r22 dw 0
r23 dw 0
r24 dw 0
r25 dw 0
r26 db 0
boot:
cli ;Desactivo las interrupciones.
xor si,si ;Posiciono el segmento de pila en el segmento 0000
mov ss,si
mov sp,7c00h ;Posiciono el puntero de pila(SP) en 7C00H y el puntero base(BP)
mov bp,7c00h
sti ;Activo las interrupciones. Esto en realidad se hace
;por un motivo, pero es largo de explicar.
mov ds,si ;Apunto mi segmento de datos(DS) y extra(ES) a 0000
mov es,si
mov ax,0003h
int 10h ;Con esto pondr el modo texto 80X25
mov ah,02h ;Posiciona el cursor en fila 0 columna 0
mov bh,0
mov dx,0100h
int 10h ;Interrupcion de video que permite estas funciones
mov dx,7c00h+(offset Welcome-offset bootEXEC) ;Imprimo Mensaje de Bienvenida en pantalla
mov cx,0000h
call PrintString ;Subrutina que permite imprimir una cadena en pantalla
readKEY:
xor ah,ah ;Leo el teclado hastya que pulsen una tecla
int 16h ;Interrupcion que permite leer el teclado
cmp al,00h ;Comparo el tipo de tecla que devuelve al pulsarlas
je readKEY ;Si no es tecla imprimible en pantalla,entonces no se imprime
mov ah,0eh ;Imprimo en pantalla el caracter correspondiente a la tecla pulsada
int 10H
cmp al,1bh ;Controlo si la tecla pulsada es "ESC"
jne readKEY ;De no serlo, sigo leyendo el teclado e imprimiendo
mov dx,7c00h+(offset GoodBye-offset bootEXEC)
mov cx,1400h
call PrintString ;Como se pulso la tecla "ESC", entonces imprimo mensaje
;de despedida.
xor ah,ah ;Espero a que presionen una tecla para volver a la
int 16h ;secuencia de arranque del BIOS de su ordenador
int 19h ;Esta interrupcion es la que invoca la secuencia de
;arranque del BIOS de su ordenador
PrintString: ;Imprime una cadena directamente en pantalla
mov ax,0b800h ;En CX fila y columna
mov es,ax ;en DX puntero al comienzo de la cadena
;la cadena debe terminar en '$'
Push cs
pop ds
mov ax,160
mul ch
shl cl,1
xor ch,ch
add ax,cx
mov di,ax
mov si,dx
cld
again_PrintString:
lodsb
cmp al,'$'
je exit_PrintString
mov ah,1fh
stosw
jmp again_PrintString
exit_PrintString:
ret
GoodBye db 'Retire el disqute y presione una tecla para cargar su Sistema '
GoodBye1 db 'Operativo...$'
Welcome db 'Ya puede teclear el texto que desee, Para salir, presione ESC$'
final db 0
inicio endp
alfa ends
end inicio
Autor: Wilfredo Pérez Velázquez
Fuente: LWP