Ejecutar un programa sin sistema operativo

9:04 pm Uncategorized

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 Parra 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
ret

w 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.

74 Respuestas
  1. Albin :

    Fecha: 4 mayo 2005 @ 18:54

    ole tus huevos!

  2. sistemasorp :

    Fecha: 4 mayo 2005 @ 19:27

    jajajaja. Quizá me haya pasado un poquito haciendolo todo en ensamblador con el debug, pero era la forma más fácil de que todo el mundo pudiera ejecutarlo sin mayores problemas.

  3. sistemasorp :

    Fecha: 11 mayo 2005 @ 16:48

    Agradecer a Manu Dávila el que haya probado el invento y me haya recomendado decir que hay que poner un retorno de carro y que el fichero se ha de guardar el el disco duro.

  4. Anonymous :

    Fecha: 1 junio 2005 @ 7:24

    Recuerda que xor reg, reg, es usualmente más veloz que mov reg, 0

  5. sistemasorp :

    Fecha: 2 junio 2005 @ 10:52

    Eso no es del todo cierto. En los casos que son registros de 16 bit o más la velocidad efectivamente si es mayor. En casos de registros de 8 bit los ciclos de reloj son los mismos y el tamaño de la instrucción (2 bytes) es igual.

    Como podrás comprobar en el código los registros de 16 bits si uso el xor, sin embargo con los de 8 uso el mov por lo que te he explicado arriba.

  6. Cristian :

    Fecha: 3 noviembre 2005 @ 9:50

    Hola Oscar, estoy haciendo un proyecto de un pequeño sistema autoarrancable (tipo un SO monolitico) y me gustaria que me comentarás un poco del codigo (mi conocimiento de ASM es más bien nulo, lo voy a hacer en C++ aunque tenga que usar alguna rutina de ASM).
    Mi mail es cristiangmNOPONGASESTO@gmail.com

  7. Anonymous :

    Fecha: 22 noviembre 2005 @ 17:46

    Hola hermano programador… Fijate que tengo un problemón… Me dejaron una tarea para calificacion final en la escuela y si no lo entrego no me gradúo :’(…

    Verás, se que es un programa básico, pero me ha creado muchos dolores de cabeza…

    Se trata de un programa en DEBUG ke tenga el sig. menu:

    1. Altas
    2. Bajas
    3. Consultas
    4. Salir
    Elige tu opcion:

    Al elegir la opcion ke uno desee se tiene ke limpiar la pantalla:
    Limpia la pantalla:

    mov ah,0
    mov al,3
    int 10

    En el numero 1 (altas) debe preguntar:

    Nombre:
    Direccion:
    Telefono:
    e-mail:

    Desea guardar (s/n):

    y todo eso guaradarlo komo archivo .txt
    krea un archivo

    mov ah,3c
    mov cx,0
    mov dx, direccion de memoria
    int 21

    En el num. 2 (Bajas), obviamente tiene ke borrar los archivos creados, pero antes de borrarlos, tiene ke mostrarlos al usuario.
    Borra un archivo

    mov ah,41
    mov dx,dir. de archivo a borrar
    int 21

    En el num. 3 (consultas) debe de mostrar el archivo ke se kreo, ademas de permitir hacerle modificaciones a dicho archivo.
    Abrir un archivo

    mov ah,3d
    mov al, (0 para lectura, 1 para escritura y 2 para ambos, en este caso seria ambos)
    mov dx, dir. de archivo
    int 21

    algunas funciones ke te serian de ayuda:
    Cerrar archivo

    mov cx,ax
    mov ah,3e
    mov bx,cx
    int 21

    Escribir datos en archivo:

    mov ah,40
    mov bx,cx
    mov cx,A
    mov dx, dir. de mem. donde se encuentran los datos a guardar en el archivo.
    int 21

    Leer datos de un archivo:

    mov ah,3F
    mov dx,cx
    mov cx,A
    mov dx, dir…
    int 21

    Te lo enkargo por favor; Hoy por mi mañana por ti… Te lo agradeceria muchisimo karnal (y)…

    Me llamo Jackson
    Mi mail es jackson.ipn@gmail.com

  8. Anonymous :

    Fecha: 19 diciembre 2005 @ 23:28

    Hola, quisiera saber como puedo resetear el equipo con debug, gracias
    mi mail es angeloj23@yahoo.es

  9. sistemasorp :

    Fecha: 20 diciembre 2005 @ 9:11

    No pongais vuestras direcciones de correo electrónico en los comentarios, que es la leña del fuego con que arrasan los spammers.

    En cuanto a lo de resetar, solo si es en modo real (MS-DOS) puedes usar la intrucción jmp ffff:0000. En windows ya no puedes usar ensamblador para este tipo de cosas, por lo que deberías usar la función ExitWindowsEx, y en linux la función reboot(2)

  10. Anonymous :

    Fecha: 20 diciembre 2005 @ 21:05

    Hola, quisiera saber si hay alguna interrupción (función bios) que permita reiniciar el equipo y como puedo bloquear algunas teclas como el ALT,SUP,ALT GR,ETC.
    —– gracias———-

  11. sistemasorp :

    Fecha: 20 diciembre 2005 @ 22:05

    Si es en modo real, puedes usar la función 19h de la BIOS para hacer el reinicio (en frio tendrías que poner a 0 la zona de memoria 40h:72h y en caliente 1234h en la misma zona).

    Para bloquear teclas (hablando siempre del modo real) deberías interceptar la interrupción 9 y derivarla a un codigo tuyo que comprobase la tecla pulsada y la ignorase si es una de las que te interesan

  12. Anonymous :

    Fecha: 11 enero 2006 @ 18:37

    Felicidades por el articulo editado, me parece realmente muy interesante, pero me queda una duda. El arranque se inicia a través del unico archivo generado dentro del disquet, pero… ¿como se define el archivo de inicio de entre muchos que puede haber? ¿O es el mismo Pc (bios, Rom o lo que sea) que lo busca y lo ejecuta si ve que funciona?
    Perdona si me pregunta parece (o es absurda). Gracias

  13. sistemasorp :

    Fecha: 12 enero 2006 @ 9:50

    No, en este caso ya no estamos hablando de archivos, sino de los sectores del disco. La BIOS se encarga de leer el primer sector del disquete, cargarlo en memoria (0:7c00h) y luego lanzar la ejecución a ese punto de la memoria.

  14. Anonymous :

    Fecha: 12 enero 2006 @ 18:13

    Entonces, digamos:
    - copiar primero el archivo que tiene el arranque en el disquet
    - el archivo se queda en el primer sector (suponido que todo él quepa en ese sector,¿no?)
    - cuando la bios busque coge este archivo (que esta en este sector), lo copia en la memoria desde (0:7c00h) y lo ejecuta
    Esta bien? o no es tan sencillo.
    Gracias por haberme contestado.

  15. sistemasorp :

    Fecha: 12 enero 2006 @ 18:55

    No es exactamente un archivo. El archivo contiene código en ensamblador que será grabado directamente en el disquete (no el archivo en si). Como este código en ensamblador ocupa más de 512 bytes (que es lo que puede almacenar un sector) lo graba en dos sectores. La BIOS lee el primer sector, y el codigo cuando se ejecuta se encarga de leer el segundo sector y almacenarlo en memoria.

  16. Anonymous :

    Fecha: 12 enero 2006 @ 19:21

    Creo que lo he entendido.
    Me queda una ultima cosa. Si el codigo (que se distribuye por la capacidad del disquet al copiarlo, por la traduccion del codigo a binario ¿lo digo bien?)se engloba en lo que llamamos fichero por la influencia del MSDOS y es introducido en un disquet formateado (nuevamente por la influencia del MSDOS): ¿Es posible desvincularse del MSDOS y copiar un codigo dentro de un disquet sin formatear?
    ¿O el formateo no influye en nada? lo digo porque casa SO tiene su propio formateo y su propio tipo de FAT.
    Gracias de nuevo.

  17. sistemasorp :

    Fecha: 12 enero 2006 @ 20:25

    Si, si que es posible. Que usase el debug del msdos con un disquete formateado no fue para otra cosa que para simplificar la creación del mismo para todos los usuarios. Se Podría hacer un programa que hiciese esto mismo en windows, linux, Mac OS, OS/2, DR-DOS, etc.

  18. Anonymous :

    Fecha: 29 marzo 2006 @ 6:08

    hola me llamo juan
    lei esto me parecio interesante
    y me dije como sabian hacer esto
    pues esto es lo importante como se hacen las cosas porque y como funcionan etc etc
    lo que yo queria hacer es que al arrancar apareciera un menu de opcciones de arranque de juegos como un emuladorsistema operativo poner el juego en un diquete y que al arrancar bun el juego lo plantee a mis cuates a lo menos saber que se puede hacer da esperanzas y ganas de seguir
    se lo comente a mis cuates no muy quisieron
    y bueno esa era la idea por ello quise saber algo del msdos
    o de las primeras cosas que salieron
    saludos y sigan con estos comenarios
    ha digagame que es un blogger

  19. Anonymous :

    Fecha: 29 marzo 2006 @ 6:19

    nuevamente quiero hacer un comentario me llamo juan
    me gustaria que la programacion fuera mas facil y estas han sido mis mas grandes dudas hasta haora
    en donde se hacian los programas(juegos del atari conoci el 2600 destape uno y era pues un cepillo como de bebe con una bolita la memoria prom)bien en que programa se hacia o en que lenguaje de programacion si segun eran de 8 bits deve ser no tan duro programar en 8 bits
    aunque o si las sentencias eran duras porque no hacer un lenguaje de programacion para esta consola
    bueno son comentarios
    bien es posible hacer
    algo asi como en ves de ponerle este brasito se lo cambiemos es decir
    piratear el msdos y hacer uno mas o menos parecido
    lo que pasa es que tengo un msdos vercion 6.22 en ingles
    cabe en tres disquetess? no parece tan dificil
    a lo que isisite segun es un minisistema operativo
    mi mas grande duda porque no hacer todo en lenguaje maquina
    que tamano tendria un instrucccion como la de solo he conocido un poco de sistaxis de programas de programacion ldp como el vb
    para decirle en lenguaje maquina por ejemplo antrar al direcctorio c como seria
    los dejo
    les voy a ha hacer comentarios
    si es posible me gustaria ver respuestas a esto
    ha hay buenos programas para msdos
    y en donde se encuentran
    no olviden el msdos talves lo mejor que se ha hecho

  20. Anonymous :

    Fecha: 29 marzo 2006 @ 6:25

    oigan
    tengo un problema con un escaner
    me dije no es posible abrir el origen twain y me pregunto si no es el puerto como se sabe que el puerto paralelo esta bien tengo una p4vxms de ecs

  21. Anonymous :

    Fecha: 31 marzo 2006 @ 5:18

    hola chicos me pueden decir
    si hay alguna forma de conseguir el windows 95 en archivos autoejecutable para crear los discos de instalacion donde como cuando o como se le puede hacer
    lo quiero por la ayuda grafica
    y por correr algunos programas que solo corren en verciones viejas
    gracias

  22. Anonymous :

    Fecha: 2 abril 2006 @ 2:12

    hola chicos me pueden decir donde puede decargar el msdos 7.10 me gusatria verlo y que me dijeran
    ha gracias y haganme caso thanks

  23. Anonymous :

    Fecha: 2 abril 2006 @ 2:16

    no se nada de esto pero para hacer un comentario hacerca del el tema
    una ves queria hacer un formato a bajo nivel segun porque pensaba que era mejor y que bueno busque informacion y/o sofware para hacerlo y me encontre que el codigo para hacer un formato a bajo nivel en esto que estudes llaman bug
    era algo asi
    <23<
    <2415io
    dhssad
    ds
    22d
    solo por la manera en que lo vi
    es decir
    se puede hacer un formato a bajo nivel en el disco duro haciendo algo parecido a lo que el autor de esta pagina hizo en relacion a su ministemaoperativo con un blug
    den mas informacion de que es esto del blug
    gracias

  24. sistemasorp :

    Fecha: 3 abril 2006 @ 7:06

    El MSDOS es un sistema operativo propietario y no se puede descargar de ninguna web, ftp o cualquier otro medio legalmente.

  25. Anonymous :

    Fecha: 16 mayo 2006 @ 23:56

    Written by: juanitux
    From: Barcelona

    Hola chaval, que buena idea que me has dado. Te felicito por tu creación.
    Desde hace mucho miro con curiosidad un Libro de Assembler(Ensamblador de los x86), en el cual explica casi a la perfección accesos a servicios de la BIOS, usar DEBUG, etc. Pero nunca habia leído este tipo de información, no soy ingeniero, solo un simple técnico en electrónica, con conocimientos en C y al que le gusta mucho Linux.
    Con tu blog he podido ver la luz :-) , mañana mismo pondré en practica todo esto.

    PD: Felicitaciones

  26. Anonymous :

    Fecha: 6 junio 2006 @ 14:32

    hola muyr bueno tu pblubicacion no se si me puedas ayudar. Deseo que una aplicaci’on similar a a que haz creado se ejecute desde el disco antes de iniciar el sistema operativo\
    Por favor si saber como ayudame vale!!!

  27. sistemasorp :

    Fecha: 6 junio 2006 @ 14:43

    Te puedo echar una mano. Pero tienes que estar seguro de lo que quieres y sobre todo saber ensamblador.

  28. Anonymous :

    Fecha: 5 agosto 2006 @ 17:40

    Hola! Mi nombre es Tavo.. mi duda es la siguiente.. yo copie en el archivo txt hasta la instruccion “RET” porque si copio lo demas me da error.. la cosa es que me ubico en A: y escribo la instruccion debug < archivo.txt pero cuando reinicio la maquina me dice.. “retire cualquier medio presente y presione cualquier tecla”.. la cuestion es… como hago para que el debug me escriba el programa en el primer sector del diskette??? desde ya muchas gracias… Nos vemos…. TAVO

  29. sistemasorp :

    Fecha: 6 agosto 2006 @ 9:47

    Hola Tavo. Debes copiar TODO el código en el fichero TXT o no te funcionará la solución, ya que lo que hay por debajo del RET es lo que realmente hace que se escriba en el disquete. Por otro lado en ningún momento había comentado que tengas que ir a la unidad A: para ejeuctar el debug < archivo.txt, hazlo todo desde la unidad C:

  30. Anonymous :

    Fecha: 10 agosto 2006 @ 14:36

    Hola,
    si el código empieza en 07c0:013c, puesto que los 03ch bytes son la información del disquete, que sumándolos a los 0100h, hacen en total 013ch bytes que dejamos al escribir en el disquete, entonces ¿por qué las cadenas que muestra el programa las referencia en la posición 0000:07c03h y sucesivas?, es más, después de haber realizado el salto inicial que incluye los 0100h. Además, al hacer ese salto inicial, se supone que no es un salto relativo, puesto que los 0100h ya habrían quedado atrás, puesto que se dejan delante del programa. Gracias por leerlo y a ver si me podéis ayudar.

  31. sistemasorp :

    Fecha: 14 agosto 2006 @ 10:17

    El offset de 100h bytes es necesario solo para el debug del msdos, ya que al introducir comandos con la sentencia a estos se empiezan a meter a partir del offset 100h. Por eso en el caso de los saltos verás que se usan esos 100h bytes de más, pero si te fijas en el código ensamblador en realidad son saltos relativos. Por ejemplo:

    La primera instrucción es jmp 1f7, Sin embargo el debug lo transforma a
    E9h F4h 00h, que es un salto relativo de F4h bytes (no es F7h porque ya cuenta con los 3 bytes de la intrucción del salto). Así cuando carga el programa en la memoria en al arrancar desde el disquete, el salto sería a 0000:7cf7h. Como podrás comprobar ya no se usa en ningún momento el offset de 100h bytes, ya que los saltos relativos se adaptan a la zona en memoria en la que esten ejecutandonse.

  32. Anonymous :

    Fecha: 18 agosto 2006 @ 16:35

    Y qué hay de los 03ch datos de información del disquete, porque estos están almacenados en el primer sector del disquete, el cual se copia a la posición 07c00h.

    Sin esos datos, la BIOS no puede copiar y ejecutar el contenido del disquete. A no ser que en realidad no los copie, en cuyo caso no puede interpretarlos, y es contradictorio.

    Otra posibilidad es que los copie en otra posición de memoria… ¿?

  33. sistemasorp :

    Fecha: 20 agosto 2006 @ 8:09

    La BIOS lee el sector completo del disquete a esa posición de memoria, y no necesita ninguna información de disquete ni nada parecido para empezar a ejecutar lo que ha llevado a memoria.

    Si te refieres a la información que pone el MS-DOS sobre el tipo de disco, la etiqueta de volumen, etc. No es necesario, puesto que es información solo relevante para el sistema operativo, no para la BIOS.

    Un disquete le puedes meter lo que quieras en el primer sector siempre que la BIOS lo pueda interpretar como código ejecutable (ya se encargará el código de tomar otras porciones de memoria como datos)

  34. Anonymous :

    Fecha: 20 agosto 2006 @ 18:54

    Hola, me gustaria saber que herramienta diferente de DEBUG puedo utilizar para este ejemplo
    GRACIAS

  35. Anonymous :

    Fecha: 26 agosto 2006 @ 16:58

    Puedes usar el turbo assembler (tasm).
    La cuestión es que a la hora de construirte el .com, el tasm se olvida de los 100h, cosa que esperamos, pero no modifica las direcciones de los saltos y tampoco te hace saltos relativos “ea”, así pues poniendo:

    mov ax, 0108h ;3 bytes
    jmp ax ;2 bytes

    se mantienen los 0108h como dirección de destino, cuando no necesitamos saltarlos porque realmente no están.

    La opción que he empleado ha sido colocar:

    db 0eah
    db 05h
    db “Sel”

    para que salte la cadena “Sel”, pero no funciona.

    ¿Por qué no funciona?
    Ahora mismo no tengo la información delante, ¿es posible que los saltos relativos en vez de ser “ea” sean “e9″?

  36. sistemasorp :

    Fecha: 29 agosto 2006 @ 9:10

    Puedes usar etiquetas:

    jmp sel
    .
    .
    .
    .
    .
    sel:
    .
    .
    .
    .

  37. Anonymous :

    Fecha: 23 septiembre 2006 @ 11:22

    Hola,

    compilo código fiable de paso a modo protegido y lo escribo en un disquete.

    Reinicio y, al leer el pc el disquete, se vuelve a reiniciar automáticamente.

    Ya me pasa lo mismo con código fiable y no fiable de paso a modo protegido.

    ¿A qué se puede deber?

  38. sistemasorp :

    Fecha: 23 septiembre 2006 @ 12:16

    No se a que te refieres con codigo fiable y no fiable

  39. Anonymous :

    Fecha: 23 septiembre 2006 @ 16:16

    - Con fiable quiero decir código de fuentes que parecen haberlo testeado con resultados positivos.

    El documento donde está el código es:

    http://www.alpertron.com.ar/ANEXO.PDF

    ¿puede ser que las definiciones equ de la cabecera de los programas provoquen esos reinicios al no ser saltadas por encima?

    - Con no fiable me refiero a código mío.

  40. sistemasorp :

    Fecha: 27 septiembre 2006 @ 17:35

    El problema principal que veo en ese código que me has pasado es que usa la directiva ORG 100h, es decir, a cualquier salto se le sumarán 100 bytes y no funcionará, ya que debería usarse el ORG 0.

  41. Anonymous :

    Fecha: 8 octubre 2006 @ 10:55

    El programa ensamblador TASM obliga a que se coloque un ORG 100h al principio.

    He probado código ensamblador en modo real con esa directiva y ha funcionado.

    ¿te animas a conseguir el paso a modo protegido, para publicarlo por ejemplo en tu blog?

  42. sistemasorp :

    Fecha: 10 octubre 2006 @ 9:32

    Bién, en ese caso hágalo de la siguiente forma:

    Cree un fichero .ASM y meta el siguiente código:


    .model small
    .stack 0
    .code
    org 7b00h ; necesario hacerlo 100h bytes antes
    inicio:
    jmp codigo
    db ‘Seleccione una opcion del menu’
    db ’1- Mostrar hora’
    db ’2- Coche Fantastico’
    db ’3- Salir’
    db ‘Desarrollado por Oscar Rodriguez Parra 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’
    codigo:
    cli
    xor ax,ax
    ;… continuar aqui con el resto de código
    END

    A continuación ejecute TASM <fichero.asm> y después TLINK <fichero.obj>

    Después ejecute debug <fichero.exe> y finalmente w 7c00 0 0 2 (con un disquete metido dentro)

    Con este método ya puede usar el TASM para crear su propio código con saltos a etiquetas y demás y luego poder guardarlo en el disquete.

  43. Anonymous :

    Fecha: 10 octubre 2006 @ 16:20

    A ver si alguien sabe por qué mi ventana de MS-DOS no me permite ejecutar los programas .COM ni el programa DEBUG.

    Antes sí me lo permitía, y ahora sin que yo haya tocado nada (conscientemente), han dejado de funcionar.

    Aparece el mensaje:
    “El sistema no puede ejecutar el programa especificado”

  44. Anonymous :

    Fecha: 24 octubre 2006 @ 18:32

    disculpa por mi pregunta , pero en tu programa como , con que y donde mandas llamar a los mensajes que colocas en los db si no tienen un identificador por ejemplo:

    mensaje db “esto es texto $”

  45. sistemasorp :

    Fecha: 24 octubre 2006 @ 21:11

    La forma del ejemplo es típica en MSDOS, tambien podría haber usado el caracter 0 como en C. Sin embargo las funciones de la BIOS usan directamente el principio de la cadena y su tamaño para representarla.

  46. Anonymous :

    Fecha: 31 octubre 2006 @ 23:33

    q tal genios de la programacion , me pueden explicar como funciona esta rutina ??=??’

    MOV AH, 1
    INT 16h
    JZ Sigue
    MOV AH, 0
    INT 16H

    ;si presionas eSc finaliza el programa:
    CMP AL, 1BH
    JNZ Sigue
    INT 19H

  47. sistemasorp :

    Fecha: 2 noviembre 2006 @ 8:26

    Pues comprueba si existe en el buffer del teclado una tecla que haya sido previamente pulsada, si no existe vuelve a la etiqueta Sigue, si existe comprueba que esa tecla sea el escape, si no lo es vuelve a la etiqueta Sigue, si lo es sigue con el resto de instrucciones.

  48. Rafael :

    Fecha: 5 noviembre 2006 @ 21:02

    Hola viejo quisiera q me ayudes en como hacer un programa en lenguaje ensamblador que lea un diskette. Ya sea con una interrupcion directamente desde la bios o desde DOS llamando al archivo y luego al comando DIR. Espero puedas ayudarme. Mi mail es rafo_del_20@yahoo.es

  49. sistemasorp :

    Fecha: 6 noviembre 2006 @ 7:56

    Hola mayorcete, pues no se exactamente que es lo que quieres… ¿leer un disquete? ¿leer un fichero? ¿ejecutar un dir?

  50. Rafael :

    Fecha: 6 noviembre 2006 @ 18:47

    Hola, la respuesta a tu pregunta es leer un diskette. Lo demas eran posibles formas de hacerlo aunq no sabia como. Podrias ayudarme?Saludos y gracias.

  51. Rafael :

    Fecha: 6 noviembre 2006 @ 19:27

    Hola, leer el contenido de un diskette, es decir, los archivos almacenados en un diskette. Espero puedas ayudarme. Saludos y gracias.

  52. sistemasorp :

    Fecha: 6 noviembre 2006 @ 20:38

    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

  53. Jesus :

    Fecha: 11 diciembre 2006 @ 2:36

    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.

  54. Anonymous :

    Fecha: 26 enero 2007 @ 16:09

    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

  55. Anonymous :

    Fecha: 9 abril 2007 @ 13:49

    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!!!

  56. sistemasorp :

    Fecha: 10 abril 2007 @ 11:50

    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)

  57. Arbey Dario Muñoz Gomez :

    Fecha: 30 abril 2007 @ 21:37

    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

  58. Anonymous :

    Fecha: 11 mayo 2007 @ 17:28

    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

  59. Percy :

    Fecha: 21 mayo 2007 @ 16:14

    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

  60. alberto :

    Fecha: 27 mayo 2007 @ 8:08

    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.

  61. Enrique :

    Fecha: 11 junio 2007 @ 19:00

    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

  62. Enrique :

    Fecha: 11 junio 2007 @ 19:01

    —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

  63. Anonymous :

    Fecha: 12 junio 2007 @ 22:18

    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.

  64. Anonymous :

    Fecha: 27 julio 2007 @ 22:54

    trate de compilar en fasm pero no funciona alguien sabe algo al respecto

  65. juanitux :

    Fecha: 20 octubre 2007 @ 1:28

    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 !!!

  66. JUANITUX :

    Fecha: 20 octubre 2007 @ 1:32

    UY! lo siento no ha salido bien el enlace:

    http://www.htl-steyr.ac.at/~morg/pcinfo/
    hardware/interrupts/inte1at0.htm

  67. Ednia :

    Fecha: 24 octubre 2007 @ 6:15

    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.

  68. Egroj :

    Fecha: 12 octubre 2008 @ 17:46

    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.

  69. yamil :

    Fecha: 4 mayo 2010 @ 20:02

    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!

  70. admin :

    Fecha: 4 mayo 2010 @ 20:21

    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.

  71. bruno cosio :

    Fecha: 13 julio 2010 @ 23:08

    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

  72. admin :

    Fecha: 14 julio 2010 @ 5:36

    No hace falta que repitas el mismo programa que aparece en el artículo.

  73. rolando :

    Fecha: 7 diciembre 2011 @ 19:01

    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++?

  74. admin :

    Fecha: 7 diciembre 2011 @ 21:17

    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.

Leave a comment

Your comment

You can use these tags: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre lang="" line="" escaped="" highlight="">

Please note: Comment moderation is enabled and may delay your comment. There is no need to resubmit your comment.