es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Configuración de registro para metal sin procesar

Estoy intentando codificar aplicaciones a nivel de BIOS por diversión. Probé mi programa en una máquina virtual y funcionó, pero en metal desnudo es muy inestable. He oído que necesitas configurar segmentos y registros antes de codificar en metal desnudo, pero no puedo encontrar ningún recurso sobre qué configuración necesito hacer. Si ayuda, aquí está el código:

“`
; Sé que no es la forma adecuada de imprimir una cadena, pero es solo para pruebas

start:
mov ah, 0x0e
mov al, ‘H’
int 0x10
mov al, ‘e’
int 0x10
mov al, ‘l’
int 0x10
mov al, ‘l’
int 0x10
mov al, ‘o’
int 0x10
mov al, ‘ ‘
int 0x10
mov al, ‘W’
int 0x10
mov al, ‘o’
int 0x10
mov al, ‘r’
int 0x10
mov al, ‘l’
int 0x10
mov al, ‘d’
int 0x10
mov al, ‘!’
int 0x10
jmp $
times 510-($-$$) db 0
db 0x55, 0xaa

Y aquí está la salida

¡Hola Mundo!

He intentado imprimir otras cosas y son muy inconsistentes e inestables.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Es probable que el comportamiento defectuoso sea resultado de no configurar correctamente los segmentos y registros. Cuando se ejecuta código en hardware sin software adicional, el programa necesita configurar los registros de segmento (CS, DS, SS y ES) y el puntero de pila (SP) correctamente para acceder a la memoria de manera correcta.

    Sin una segmentación adecuada, es posible que el código acceda a ubicaciones de memoria incorrectas o tenga problemas de alineación.

    Aquí tienes un ejemplo de cómo configurar correctamente los segmentos y el puntero de pila antes de ejecutar el código:

    start:
      mov ax, 0x0000  ; Configurar segmentos
      mov ds, ax
      mov es, ax
      mov ss, ax
      mov sp, 0xFFFF  ; Configurar puntero de pila
    
      ; Ejecución de código
      mov ah, 0x0e
      mov al, 'H'
      int 0x10
      ; ...
    

    Esto establecerá todos los registros de segmento en el segmento 0x0000 y el puntero de pila en 0xFFFF.

    También es bueno practicar limpiar todos los registros antes de usarlos para evitar comportamientos inesperados.

    start:
      xor ax, ax    ; Limpiar registro AX
      mov ds, ax    ; Configurar segmentos
      mov es, ax
      mov ss, ax
      mov sp, 0xFFFF  ; Configurar puntero de pila
    
      ; Ejecución de código
      xor ax, ax    ; Limpiar registro AX
      mov ah, 0x0e
      mov al, 'H'
      int 0x10
      ; ...
    

    Es importante tener en cuenta que diferentes arquitecturas pueden tener requisitos diferentes para configurar segmentos y registros, por lo que es importante consultar la documentación apropiada para tu plataforma específica.

Comments are closed.