2011-09-25 61 views
1

當我運行這個例子,我得到一個錯誤。刪除PROC1 PROC FAR後,我得到另一個錯誤「符號類型衝突」。使用/ coff:「起始地址所需的前導下劃線:START」。「錯誤A2006:未定義符號」在窗口7 64位的masm32中?

Microsoft(R)宏彙編程序版本6.14.8444版權所有(C)Microsoft Corp 1981-1997。版權所有。

組裝:d:\ Linux的\ test1.asm d:\ Linux的\ test1.asm(28):錯誤A2006:未定義的符號:START
d:\ Linux的\ test1.asm(16):錯誤A2004:符號類型衝突
d:\ Linux的\ test1.asm(28):錯誤A2148:在表達無效符號類型:STAR

 TITLE EXAMPLE 
DATA SEGMENT 
VARX DW   6 
VARY DW   7 
RESULT DW   ? 
DATA ENDS 
STACK1 SEGMENT PARA STACK 
     DW   20H DUP(0) 
STACK1 ENDS 
COSEG SEGMENT 
PROC1 PROC FAR 
     ASSUME CS:COSEG, DS:DATA, SS:STACK1 
START: PUSH DS 
     MOV  AX, 0 
     PUSH AX 
     MOV  AX, DATA 
     MOV  DS, AX 
     MOV  DX, VARX 
     MOV  DX, VARY 
     MOV  CL, 3 
     SAL  DX, CL 
     SUB  DX, VARX 
     SAR  DX, 1 
     MOV  RESULT, DX 
     RET 
PROC1 ENDP 
COSEG ENDS 
     END START 

附錄:

去除開始之後,它離開錯誤在第16行。爲什麼在發生這個錯誤?

Microsoft(R)宏彙編程序版本6.14.8444版權所有(C)Microsoft Corp 1981-1997。版權所有。

組裝:d:\ Linux的\ test1.asm d:\ Linux的\ test1.asm(16):錯誤A2004:符號類型衝突

回答

2

由於START是一個過程內定義的,它不是一個它之外的有效標識符。

此外,如果它確實工作,你會創建一個錯誤。 PROC是一個擴展來設置堆棧幀的宏,因此你的標籤START實際上並不在代碼的開始,而END START表示你的程序的入口點是START。如果你希望你的程序從一個主程序開始,你應該在END之後使用該程序的名字,就像END PROC1一樣。

如果您確實想將入口點設置到您的過程的某個位置,可以使用OPTION NOSCOPED和OPTION SCOPED將標籤包圍起來,這樣標籤就會公開,而不僅僅在過程中可見。

+0

我刪除了第16行的start,left錯誤mov ax,data,什麼是符號類型衝突 –

+0

您在組裝時使用/ coff選項。這只是Win32開發所需要的。在Win32中,你不使用段地址,所以你不能使用它們。 –