查询汇编前缀'times'

时间:2013-11-05 05:14:18

标签: assembly x86 nasm bootloader

以下是我想了解的汇编代码。使用nasm汇编此代码后,如何填充512个字节?

因为我还不清楚510-($-$$)在这里做什么的意思?根据以下代码,$$$的价值是多少?

http://www.brokenthorn.com/Resources/OSDev3.html

;***************************

org 0x7c00              ; We are loaded by BIOS at 0x7C00

bits    16              ; We are still in 16 bit Real Mode

Start:

    cli             ; Clear all Interrupts
    hlt             ; halt the system

times 510 - ($-$$) db 0   ; We have to be 512 bytes. Clear the rest of the bytes with 0

dw 0xAA55           ; Boot Signature

;*********************

1 个答案:

答案 0 :(得分:0)

NASM manual,“3.5表达式”部分:

  

NASM在表达式中支持两个特殊标记,允许计算涉及当前的程序集位置:$和$$标记。 $计算包含表达式的行开头的程序集位置;所以你可以使用JMP $编写无限循环。 $$评估到当前部分的开头;所以你可以通过使用($ - $$)来判断你的部分有多远。

因此,上面的代码执行以下操作:

  1. 计算'cli'和'hlt'指令占用N = $ - $$的字节数。对于x86处理器,它将是0x7C02-0x7C00 = 2,因为两个指令各占1个字节。
  2. 保留(510-N)零字节。对于x86处理器,将为508字节。
  3. 保留一个字0xAA55占用2个字节。
  4. 意图是有一个512字节的块:N +(510-N)+ 2 = 512