2013-02-09 134 views
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 

回答

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如所期望。


(一)为什么你的表达被认为是不可知的必须做,我认为,与它使用的实际地址,该地址不一定通1知这是支持的事实的原因0xffff - start也会导致相同的错误,尽管它使用的是真实的已声明标签,而不是$

通过改为使用类似0xffff - (label1 - label2)的表达式,标签本身可能不知道,但它们之间的差异是

+0

好吧。非常感谢你 – user2056639 2013-02-09 08:34:54

相关问题