当我运行此示例时,我收到错误。删除PROC1 PROC FAR后,我收到另一个错误“符号类型冲突”。使用/ coff:“起始地址需要前导下划线:START”。
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行留下错误。为什么在MOV AX, DATA
发生此错误?
Microsoft(R)宏汇编程序版本6.14.8444版权所有(C)Microsoft Corp 1981-1997。保留所有权利。
组装:D:\ Linux \ test1.asm D:\ Linux \ test1.asm(16):错误A2004:符号类型冲突
答案 0 :(得分:2)
因为START是在一个过程中定义的,所以它不是它之外的有效标识符。
此外,如果它确实有效,您将创建一个错误。 PROC是一个扩展为设置堆栈帧的宏,因此标签START实际上不在代码的开头,而END START表示程序的入口点是START。如果您希望程序以主程序开头,则应在END之后使用该程序的名称,如END PROC1。
如果您打算将入口点设置到过程中的某个位置,则可以使用OPTION NOSCOPED和OPTION SCOPED来标记标签,因此标签将是公共的,而不仅仅是在过程中可见。