Assemble-一次读取一个数据变量的值

Assemble-time read the value of a data variable

我正在制作一种测试操作系统,作为概念验证。我正在使用 NASM 作为我的汇编程序,并且想知道我是否可以将一个常数(即 512)乘以一个变量(即 SECTOR_COUNT)。

如果有帮助,我用来编译引导加载程序的实际命令如下:

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

我想做的一个例子如下:

begin_main_program:

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

当我尝试编译它时,NASM 说我需要传入一个常量值。所以,我想知道是否有一种方法可以做到以上几点,而不必传入常量。

编辑:将 times (512*SECTOR_COUNT-511)... 固定为 times (512*[SECTOR_COUNT]-511)...(我猜是一个取消引用的指针)

汇编语言不是这样工作的。它 assembles 字节到输出文件中,并且无法在 assemble 时读回这些字节。 “变量”是一个高级概念,您可以在 asm 中 实现 ,但不受原生支持1.

如果你想让多个事物依赖同一个值,
使用 foo equ 123 定义一个 assemble 时间常量,以后可以在多个地方使用。

要assemble数据存储器中具有该值的一些字节,使用bar: dw foo

它是一个 assemble 时间常数,因此您 可以 resb foo*512
之类的事情 times (512*foo-511)-($-begin_main_program)

如果你只做了 bar: dw 123,那么在组装其他线路时就无法到达 123。 (bar: 标签与 dw 123db 123, 0 或您选择放在它之前或之后的任何内容是分开的。它为您提供了一种从其他地方引用该地址的方法,例如 dw bar 到 assemble 指针,或 mov ax, [bar] 到 assemble 一条指令,在 运行 时将从该绝对地址加载。)


脚注 1:除了在 NASM 的宏语言中,像 %assign i i+1 这样的东西 - 在 %rep 10 / %endrep 块中很有用。
https://nasm.us/doc/nasmdoc4.html#section-4.1.8