«ошибка A2006: неопределенный символ» в masm32 в окне 7 64 бит? - PullRequest
1 голос
/ 25 сентября 2011

Когда я запускаю этот пример, я получаю сообщение об ошибке.После удаления PROC1 PROC FAR я получаю еще одну ошибку «конфликт типов символов».С / coff: «для начального адреса требуется начальное подчеркивание: START».

Microsoft (R) Macro Assembler Версия 6.14.8444 Copyright (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) Macro Assembler Версия 6.14.8444 Copyright (C)) Корпорация Майкрософт, 1981–1997 годы.Все права защищены.

Сборка: D: \ Linux \ test1.asm D: \ Linux \ test1.asm (16): ошибка A2004: конфликт типов символов

1 Ответ

2 голосов
/ 26 сентября 2011

Поскольку START определен внутри процедуры, он не является допустимым идентификатором вне ее.

Кроме того, если бы это работало, вы бы создали ошибку.PROC - это макрос, который расширяется для установки стекового фрейма, поэтому ваша метка START фактически не находится в начале кода, а END START указывает, что точкой входа для вашей программы является START.Если вы хотите, чтобы ваша программа начиналась с основной процедуры, вы должны просто использовать имя этой процедуры после END, например END PROC1.

Если вы действительно намеревались установить точку входа где-нибудь в вашей процедуре,вы можете окружить метку OPTION NOSCOPED и OPTION SCOPED, чтобы метка была общедоступной, а не только видимой внутри процедуры.

...