Programación General > ASM (Ensamblador)

 Bootear Desde Cd

(1/1)

krnl64:
Hola a todos.

Verán estoy tratando de arrancar el ordenador desde una iso.
Use el FASM para generar el bin de arranque y otro bin que seria un interprete de comandos.

Copiandolos a un floppy y a archivos IMG (para el VMWARE) funciona bien.

Pero qué puedo hacer para conseguir arrancar desde una iso ?

Probe a ponerle un autorun, pero no funciona.

Gracias

Eternal Idol:
El autorun es un archivo de Windows. Me parece que necesitas El Torito.

krnl64:
Gracias por la info. Ya consegui hacerlo. Aunque tengo otro problema xDD

Me arranca pero no interpreta los comandos.

Pueden decirme que es lo que hay mal ? porque he revisado el codigo (que no es mio) y no veo nada extraño.

Se me olvidaba, es Fasm.

Gracias

Código del Kernel


--- Código: Text ---  ;--------------------------; INICIO;--------------------------   cli        &#59; Desactivamos interruptores  mov    ax,0x1000  &#59; AX = 0x1000 donde es cargado el kernel  mov    ds,ax  &#59; DS = 0x1000  mov    es,ax  &#59; ES = 0x1000  mov    ss,ax  &#59; SS = 0x1000  mov    sp,0xFFFF  &#59; SP = 0xFFFF final de la memoria  sti        &#59; Reactivamos los interruptores   call    clear  &#59; Borramos la pantalla  call    cursor  &#59; Ponemos el cursor  mov    si,NoDOS  &#59; Apuntamos SI a la cadena  call    puts    &#59; Ponemos el prompt  mov    si,elprompt&#59; Apuntamos SI a la cadena  call    puts    &#59; Ponemos el prompt ;------------------------------------------------------------------------------- ;--------------------------; MAIN (CLI);-------------------------- main:   hlt        &#59; Evitamos que el CPU se caliente (halt)  mov    cx,64  &#59; Limitamos las cadenas a 60 caracteres  mov    di,comando&#59; Apuntamos a la cadena del comando  call    gets    &#59; Obtenemos el comando del teclado procesar:   pusha      &#59; Guardamos todos los registros en la pila  push    es    &#59; Guardamos ES en la pila ;---------; cHOLA;---------   mov    si,comando&#59; Ponemos la direccion de "comando" en SI  mov    cx,5    &#59; Numero de letras del comando (incluye el 0)  mov    di,cHOLA  &#59; Apuntamos DI a la cadena del comando  repe    cmpsb  &#59; REPE = Repetir mientras sea igual y          &#59; disminuir CX          &#59; CMPSB = Comparar SI con DI          &#59; SI+1 y DI+1  jne    no_cHOLA  &#59; Si no es igual seguimos  call    saludar  &#59; Llamamos a la funcion saludar  jmp    fin_procesar&#59; Terminamos con este comando no_cHOLA: ;--------------------------; PONER COMANDOS AQUI!!;-------------------------- fin_procesar:   call    prompt  &#59; Ponemos el prompt  pop    es    &#59; Recuperamos ES  popa        &#59; Recuperamos los registros generales  jmp    main    &#59; Repetimos ;------------------------------------------------------------------------------- ;--------------------------; FUNCIONES;-------------------------- clear:        &#59; CLEAR @@@@   mov    ah,0x06  &#59; AH = 0x06 BIOS Scroll  mov    al,0x00  &#59; AL = 0x00 (lineas) 0 = Pantalla completa  mov    bh,0x07  &#59; BL = 0x07 0 = Fondo Negro, 7 = Texto Blanco   mov    ch,0x00  &#59; CH = 0x00 Linea superior (y = 0)  mov    cl,0x00  &#59; CL = 0x00 Columna Izquierda (x = 0)  mov    dh,0x18  &#59; DH = 0x18 Linea Inferior (y = 24)  mov    dl,0x4F  &#59; DL = 0x4F Columna Derecha (x = 79)  int    0x10    &#59; BIOS VIDEO  ret ;------------------------------------------------------------------------------- prompt:        &#59; PROMPT @@@@   mov    si,elprompt&#59; SI apunta a la cadena  call    puts    &#59; Llamamos al procedimiento puts  ret        &#59; Regresamos ;------------------------------------------------------------------------------- cursor:        &#59; CURSOR @@@@   mov    ah,0x02  &#59; BIOS posicion del cursor  mov    bh,0x00  &#59; Pagina de memoria  mov    dh,0x00  &#59; Fila, posicion en Y  mov    dl,0x00  &#59; Columna, posicion en x  int    0x10    &#59; BIOS VIDEO  ret        &#59; Regresamos ;------------------------------------------------------------------------------- saludar:        &#59; SALUDAR @@@@   mov    si,hola  &#59; SI apunta a la cadena  call    puts    &#59; Llamamos al procedimiento print  ret        &#59; Regresamos ;------------------------------------------------------------------------------- putc:        &#59; PUTC @@@@   push    ax    &#59; Guardamos AX en la pila  cmp    al,0x09  &#59; Comparamos Al para ver si es TAB (0x09)  je    .esTAB  &#59; Si es TAB saltamos  mov    ah,0x0E  &#59; BIOS poner caracter  mov    bh,0x00  &#59; Pagina 0  mov    bl,0x07  &#59; Blanco sobre Negro  int    0x10    &#59; BIOS VIDEO  jmp    .fin    &#59; Terminamos .esTAB:   mov    al,0x20  &#59; Ponemos en AL el caracter de espacio  call    putc    &#59; Llamamos a esta misma funcion 5 veces  call    putc    &#59; para poner en pantalla un TAB  call    putc    &#59; de 5 espacios  call    putc    &#59; ...  call    putc    &#59; ... .fin:   pop    ax    &#59; Recuperamos AX de la pila  ret        &#59; Regresamos ;------------------------------------------------------------------------------- gets:        &#59; GETS @@@@   push    cx    &#59; Guardamos CX en la pila  push    ax    &#59; Guardamos AX en la pila  push    dx    &#59; Guardamos DX en la pila  push    di    &#59; Guardamos DI en la pila  mov    dx,di  &#59; Guardamos el inicio de la cadena en SI .tecla:   cmp    cx,0    &#59; Terminamos?  je    .fin    &#59; Si CX es 0 terminamos  xor    ax,ax  &#59; AH = 0 - BIOS obtener tecla  int    0x16    &#59; BIOS Servicios de Teclado  dec    cx    &#59; CX = CX-1  cmp    al,0x0D  &#59; Es ENTER? (ascii decimal 13)  je    .enter  &#59; Si es igual terminamos  cmp    al,0x08  &#59; Es Backspace (ascii decimal 8)  je    .backspace&#59; Si es igual saltamos a backspace  call    putc    &#59; Si no ponemos el caracter  mov    [di],al  &#59; Copiamos AL (caracter) en la cadena [DI]  inc    di    &#59; DI = DI+1  jmp    .tecla  &#59; Repetimos con la siguiente tecla .backspace:   cmp    dx,di  &#59; Comparamos con el principio de la cadena    je    .tecla  &#59; Si son iguales pedimos otra tecla  dec    di    &#59; DI = DI-1   mov    ah,0Eh  &#59; BIOS Poner caracter  mov    al,0x08  &#59; Movemos el cursor hacia atras (backspace)  mov    bh,0x00  &#59; Pagina 0  mov     bl,0x01  &#59; Borramos  int    0x10    &#59; BIOS VIDEO   mov    ah,0Eh  &#59; BIOS Poner caracter  mov    al,0x20  &#59; Ponemos espacio  mov    bh,0x00  &#59; Pagina 0  mov     bl,0x01  &#59; Borramos  int    0x10    &#59; BIOS VIDEO   mov    ah,0Eh  &#59; BIOS Poner caracter  mov    al,0x08  &#59; Movemos el cursor hacia atras (backspace)  mov    bh,0x00  &#59; Pagina 0  mov     bl,0x01  &#59; Borramos  int    0x10    &#59; BIOS VIDEO   jmp    .tecla  &#59; Pedimos otra tecla .enter:   mov    al,0x0D  &#59; Retorno de Linea (13)  call    putc    &#59; Ponemos en pantalla  mov    al,0x0A  &#59; Nueva Linea (10)  call    putc    &#59; Ponemos en pantalla .fin:   mov    byte  [di],0&#59; Terminamos la cadena con cero  pop    di    &#59; Recuperamos los registros  pop    dx    &#59; ...  pop    ax    &#59; ...  pop    cx    &#59; ...  ret        &#59; Regresamos ;------------------------------------------------------------------------------- puts:   lodsb      &#59; Cargamos el caracter de DS:SI en AL  or    al,al  &#59; Hacemos un OR al registro AL  jz     .fin_puts  &#59; Terminamos si es cero  mov    ah,0x0E  &#59; Poner caracter (parametro int 0x10)  int    0x10    &#59; BIOS VIDEO  jmp    puts    &#59; Siguiente caracter .fin_puts:   ret        &#59; termina el procedimiento y regresamos ;------------------------------------------------------------------------------- ;--------------------------; VARIABLES;--------------------------   comando:  times  128  db 0&#59; Espacio para almacenar el comando  elprompt  db '@:',0    &#59; El prompt "@:"  cHOLA  db "hola",0  &#59; Comando "hola"  hola    db "Hola CLI!!",13,10,0; Texto del comando "hola"   NoDOS  db "NoDOS 0.1",13,10,0; Cadena de Bienvenida!   

Navegación

[0] Índice de Mensajes

Ir a la versión completa