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
答案 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)
这样的表达式,标签本身可能不知道,但它们之间的区别是。