Assembly 查询汇编前缀';泰晤士报';

Assembly 查询汇编前缀';泰晤士报';,assembly,x86,nasm,bootloader,Assembly,X86,Nasm,Bootloader,下面是我想理解的汇编代码。使用nasm组装此代码后,如何填充512字节 因为我还不清楚510-($-$$)在这里做什么?根据以下代码,$和$$的值是多少 摘自第3.5节“表达式”: NASM在表达式中支持两个特殊标记,允许计算涉及当前程序集位置:$和$$标记。$计算为包含表达式的行的开头处的装配位置;因此,您可以使用JMP$.$编写一个无限循环计算到当前节的开头;因此,您可以通过使用($-$$)来判断您所处的区域有多远 因此,上面的代码执行以下操作: 计算“cli”和“hlt”指令占用的字节数

下面是我想理解的汇编代码。使用nasm组装此代码后,如何填充512字节

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

摘自第3.5节“表达式”:

NASM在表达式中支持两个特殊标记,允许计算涉及当前程序集位置:$和$$标记。$计算为包含表达式的行的开头处的装配位置;因此,您可以使用JMP$.$编写一个无限循环计算到当前节的开头;因此,您可以通过使用($-$$)来判断您所处的区域有多远

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

  • 计算“cli”和“hlt”指令占用的字节数N=$-$$。对于x86处理器,这将是0x7C02-0x7C00=2,因为两条指令各占用1字节
  • 保留(510-N)零字节。对于x86处理器,将为508字节
  • 保留一个占用2字节的字0xAA55

  • 其目的是让512字节的block:N+(510-N)+2=512

    Start:label告诉我们这是汇编代码的起点。对于您的问题:“计算'cli'和'hlt'指令占用的字节数”这两条指令占用2个字节,因此$=0x7C00和$=0x7C02(时间线的开始),因此我认为时间前缀的表达式是(510-($-$$)=(510-(0x7C00-0x7C02))=(510-(-2))=512,因此,“times 512 db 0”将0设置为512字节。因此,如果我上面的更新是正确的,我的问题是,如果“times 512 db 0”位于地址0x7C02,则“times”将512字节设置为从该地址(0x7C02)开始的0,而不是0x7C00?那么,我们是否缺少前两个字节,并在末尾将额外的2个字节归零?希望你理解我的疑问。反之亦然:$$=0x7C00沙穆丁·莫德:如果答案对你有帮助,请将其标记为“正确”。
    ;***************************
    
    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
    
    ;*********************