Ejecutar un programa sin sistema operativo

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

91 comentarios en “Ejecutar un programa sin sistema operativo

  1. sistemasorp

    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.

    Responder
  2. sistemasorp

    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.

    Responder
  3. sistemasorp

    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.

    Responder
  4. Cristian

    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

    Responder
  5. Anonymous

    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

    Responder
  6. sistemasorp

    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)

    Responder
  7. Anonymous

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

    Responder
  8. sistemasorp

    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

    Responder
  9. Anonymous

    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

    Responder
  10. sistemasorp

    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.

    Responder
  11. Anonymous

    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.

    Responder
  12. sistemasorp

    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.

    Responder
  13. Anonymous

    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.

    Responder
  14. sistemasorp

    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.

    Responder
  15. Anonymous

    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

    Responder
  16. Anonymous

    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

    Responder
  17. Anonymous

    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

    Responder
  18. Anonymous

    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

    Responder
  19. Anonymous

    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

    Responder
  20. Anonymous

    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

    Responder
  21. sistemasorp

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

    Responder
  22. Anonymous

    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

    Responder
  23. Anonymous

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

    Responder
  24. Anonymous

    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

    Responder
  25. sistemasorp

    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:

    Responder
  26. Anonymous

    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.

    Responder
  27. sistemasorp

    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.

    Responder
  28. Anonymous

    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… ¿?

    Responder
  29. sistemasorp

    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)

    Responder
  30. Anonymous

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

    Responder
  31. Anonymous

    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?

    Responder
  32. Anonymous

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

    Responder
  33. sistemasorp

    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.

    Responder
  34. Anonymous

    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?

    Responder
  35. sistemasorp

    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.

    Responder
  36. Anonymous

    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»

    Responder
  37. Anonymous

    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 $»

    Responder
  38. sistemasorp

    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.

    Responder
  39. Anonymous

    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

    Responder
  40. sistemasorp

    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.

    Responder
  41. Rafael

    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

    Responder
  42. Rafael

    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.

    Responder

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *