Todo pc ejecuta código máquina: Ya sea en el arranque (La bios no es más que código máquina), en la carga del sistema operativo (el kernel esta programado en su mayor parte en código maquina) y en la ejecución de programas (el código fuente compilado o interpretado se transforma de una u otra manera en código máquina). Esta forma de trabajar hace que realmente no sea necesario un sistema operativo para ejecutar aplicaciones (y si me lo poneis dificil, hasta tampoco haría falta la bios). Es por ello que hay aplicaciones como los gestores de arraque (lilo, grub, nt loader), virus, etc que no necesitan de un sistema operativo para funcionar.
Siguiendo este camino, cualquiera podría crear una aplicación que, manteniendola y añadiendola nuevas funcionalidades, podría convertirse en el kernel que Linus Torvalds desarrolló de minix y que posteriormente se transformaría en linux.
Mi intención esta lejos de desarrollar un sistema operativo propio… aún :-), sin embargo a continuación pongo una aplicación, que ejecutada desde un disquete nada más arrancar el pc, muestra un menú y realiza operaciones básicas (chorras). Necesitareis un disquete ya formateado, el programa debug del msdos (por defecto en todos los windows) y que como primera unidad de arranque del pc sea la disquetera (próximamente hablaremos de como pasarlo a un cd mediante el estandar «el torito»). Para los linuxeros de pc, próximamente pondré algo parecido al rawrite. Las instrucciones para hacerlo funcionar son las siguientes:
1-cargad una consola msdos (en windows 9x: inicio/ejecutar/command, en windows nt,2000 o xp: inicio/ejecutar/cmd)
2-Insertad un disquete ya formateado en la disquetera y que no tenga nada importante (ya que perdereis toda la información que contuviera)
3-copiad el siguiente texto a un fichero de texto en vuestro disco duro (dejad al final un retorno de carro), por ejemplo codigo.txt:
a
jmp 1f7
db ‘Seleccione una opcion del menu’
db ‘1- Mostrar hora’
db ‘2- Coche Fantastico’
db ‘3- Salir’
db ‘Desarrollado por Oscar Rodriguez http://sistemasorp.blogspot.com’
db ’00:00:00′
db ‘Fijese en las luces del teclado’
db ‘Retire el disco o cd de la unidad de arranque y pulse una tecla’
cli
xor ax,ax
mov ss,ax
mov sp,7c00
mov es,ax
mov ds,ax
sti
mov ah,0
mov dl,0
int 13h
mov ax,201
mov bx,7e00
mov cx,2
xor dx,dx
int 13h
mov ax,3
int 10h
mov ax,1001
mov bh,1
int 10h
mov ax,1300
mov bx,2
mov cx,1e
mov dx,0119
mov bp,7c03
int 10h
mov ax,1300
mov bx,2
mov cx,0f
mov dx,0519
mov bp,7c21
int 10h
mov ax,1300
mov bx,2
mov cx,13
mov dx,0619
mov bp,7c30
int 10h
mov ax,1300
mov bx,2
mov cx,8
mov dx,0719
mov bp,7c43
int 10h
mov ax,1300
mov bx,4
mov cx,46
mov dx,1705
mov bp,7c4b
int 10h
mov ah,0
int 16h
push ax
mov ax,700
mov bh,0
mov cx,0900
mov dx,094f
int 10h
pop ax
cmp ah,2
je 29f
cmp ah,3
je 2fd
cmp ah,4
jne 29d
jmp 32f
jmp 278
mov ah,2
int 1ah
push cx
mov bx,7c91
mov al,ch
mov cl,4
shr al,cl
add al,30
mov [bx],al
inc bx
mov al,ch
and al,0f
add al,30
mov [bx],al
add bx,2
pop cx
mov ch,cl
mov al,ch
mov cl,4
shr al,cl
add al,30
mov [bx],al
inc bx
mov al,ch
and al,0f
add al,30
mov [bx],al
add bx,2
mov al,dh
mov cl,4
shr al,cl
add al,30
mov [bx],al
inc bx
mov al,dh
and al,0f
add al,30
mov [bx],al
mov ax,1300
mov bx,7
mov cx,8
mov dx,0919
mov bp,7c91
int 10h
jmp 278
mov ax,1300
mov bx,7
mov cx,1f
mov dx,0919
mov bp,7c99
int 10h
mov cx,3
mov ah,2
call 346
mov ah,4
call 346
mov ah,1
call 346
mov ah,4
call 346
loop 311
mov ah,0
call 346
jmp 278
mov ax,1300
mov bx,7
mov cx,3f
mov dx,0908
mov bp,7cb8
int 10h
mov ah,0
int 16h
int 19h
push cx
cli
mov al,ed
out 60,al
in al,64
test al,2
loopnz 34c
mov al,ah
out 60,al
sti
mov ah,0
int 1ah
mov bx,dx
add bx,9
mov ah,0
int 1ah
cmp bx,dx
jnz 360
pop cx
retw 100 0 0 2
q
4-Ejecutad el siguiente comando: debug < codigo.txt
5-Reiniciad el ordenador con el disquete dentro
Este proceso lo que hace es ejecutar tanto comandos del debug del msdos, como intrucciones en ensamblador. Con esto guardamos en el sector de arranque del disquete (no del disco duro) un programa que se ejecutará nada más reiniciar el ordenador, antes de que se cargue el sistema operativo. Este programa tiene un menú con 3 opciones:
1- Mostrar hora: Muestra la hora actual del sistema.
2- Coche Fantastico: Simula las luces del coche fantástico en los led del teclado
3- Salir: Sale del programa, cuando se retira el disquete carga el sector de arranque del disco duro.
Con este programa se muestra todo lo que que se puede necesitar de un pc:
-interfaz con el usuario de entrada (teclado)
-interfaz con el usuario de salida (monitor)
-lectura de disco (lectura del resto del programa en otro sector)
-gestión de memoria (las cadenas de texto y la pila)
-gestión de dispositivos (luces de teclado)
Las instrucciones del debug son:
a: introducir código en ensamblador.
w 100 0 0 2: escribir el programa en los primeros sectores de arranque del disquete desde la posicion de memoria 100.
q: salir del debug.
No voy a explicar que hace cada cosa en el programa, sin embargo si alguien tiene dudas puede preguntarme que significa cualquier parte del código en ensamblador. A grosso modo usa las funciones de la bios para poder funcionar: la interrupción 10h la uso para mostrar cadenas, la interrupción 13h para leer un segundo sector del disquete, la interrupción 16h para leer caracteres pulsados del teclado, la interrupción 19h para reiniciar el sistema sin tener que testearlo todo de nuevo, la interrupción 1ah para hacer retardos y averiguar la hora del sistema. Escribo en el puerto 60 para modificar el estado de los leds del teclado. Su arquitectura se basa en la peculiaridad de la bios de guardar nada más arrancar el primer sector del disquete en la zona de memoria 0000:7C00 y luego enviar la ejecución a ese punto.
El hecho de haber usado la herramienta debug es porque lo tiene todo el mundo en su windows. Sin embargo no esta orientada a usarse para programar sectores de arranque, más bién para editarlos, editar ficheros o crear ficheros ejecutables con extensión .COM; por este último motivo he tenido que ir jugando con los saltos relativos a pelo, es decir, como los programas en debug empiezan en el desplazamiento 100h de la memoria (típico de los ficheros .COM) he estado poniendo los destinos de los saltos en base a esa posición 100h, por lo que cuando he necesitado modificar una instrucción, he tenido que cambiarlos también. Por suerte al ser saltos relativos (e internamente el debug los convierte así) no influye en el resultado final.
Por último si teneis curiosidad por el mundo del pc y sus interioridades, saber como es el proceso de arranque del pc, cambiar las luces del teclado y muchísimo más, teneis el maravilloso y gratuito libro EL UNIVERSO DIGITAL DEL IBM PC, AT Y PS/2 de Ciriaco García de Celis, el cual explica con mucho detalle las tripas de los pcs.
Hola, leer el contenido de un diskette, es decir, los archivos almacenados en un diskette. Espero puedas ayudarme. Saludos y gracias.
Bién, para ello debes usar las funciones 1Ah, 4Eh y 4Fh de la INT 21h.
mov ah,1ah ; la función de establecer el area de datos de disco
mov dx,offset datos ; el area de datos de disco
int 21h
mov ah,4eh ; la función de buscar el primer fichero coincidente
xor cx,cx ; el tipo de atributo (0 = ficheros normales)
mov dx,offset cadena ; la cadena a buscar, por ejemplo db ‘*.txt’,0
int 21h
jc no_encontrados ; si carry no es 0 entónces no ha encontrado nada
sigue_buscando:
;hacer lo que sea en este punto con el area de datos
mov ah,4fh ; la función de buscar el siguiente fichero coincidente
int 21h
jnc sigue_buscando; si carry es 0 entónces que siga buscando más ficheros
no_encontrados:
.
.
.
El area de datos consiste en la siguiente información:
bytes
0-20 reservados
21 atributos
22-23 hora del fichero
24-25 fecha del fichero
26-29 tamaño del fichero
30-42 nombre y extensión del fichero
Hola sistemasorp, quisiera q me des una mano para un trabajo final en la U. debo hacer un programa que dibuje una linea y luego la borre con el cursor del mouse. Ojala puedas hacerme ese favor. Gracias.
muy buen articulo oscar, quisiera que me ayudaras por fabor a realizar un movimiento de una letra por toda la pantalla que se vea el efecto de rebote, todo esto mediante debug
usr: juanitux
Esta es la segunda vez que escribo en tu blog. Lo hago con el motivo de que falta un parámetro en la interrupción 19h el Bootstrap(línea 151) deberias indicar en el registro `DL’ el dispositivo al que quieres cargar, en nuestro caso HDD0. Por lo que quedaría asi:
;—————
mov dl, 80
int 19h
;—————
Mas… habría que corregir los saltos línea 158 y 169.
Ante todo felicitaciones de nuevo!!!
juanitux, una pregunta, ¿de donde has sacado que la int 19h usa el registro dl para iniciar el arranque en una determinada unidad?. No me sonaba, pero buscando por internet tampoco lo he encontrado.
En cuanto a los saltos no entiendo que problema tienen:
El de la linea 158 (157 en realidad) es un bucle que espera un tiempo entre el envío de comandos al teclado.
El de la linea 169 (168 en realidad) es un salto que comprueba que el tiempo pasado sea más de 9 ticks (en la anterior llamada se coge el tiempo, se le suma 9 y se repite una y otra vez las llamadas al segundo tiempo hasta que concide con 9 ticks)
Hola, me llamo arbey, quisiera primero felicitarte por tu programa, la verdad esta muy bacano el hecho de poderlo correr sin sistema operativo. con respecto a esto, quisiera preguntar varias cositas:
yo necesito hacer un sistema operativo que corra desde una usb, entonces para mi, tu programa puede ser un sistema operativo, solo que el menu no va a ser 1, 2, o 3, sino una especie de ventana de comando, entonces una de mis preguntas es, como cambio el codigo para que no corra desde un diskette sino desde una USB?? ademas, mi sistema operativo lo que tiene que hacer es reconocer un comando que se puede llamar por ejemplo copytousb, entonces deberia copiar todo el sistema operativo, en este caso tu programa a otra usb, sabrias que comandos puedo usar para hacer esto??
muchas gracias
Necesito un programa que me muestre mi nombre como tal por panatlla pero no he podido hacerlo me podrias colabirar es mi exman final, debe ser un ejecutable
Ejmplo:
andres
gracias por tu colaboracion
Bueno te felicito por tu programa no se en realidad cual es tu nombre.Con manuales de este tipo se aprende mucho.
Un saludo grande
Percy
Hola, lo primero felicitarte por tu blog y por tus articulos, porque me parecen muy interesantes y acabas de formar parte de mi lista de favoritos.
Ahora la pregunta que te quería plantear:
Me gustaría diseñar un programa para que te una vez que lo instalas en un portatil, si te lo roban mande una señal (via internet) para detectar donde esta el ladrón (mediante la direccion IP) y la policia puede actuar.
El tema esta en que me gustaria que ese programa se ejecutara desde la bios, para evitar que pierda la efectividad si formatean. Para ello supongo que haria falta escribir todo el código en ensamblador, no?. Las preguntas son:
1) Como puedo guardar un programa en la bios?
2) Sé que se puede obtener de un trozo de código en C++ por ejemplo, su equivalente en ensamblador, pero como se podria hacer?
La verdad esque este programa lo queria proponer para proyecto fin de carrera y antes me gustaria saber si es factible.
Mi correo es thinkill@gmail.com, si puede ser aunque contestes por aqui (para que todo el mundo lo lea) mandame la respuesta por correo, ok?(es por leerla en cuanto la mandes, que tengo mono) xD
Muchas gracias por todo.
AYUDA NECESITO UN PROGRAMA EN ENSAMBALDOR QUE LEA UNA CADENA DEL TECLADO, DESPUES IMPRIMA EN PANTALLA CUANTAS VECES SE REPITE CADA CARACTER DE LA CADENA
EJEMPLO:
Rodrigo
R:1 o:2 d:1 r:1 g:1
EJEMPLO 2:
AAAABBBOoOOO
A:4 B:3 O:4 o:1
—me super urge—
AYUDA NECESITO UN PROGRAMA EN ENSAMBALDOR QUE LEA UNA CADENA DEL TECLADO, DESPUES IMPRIMA EN PANTALLA CUANTAS VECES SE REPITE CADA CARACTER DE LA CADENA
EJEMPLO:
Rodrigo
R:1 o:2 d:1 r:1 g:1
EJEMPLO 2:
AAAABBBOoOOO
A:4 B:3 O:4 o:1
antes q na quiero felicitarte, quisiera pedirte si es posible q me detalles sentencia por sentencia las instrucciones sino es mucha molestia, recien estoy empezando a estudiar assembler, mi correo es angel30422@hotmail.com te agradeceria qlo envies a mi email.
trate de compilar en fasm pero no funciona alguien sabe algo al respecto
De: JUANITUX:
Hola chaval siento haber tardado en la repuesta a tu pregunta: «¿de dónde has sacado que la int 19h usa el registro dl para iniciar el arranque en una determinada unidad?». la primera vez que probé tu programa no cargo el bootloader por tanto comencé a investigar y me tope con una página super completa en la que describe todas las interrupciones conocidas. Por cierto, no recuerdo bien por que te mencioné que cambiaras algunos saltos, si lo recuerdo te contestaré tan pronto pueda. reescribi parte de tu código pero no me acuerdo los cambios, tengo el código fuente reeditado para NASM. A continuación te escribo el link en dónde encontré el listado de interrupciones.
LINK:http://www.htl-steyr.ac.at/~morg/pcinfo/hardware/interrupts/inte1at0.htm
PD0: los número para los dispositivos más comúnes son: 0=A:, 1=2nd floppy, 80h=drive 0(hd0 || C:), 81h=drive 1
PD1: Te sigo felicitando por tu página !!!
UY! lo siento no ha salido bien el enlace:
http://www.htl-steyr.ac.at/~morg/pcinfo/
hardware/interrupts/inte1at0.htm
Saludos mi nombre es Edit, pues veras tengo un gran problema… buscando en la red me encontre con tu artículo y pense q me podias ayudar.
Aca en la school me piden realizar una aplicación en visual basic, pero no debe ser interrumpida por ninguna interrupción de windows y aunque esto se puede hacer desde msdos, requieren la interfaz grafica de VB en windows, crees q me puedas ayudar? RTO, WINDOWS CE embedded deberas q ya no se…
gracias.
Hola, me ha gustado mucho tu web, no sé si me podrás decir de algún sitio donde diga como hacer una cosa:
Quiero escribir un programa en ensamblador, meterlo en un diskette y que al iniciar al ordenador se booteé desde con ese programa, sin usar ningún sistema operativo, es decir que pueda utilizarse en un ordenador que no tiene ningún SO, he probado con este código y no me ha funcionado, y ya no sé ni que buscar en google.
hola, estoy impresionado con tus publicaciones,excelente queda corto, yo tengo la tarea de realizar un trabajo que consiste en reutilizar una pc vieja y convertirla es un sistema que controle un motor con el puerto paralelo sin la presencia del sistema operativo, me gustaria que que ayudes no tengo muchas ideas…gracias…no dejes las publicaciones!
Hola, gracias por los ánimos.
Este artículo te puede servir ya que para manejar el puerto paralelo sólo tienes que usar el comando OUT en ensamblador y enviar 8 bits al puerto paralelo (normalmente 378h) con lo que podrías controlar hasta 4 motores en ambas direcciones. Luego los cables de datos y de masa del puerto paralelo los llevarías a tu circuito.
kisiera saber la explicacion de este codigo:
a
jmp 1f7
db ‘Seleccione una opcion del menu’
db ‘1- Mostrar hora’
db ‘2- Coche Fantastico’
db ‘3- Salir’
db ‘Desarrollado por grupo JBCI’
db ‘00:00:00′
db ‘Fijese en las luces del teclado’
db ‘Retire el disco o cd de la unidad de arranque y pulse una tecla’
cli
xor ax,ax
mov ss,ax
mov sp,7c00
mov es,ax
mov ds,ax
sti
mov ah,0
mov dl,0
int 13h
mov ax,201
mov bx,7e00
mov cx,2
xor dx,dx
int 13h
mov ax,3
int 10h
mov ax,1001
mov bh,1
int 10h
mov ax,1300
mov bx,2
mov cx,1e
mov dx,0119
mov bp,7c03
int 10h
mov ax,1300
mov bx,2
mov cx,0f
mov dx,0519
mov bp,7c21
int 10h
mov ax,1300
mov bx,2
mov cx,13
mov dx,0619
mov bp,7c30
int 10h
mov ax,1300
mov bx,2
mov cx,8
mov dx,0719
mov bp,7c43
int 10h
mov ax,1300
mov bx,4
mov cx,46
mov dx,1705
mov bp,7c4b
int 10h
mov ah,0
int 16h
push ax
mov ax,700
mov bh,0
mov cx,0900
mov dx,094f
int 10h
pop ax
cmp ah,2
je 29f
cmp ah,3
je 2fd
cmp ah,4
jne 29d
jmp 32f
jmp 278
mov ah,2
int 1ah
push cx
mov bx,7c91
mov al,ch
mov cl,4
shr al,cl
add al,30
mov [bx],al
inc bx
mov al,ch
and al,0f
add al,30
mov [bx],al
add bx,2
pop cx
mov ch,cl
mov al,ch
mov cl,4
shr al,cl
add al,30
mov [bx],al
inc bx
mov al,ch
and al,0f
add al,30
mov [bx],al
add bx,2
mov al,dh
mov cl,4
shr al,cl
add al,30
mov [bx],al
inc bx
mov al,dh
and al,0f
add al,30
mov [bx],al
mov ax,1300
mov bx,7
mov cx,8
mov dx,0919
mov bp,7c91
int 10h
jmp 278
mov ax,1300
mov bx,7
mov cx,1f
mov dx,0919
mov bp,7c99
int 10h
mov cx,3
mov ah,2
call 346
mov ah,4
call 346
mov ah,1
call 346
mov ah,4
call 346
loop 311
mov ah,0
call 346
jmp 278
mov ax,1300
mov bx,7
mov cx,3f
mov dx,0908
mov bp,7cb8
int 10h
mov ah,0
int 16h
int 19h
push cx
cli
mov al,ed
out 60,al
in al,64
test al,2
loopnz 34c
mov al,ah
out 60,al
sti
mov ah,0
int 1ah
mov bx,dx
add bx,9
mov ah,0
int 1ah
cmp bx,dx
jnz 360
pop cx
ret
w 100 0 0 2
q
por favor amigo necesito saber la explicacion de este codigo para un trabajo del instituto. Debido a que tube un accidente y no pude ir a clases, ademas es mi trabajo final del instituto y llevo dias tratando de comprender este codigo.
GRACIAS DE ANTEMANO. bruno
No hace falta que repitas el mismo programa que aparece en el artículo.
felicidades por tu articulo, me ha indicado por donde es el camino pero tengo una duda.
Tengo un unico programa en C++ que va a ser ejecutado en una pc al iniciar, no deseo meterle disco duro asi que lo quiero cargar desde usb ¿debo crear un programa de arranque en ensamblador o hay forma de hacerlo en c++?
Me temo que el arranque de un pc desde un disco duro/cdrom/disquete/usb tiene que estar en ensamblador ya que los programas en C++ necesita de un sistema operativo para ejecutarse.
Hola dijise que harias algo asi pero en linux cuando estara.
hola ….gracias
tengo una pregunta
una ves echo el programa en c++ que sellama diseño
agarro el archivo diseño.exe
¿COMO AGO PARA CORRER EL PROGRAMA DESDE UNA USB CUNDO ENCIENDO LA COMPUTADORA? CON EL DOS
Hola…tengo una pregunta…para cargar un programa (creado con un compilador) antes de iniciar el sistema operativo, desde una tarjeta pci…como seria el programa..o que comandos puedo usar?…ayuda urgente porfavor :S
¿Desde una tarjeta PCI? Nunca he oido que se pueda cargar nada desde una tarjeta PCI, si acaso de un disco usb. Por otro lado en qué lenguaje está hecho el programa? porque como este necesite las funciones de un sistema operativo no lo podrás ejecutar, lo tendrías que programar tu a mano (acceso a la pantalla, al teclado, al ratón, al disco, etc.). ¿No te sirve arrancar desde una distribución linux live?
en realidad es un proyecto, tengo que codificar un programa en ensamblador, compilarlo..usar los pines de una tarjeta pci(solo los pines) y diseñar un circuito con una memoria RAM o ROM para que al encender..la pc al arrancar lea el programa en la memoria y no el arraque el sistema operativo…alguna idea o recomendacion?
No conozco el modo de acceso del PCI, pero como en ensamblador se trata de acceder al puerto 0xcf8, no sería complicado. ¿Desde donde se ejecutaría ese programa en ensamblador? usb, cd, disquete…
el programa se ejecutara desde una memoria RAM o ROM externa .. que estara dentro de un circuito que diseñare y este circuito ira conectado a los pines de la tarjeta PCI…al arrancar el sistema se debe cargar el programa desde dicha memoria externa, es lo mismo que tu programa pero el programa arranca desde una memoria externa conectada a una PCI…recomendanciones para el codigo?
Pues me temo que eso excede mis conocimientos, ya que cuando hice el artículo investigué para hacerlo a través de un disquete (pero que sería fácilmente reproducible en un usb o cd), pero que el pc arranque directamente desde una tarjeta PCI personalizada no sabría cómo hacerlo, tendría que comportarse como si de un disco duro scsi se tratase, pero eso para mi es bastante complicado.
entiendo, entonces eso tiene mas que todo que ver con lo que use como arrancador verdad? …no es cuestion de comandos de ensamblador? …tenia la idea que existia un comando que me permitiera hacer esta interrupcion. De todos modos se agradece por el tiempo para leer y responder mis comentarios y felicitacion por el desarrollo de tu investigacion, esta interesante tambien :).
hola, necesito ayuda, tengo como proyecto crear un programa que se pueda ejecutar sin necesidad de un SO o ayuda como el debug, para hacer mas sencillo todo, sin disco duro, solamente dejando el programa en una memoria flash y que se ejecute al iniciar la pc, su post es el unico que e encontrado que se asemeje a lo que necesito pero aun no comprendo como hacer que lo cargue al inicio podria ayudarme?
De acuerdo, pero antes de todo, ¿conoces como funciona el arranque de un PC?
dependiendo de como este configurado en la bios se inician los dispositivos si el HDD esta como de primero busca en el sector 0 para buscar un archivo arrancable, mi intencion es dejar a una memoria flash como primer arranque el problema es que aun que tengo hecho un programa en ensamblador todavia no comprendo com hacer para que cargue ese programa y tambien quisiera saber si en el mismo programa necesito hacer que reconozca los perifericos, gracias
Bueno, me refería más a nivel interno. El primer sector del usb, disco, disquete, cd, etc se carga en la posición de memoria 0000:7C00. A partir de ahí sólo puedes usar las interrupciones de la BIOS. El código en ensamblador que uses debe tener un ORG 7c00. Quizá esto te ayude http://en.wikibooks.org/wiki/X86_Assembly/Bootloaders
muchas gracias, revisare…
necesito ayuda para encontrar un programa que use el teclado pero sin sistema operativo
Woow
muy bien la informacion me saco de dudas pero me referia a si puedo ejecutar un programa almacenado en mi disco duro
Solo lo requiero para senderismo
Muy interesante el correr programas sin sistema operativo. Una consulta si tengo un archivo BAT en que parte del código tengo que colocar el nombre de dicho archivo. Y en el ejemplo se usa un disco flexible se podría cambiar a una USB y como seria el código de antemano muchas gracias .