2013-02-09 135 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

相關問題