1

当我运行这个例子时,我得到一个错误。删除 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

附录:

删除 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:符号类型冲突

4

1 回答 1

2

因为 START 是在过程内部定义的,所以它在过程之外不是有效的标识符。

此外,如果它确实有效,您将创建一个错误。PROC 是一个扩展以设置堆栈帧的宏,因此您的标签 START 实际上不在代码的开头,而 END START 表示您的程序的入口点是 START。如果您希望您的程序以一个主过程开始,您应该在 END 之后使用该过程的名称,例如 END PROC1。

如果您确实打算将入口点设置到程序中的某个位置,您可以用 OPTION NOSCOPED 和 OPTION SCOPED 包围标签,这样标签将是公共的,而不仅仅是在程序内可见。

于 2011-09-26T03:51:09.020 回答