Foros del Web » Programación para mayores de 30 ;) » Programación General »

Ayuda con Ensamblador x86

Estas en el tema de Ayuda con Ensamblador x86 en el foro de Programación General en Foros del Web. Tengo un pequeño gran problema. Tengo dos aplicaciones grabadas en una imagen de disco. En el primer sector de la imagen esta el bootloader programado ...
  #1 (permalink)  
Antiguo 05/02/2011, 11:58
 
Fecha de Ingreso: febrero-2011
Mensajes: 1
Antigüedad: 13 años, 10 meses
Puntos: 0
Ayuda con Ensamblador x86

Tengo un pequeño gran problema. Tengo dos aplicaciones grabadas en una imagen de disco. En el primer sector de la imagen esta el bootloader programado en ensamblador x86 con la sintaxis de intel ensamblado en nasm, que muestra un mensaje en la pantalla y teoricamente ejecuta la segunda aplicacion y en el segundo sector tengo una aplicacion programada en c, el "kernel" (por muy minusculo que sea) y compilada con gcc que muestra otro mensaje en la pantalla y ejecuta un par de instrucciones como encender el teclado, capturar texto desde el teclado, etc etc... El bootloader carga perfectamente pero el problema esque no me carga la segunda aplicacion por lo que no me muestra el segundo mensaje ni enciende el teclado etc etc... aca pongo el codigo del bootloader:
Código:
    [BITS 16] ; Seteo a modo de 16bits q es como se encuentra el procesador al inicio
    [ORG 0] ; Pongo el codigo desde el principio del segmento

    jmp inicializar ; Voy al inicio del programa, salto todo lo q es declaraciones

    ;--------------------------------------------------------------
    ; Datos usados en el proceso de boot-loading
    ;--------------------------------------------------------------

    mensajeInicial db "Hola Mundo!!", 0x0D,0x0A,0

    ;--------------------------------------------------------------
    ; impMensaje imprime un mensaje en ascii por pantalla
    ;--------------------------------------------------------------

    impMensaje:
    imprimir:
    lodsb ; Carga el byte q esta en ds:si en al
    or al,al ; Mira si el caracter es 0 (fin)
    jz finImpMensaje
    mov ah,0x0E ; Indica q la interrupcion sera para imprimir por pantalla
    mov bx,0x0009 ; Se indica pagina base y color de fondo
    int 10h ; Llamada al BIOS
    jmp imprimir

    finImpMensaje: ret

    ;--------------------------------------------------------------
    ; Procedimiento que carga un programa contenido en el floppy
    ;--------------------------------------------------------------

    cargarKernel:
    reset:
    mov ax, 0x0000 ; opcion para resetear el dispositivo
    mov dl, 0x00 ; drive=0 floppy
    int 0x13 ; interrupcion 13 del bios
    jc reset ; si hay carry es q ocurrio un error, entonces intento de nuevo

    cargar:
    mov ax, 0x1000 ; ES:BX es donde se carga lo leido por la interrupcion
    mov es, ax ; por lo que pongo en ES 1000
    mov bx, 0x0000 ; y pongo en bx la dir 0000

    mov ah, 0x02 ; con ah=2 digo q voy a leer
    mov al, 0x05 ; con al indico la cantidad de sectores a leer
    mov ch, 0x00 ; cilindro=0
    mov cl, 0x02 ; sector=2 (en el 1 tengo el booteable)
    mov dh, 0x00 ; cabeza=0
    mov dl, 0x00 ; drive=0 es el floppy
    int 13h ; invoco la interrupcion
    jc cargar ; si ocurrio un error (carry=1), intento de nuevo

    jmp 0x1000:0x00 ; salto a la direccion donde cargue el programa

    ret ; nunca va a llegar a ejecutarse

    ;--------------------------------------------------------------
    ; Procedimiento que inicializa los registros
    ;--------------------------------------------------------------
    inicializar:
    ;el BIOS me pone en el segmento 07C00h, asi q seteo los segmentos a mi posicion actual
    ;Asi no tenemos q añadir 07C00h a todos nuestros datos
    mov ax, 0x07C0
    mov ds, ax
    mov es, ax
    mov fs, ax
    mov gs, ax

    ;inicializo los valores para la pila
    cli ;desabilito las interrupciones
    mov ax, 0x0000
    mov ss, ax
    mov sp, 0xFFFF
    sti ;habilito nuevamente las interrupciones
    jmp main

    ;--------------------------------------------------------------
    ; main del programa
    ;--------------------------------------------------------------

    main:
    mov si, mensajeInicial ; Muestro el mensaje por pantalla
    call impMensaje

    call cargarKernel

    TIMES 510-($-$$) DB 0 ; Hace q el archivo sea de 512 bytes de longitud
    dw 0AA55h ; Indica al bios q es un bootstrap
En que estoy fallando? Gracias por adelantado. Uso Kubuntu, Qemu, Nasm, GCC y Kate.

Etiquetas: ensamblador
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 01:38.