操作数类型错误无效

时间:2013-02-09 07:31:21

标签: assembly operating-system x86 nasm

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

1 个答案:

答案 0 :(得分:5)

可能因为resb的操作数必须是critical expression。这意味着它必须在汇编程序(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)这样的表达式,标签本身可能不知道,但它们之间的区别是。