1

この例を実行すると、エラーが発生します。PROC1 PROC FARを削除した後、別のエラー「シンボルタイプの競合」が発生します。/ coffの場合:「開始アドレスに必要な先頭の下線:START」。

Microsoft(R)MacroAssemblerバージョン6.14.8444Copyright(C)MicrosoftCorp1981-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)MacroAssemblerバージョン6.14.8444Copyright(C)MicrosoftCorp1981-1997。全著作権所有。

アセンブル:D:\ Linux \ test1.asm D:\ Linux \ test1.asm(16):エラーA2004:シンボルタイプの競合

4

1 に答える 1

2

START はプロシージャ内で定義されているため、プロシージャの外では有効な識別子ではありません。

また、それが機能した場合、バグを作成することになります。PROC は展開してスタック フレームをセットアップするマクロであるため、ラベル START は実際にはコードの先頭にはありませんが、END START はプログラムのエントリ ポイントが START であることを示します。プログラムをメイン プロシージャで開始する場合は、END PROC1 のように、END の後にそのプロシージャの名前を使用する必要があります。

エントリ ポイントをプロシージャ内のどこかに設定することが本当に目的である場合は、ラベルを OPTION NOSCOPED および OPTION SCOPED で囲むことができます。これにより、ラベルはパブリックになり、プロシージャ内だけでなく表示されます。

于 2011-09-26T03:51:09.020 に答える