Assembly 无效操作数类型错误
NASM给出以下错误消息: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
> 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)
的表达式,标签本身可能不为人所知,但它们之间的区别却是显而易见的