2

NASM 给出以下错误消息:

> ipl.asm:33: error: invalid operand type

出现错误的地方:

    RESB    0x7dfe-$

这是代码:

        ORG     0x7c00

        JMP     entry

entry:

        MOV     AX,0
        MOV     SS,AX
        MOV     SP,0x7c00
        MOV     DS,AX
        MOV     ES,AX

        MOV     SI,msg
putloop:

        MOV     AL,[SI]
        ADD     SI,1
        CMP     AL,0
        JE      fin
        MOV     AH,0x0e
        MOV     BX,15
        INT     0x10
        JMP     putloop
fin:

        HLT
        JMP     fin

msg:

        DB      0x0a, 0x0a
        DB      "hello, world"
        DB      0x0a
        DB      0

        RESB    0x7dfe-$

        DB      0x55, 0xaa
4

1 回答 1

5

可能是因为操作数 forresb必须是关键表达式这意味着它必须在汇编程序(a)的第一遍中是可知的。

相反,您可以做的是确保仅使用第一遍中已知的值。

首先,在 0x7c00 处放置一个开始标签:

          org 0x7c00
start:    jmp entry

然后更改空间预留定义另一个标签,并使用它们之间的差异来计算需要多少字节:

marker:   resb 0x1ffe-(marker-start)

它的作用是计算已经输出的字节数(marker-start,在语句之前已知的两个值resb)并从您想要的字节数中减去它(0x7dfe - 0x7c00 = 0x01fe)。然后它保留那么多空间,如清单输出所示:

0000039 00                       DB      0
000003A <res 000001C4>   marker: RESB    0x01fe-(marker-start)
        * warning: uninitialized space declared in .text section: zeroing
000001FE 55AA                    DB      0x55, 0xaa

您可以看到最后两个字节的偏移量0x01fe,给定0x7c00基数,实际上0x7dfe是所需的。


(a)我认为,您的表达式被认为是不可知的原因必须与它使用实际地址这一事实有关,而在第 1 步中不一定知道。这得到了0xffff - start同样会导致相同错误的事实的支持尽管它使用了一个真实的、已经声明的标签而不是$.

通过使用类似的表达式0xffff - (label1 - label2),标签本身可能是未知的,但它们之间的区别是已知的

于 2013-02-09T07:42:44.030 回答