【问题标题】:Query on assembly prefix 'times'查询程序集前缀“次”
【发布时间】:2013-11-05 05:14:17
【问题描述】:

下面是我想了解的汇编代码。这段代码用 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

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

【问题讨论】:

    标签: assembly x86 nasm bootloader


    【解决方案1】:

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

    NASM 支持表达式中的两个特殊标记,允许计算涉及当前装配位置:$ 和 $$ 标记。 $ 计算为包含表达式的行首的装配位置;因此您可以使用 JMP $ 编写无限循环。 $$ 计算为当前部分的开头;因此,您可以使用 ($-$$) 来判断您在该部分中的距离。

    所以,上面的代码做了以下事情:

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

    意图是有一个 512 字节的块:N + ( 510 - N ) + 2 = 512

    【讨论】:

    • 开始:标签告诉我们这是汇编代码的起点。所以对于你的问题:“计算'cli'和'hlt'指令需要多少字节”这两条指令需要2个字节所以$ = 0x7C00和$$ = 0x7C02(时间线的开头)所以我认为时间前缀的表达式将是 (510-($-$$)) = (510 -(0x7C00-0x7C02)) = (510 - (-2)) = 512,所以它是 'times 512 db 0' 将 0 设置为 512字节。
    • 所以,如果我上面的更新是正确的,我的问题是,如果 'times 512 db 0' 位于地址 0x7C02,'times' 将从这个地址(0x7C02)开始设置 512 个字节为 0,而不是比0x7C00?那么我们是否不会丢失前两个字节并在最后将额外的 2 个字节归零?希望你能理解我的疑问。
    • 反之亦然:$$=0x7C00 512 字节。我已经用 x86 处理器上的示例计算更新了答案。
    • shamuddin mohd:如果对您有帮助,请将答案标记为“正确”。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-11
    • 1970-01-01
    • 2018-09-30
    • 2014-10-21
    • 1970-01-01
    相关资源
    最近更新 更多