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)
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:
Esto multiplicará el valor en
SECTOR_COUNT
por 512 y almacenará el resultado en el registroeax
.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 de512
ySECTOR_COUNT
. En este caso, no puedes usar corchetes, ya quetimes
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:Esto calculará el producto de
512
ySECTOR_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 ($
) ybegin_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 queSECTOR_COUNT
es una ubicación de memoria, no un valor constante. En su lugar, debes usartimes (512*[SECTOR_COUNT]-511)-($-begin_main_program)
para desreferenciar el puntero y utilizar el valor almacenado en memoria.