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.

En tiempo de ensamblado, lee el valor de una variable de datos.

Estoy creando una especie de sistema operativo de prueba, como prueba de concepto. Estoy utilizando NASM como mi ensamblador y me preguntaba si puedo multiplicar una constante (por ejemplo, 512) por una variable (SECTOR_COUNT).

En caso de que ayude, el comando real que uso para compilar el cargador de arranque es el siguiente:

bash
nasm -f bin boot.asm -o os.bin

Un ejemplo de lo que quiero hacer es el siguiente:

begin_main_program:

times (512*[SECTOR_COUNT]-511)-($-begin_main_program)

Cuando intento compilar eso, NASM dice que necesito pasar un valor constante. Entonces, me pregunto si hay alguna manera de hacer lo anterior y no tener que pasar un valor constante.

EDITAR: corregido times (512*SECTOR_COUNT-511)... a times (512*[SECTOR_COUNT]-511)... (un puntero desreferenciado, supongo)

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Sí, puedes multiplicar una constante (como 512) por una variable (como SECTOR_COUNT) en el ensamblador NASM utilizando corchetes alrededor del nombre de la variable. Esto le indica al ensamblador que trate la variable como una ubicación de memoria y use el valor almacenado allí.

    Por ejemplo:

    mov eax, 512        ; cargar constante en el registro
    mov ebx, [SECTOR_COUNT]  ; cargar variable desde la memoria
    mul ebx             ; multiplicar constante por variable
    

    Esto multiplicará el valor en SECTOR_COUNT por 512 y almacenará el resultado en el registro eax.

    Sin embargo, en tu caso específico, parece que estás utilizando la directiva times para repetir una sección de código un cierto número de veces basado en el producto de 512 y SECTOR_COUNT. En este caso, no puedes usar corchetes, ya que times no funciona con ubicaciones de memoria.

    En cambio, puedes calcular el producto utilizando una operación aritmética regular y pasar ese valor como una constante a times. Por ejemplo:

    mov eax, 512        ; cargar constante en el registro
    mov ebx, [SECTOR_COUNT]  ; cargar variable desde la memoria
    mul ebx             ; multiplicar constante por variable
    sub eax, 511        ; restar 511
    times eax-($-begin_main_program) db 0    ; repetir código basado en el producto
    

    Esto calculará el producto de 512 y SECTOR_COUNT, le restará 511 y luego repetirá la siguiente sección de código esa cantidad de veces. La parte -($-begin_main_program) le indica a NASM que calcule la cantidad de bytes entre la ubicación actual ($) y begin_main_program, y reste eso del contador. Esto asegura que la sección de código tenga exactamente la longitud correcta para llenar el espacio restante en el sector.

    Ten en cuenta que en tu ejemplo tenías times (512*SECTOR_COUNT-511)-($-begin_main_program), pero esto no funcionará ya que SECTOR_COUNT es una ubicación de memoria, no un valor constante. En su lugar, debes usar times (512*[SECTOR_COUNT]-511)-($-begin_main_program) para desreferenciar el puntero y utilizar el valor almacenado en memoria.

Comments are closed.