Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/apache-flex/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 无效操作数类型错误_Assembly_Operating System_X86_Nasm - Fatal编程技术网

Assembly 无效操作数类型错误

Assembly 无效操作数类型错误,assembly,operating-system,x86,nasm,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

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
这可能是因为
resb
的操作数必须是a。这意味着它必须在汇编程序(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
0000039 00分贝0
000003A标记:RESB 0x01fe-(标记开始)
*警告:在中声明了未初始化的空间。文本部分:归零
000001FE 55AA数据库0x55,0xaa
您可以看到最后两个字节位于偏移量
0x01fe
,给定
0x7c00
基,它实际上是
0x7dfe


(a) 我认为,你的表达式之所以被认为是不可知的,是因为它使用了一个实际的地址,而这个地址在pass1中不一定是已知的。这一点得到了以下事实的支持:
0xffff-start
也会导致相同的错误,尽管它使用的是一个真实的、已经声明的标签,而不是
$

通过使用类似于
0xffff-(label1-label2)
的表达式,标签本身可能不为人所知,但它们之间的区别却是显而易见的