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

オペランド forが重要な式でなければならないことが原因である可能性があります。つまり、アセンブラ(a)の最初のパスで知ることができる必要があります。resb

代わりにできることは、最初のパスで既にわかっている値のみを使用するようにすることです。

まず、開始ラベルを 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

最後の 2 バイトがオフセットにあることがわかります。0x01feこれは、基数が与えられているため0x7c00、実際に0x7dfeは目的どおりです。


(a)あなたの式が認識できないと見なされる理由は、パス 1 で必ずしも認識されていない実際のアドレスを使用しているという事実に関係していると思います。これは0xffff - start、同じエラーを引き起こすという事実によってサポートされています。ではなく、実際の、既に宣言されているラベルを使用しているという事実にもかかわらず$

のような式を代わりに使用する0xffff - (label1 - label2)と、ラベル自体はわからないかもしれませんが、それらの違いはわかります

于 2013-02-09T07:42:44.030 に答える