Assembly &引用;错误A2006:未定义符号,从调用宏,主线代码;

Assembly &引用;错误A2006:未定义符号,从调用宏,主线代码;,assembly,masm,undefined-function,Assembly,Masm,Undefined Function,我试图提供一个最终项目的框架,这是一个FP计算器。然而,我遇到了一些麻烦。如果我编译这段代码,我会得到。我不确定这是什么程序集,但我相信它是32位的,我正在使用MASM编译器 其要点是从输入文件中读取一行,并使其执行操作。然而,我只是在做定义部分,我的合作伙伴将找出实现操作的方法 如果我注释掉主函数,减去“Only_Nums,Character_Error:”和Invalid_Char:”程序将编译 你能帮我确定为什么它不能编译吗。我所能想到的唯一合乎逻辑的事情是,被引用的代码并不是首先定义的,

我试图提供一个最终项目的框架,这是一个FP计算器。然而,我遇到了一些麻烦。如果我编译这段代码,我会得到。我不确定这是什么程序集,但我相信它是32位的,我正在使用MASM编译器

其要点是从输入文件中读取一行,并使其执行操作。然而,我只是在做定义部分,我的合作伙伴将找出实现操作的方法

如果我注释掉主函数,减去“Only_Nums,Character_Error:”和Invalid_Char:”程序将编译

你能帮我确定为什么它不能编译吗。我所能想到的唯一合乎逻辑的事情是,被引用的代码并不是首先定义的,而是首先定义的

谢谢

编辑:将ESI替换为SI

.MODEL Small
        .386
        .387
        .STACK
        .DATA
    FileN       DB  "FILENAME.DAT",0
    Buffer      DB  255 DUP (?)
    StrinLen    DB  0
    Num2FP      DB  0
    Base        DB  10.0
    FPNum       DT  0.0
        .CODE

    ;------------------------------code to search file and opening file------------------------------------------------------------------------------------------
    ;------------------------------code for setting up the file pointer to, initally the first line, but after the first, to the next------------------------------
    ;------------------------------I am going to use buffer as the placeholder for the string of the line------------------------------------------------------------

    ;------------------------------String Length------------------------------------------------------------------------------------------------
    String_Length   PROC FAR
            PUSHAD
    Next_Element:   MOV AL, BYTE PTR [BP + 0 + SI]
            INC SI
            CMP AL, 0Dh
            JNE Next_Element
            MOV [BP+2], SI
            POPAD
            RET
    String_Length   ENDP
    ;----------------------------------------------------------------------------------------------------------------------------------------

    ;------------------------------Macro to detect if trig and log are functions------------------------------------------------------------
    Detect_Func MACRO W, X, Y, Z
            INC SI
            MOV BL, BYTE PTR [BP + 8 + SI]
            .IF (BL != W) && (BL != Y)
                JMP Character_Error
            .ENDIF

            INC SI
            MOV BL, BYTE PTR [BP + 8 + SI]
            .IF (BL != W) && (BL != Z)
                JMP Character_Error
            .ENDIF
    ENDM        

    ;------------------------------Reading the string from the input file, directing what the program does------------------------------------------
    ;------------------------------Didn't initially write this as procedure, so it will need to be converted----------------------------------------
    Token       PROC FAR    
    ReadIn:     MOV BL, BYTE PTR [BP + 8 + SI]

            .IF (BL < '0' && BL > '9')
                JB Check_Invalid
            .ENDIF

            SUB BL, 30h
            MOVZX BX, BL
            MOV [BP+6], BX
            FILD WORD PTR [BP + 6]

            FLD DWORD PTR [BP + 2]
            FMUL DWORD PTR [BP + 4]
            FADDP ST(1), ST
            FBSTP [BP + 2]  

            INC SI
            CMP [BP], SI
            JB Only_Nums
            JMP ReadIn

    Check_Invalid:
            FLD DWORD PTR [BP + 2]

    .IF     BL == 0DH
    ;------------------------------write to file, move file pointer to next line and jump to readin-------------------------------------------------
    ;------------------------------there should be some stopping condition in the event there aren't any more lines to calculate--------------------

    .ELSEIF     BL == ' '
            INC SI
            JMP ReadIn

    .ELSEIF     BL == '+'
            CALL FP_Add
            RET

    .ELSEIF     BL == '-'
            CALL FP_Sub
            RET

    .ELSEIF     BL == '*'
            CALL FP_Mul
            RET

    .ELSEIF     BL == '/'
            CALL FP_Div
            RET

    .ELSEIF     BL == '('

    .ELSEIF     BL == ')'

    .ELSEIF     BL == '^'
            CALL FP_Power
            RET

    .ELSEIF     BL == '.'
            CALL FP_Dec

    .ELSEIF     (BL == 'E' || BL == 'e')
            CALL FP_E

    .ELSEIF     (BL == 'C' || BL == 'c')
            Detect_Func 'o', 's', 'O', 'S'
            CALL FP_Cos
            RET

    .ELSEIF     (BL == 'S' || BL == 's')
            Detect_Func 'i', 'n', 'I', 'N'
            CALL FP_Sin
            RET

    .ELSEIF     (BL == 'T' || BL == 't')
            Detect_Func 'a', 'n', 'A', 'N'
            CALL FP_Tan
            RET

    .ELSEIF     (BL == 'L' || BL == 'l')
            Detect_Func 'o', 'g', 'O', 'G'
            Detect_Func '1', '0', '1', '0'
            CALL FP_Log
            RET

    .ELSEIF     (BL == 'R' || BL == 'r')
    ;------------------------------display error if number follows...?------------------------------------------------------------------------------------------

    .ELSE
            JMP Invalid_Char

    .ENDIF

            RET
    Token       ENDP    

    FP_Add      PROC FAR
            CALL Token

            RET
    FP_Add      ENDP

    FP_Sub      PROC FAR
            CALL Token

            RET
    FP_Sub      ENDP

    FP_Mul      PROC FAR
            CALL Token

            RET
    FP_Mul      ENDP

    FP_Div      PROC FAR
            CALL Token

            RET
    FP_Div      ENDP

    FP_Power    PROC FAR
            CALL Token

            RET
    FP_Power    ENDP


    FP_Dec      PROC FAR
            CALL Token

            RET
    FP_Dec      ENDP

    FP_E        PROC FAR
            CALL Token

            RET
    FP_E        ENDP


    FP_Cos      PROC FAR
            CALL Token

            RET
    FP_Cos      ENDP

    FP_Sin      PROC FAR
            CALL Token

            RET
    FP_Sin      ENDP


    FP_Tan      PROC FAR
            CALL Token

            RET
    FP_Tan      ENDP

    FP_Log      PROC FAR
            CALL Token

            RET
    FP_Log      ENDP




    MAIN        PROC FAR
            .STARTUP

            MOV SI, 0
            PUSH OFFSET StrinLen            ;[BP+2]
            PUSH OFFSET Buffer          ;[BP]
            MOV BP, SP
            CALL String_Length
            ADD SP, 4
            POP BP


            PUSH BP                 
            PUSH OFFSET Buffer          ;[BP+8]
            PUSH OFFSET Num2FP          ;[BP+6]
            PUSH OFFSET BASE            ;[BP+4]
            PUSH OFFSET FPNum           ;[BP+2]
            PUSH OFFSET StrinLen            ;[BP]
            MOV BP, SP
            CALL Token  
            ADD SP, 10
            POP SP

    Only_Nums:      ;No operands was given error message        
    Character_Error:    ;output error message (trig and log function)
    Invalid_Char:       ;output invalid character detected (invalid characted detected in input file


    MAIN        ENDP
    END
。型号小
.386
.387
堆栈
.数据
文件数据库“FILENAME.DAT”,0
缓冲区数据库255重复(?)
斯特林分贝0
Num2FP DB 0
基本数据库10.0
FPNum DT 0.0
.代码
;------------------------------用于搜索文件和打开文件的代码------------------------------------------------------------------------------------------
;------------------------------用于设置文件指针的代码,最初指向第一行,但在第一行之后指向下一行------------------------------
;------------------------------我将使用缓冲区作为行字符串的占位符------------------------------------------------------------
;------------------------------字符串长度------------------------------------------------------------------------------------------------
字符串长度PROC FAR
普沙德
下一个元素:MOV AL,字节PTR[BP+0+SI]
国际公司
CMP-AL,0Dh
下一个元素
MOV[BP+2],SI
波帕德
RET
字符串长度ENDP
;----------------------------------------------------------------------------------------------------------------------------------------
;------------------------------用于检测触发器和日志是否为函数的宏------------------------------------------------------------
检测函数宏W,X,Y,Z
国际公司
MOV BL,字节PTR[BP+8+SI]
.如果(BL!=W)&(BL!=Y)
JMP字符错误
.ENDIF
国际公司
MOV BL,字节PTR[BP+8+SI]
.如果(BL!=W)&(BL!=Z)
JMP字符错误
.ENDIF
ENDM
;------------------------------从输入文件中读取字符串,指导程序执行的操作------------------------------------------
;------------------------------最初没有将此作为过程编写,因此需要对其进行转换----------------------------------------
令牌进程FAR
ReadIn:MOV BL,字节PTR[BP+8+SI]
.如果(BL<0'和&BL>9')
JB Check_无效
.ENDIF
分界区,30小时
MOVZX BX,BL
MOV[BP+6],BX
FILD单词PTR[BP+6]
德沃德机场客运大楼[BP+2]
FMUL DWORD PTR[BP+4]
FADDP街(1),街
FBSTP[BP+2]
国际公司
CMP[BP],SI
仅适用于JB
JMP-ReadIn
检查\u无效:
德沃德机场客运大楼[BP+2]
.如果BL==0DH
;------------------------------写入文件,将文件指针移动到下一行并跳转到readin-------------------------------------------------
;------------------------------如果没有更多要计算的行,则应该有一些停止条件--------------------
.ELSEIF BL==''的
国际公司
JMP-ReadIn
.ELSEIF BL=='+'
调用FP_Add
RET
.ELSEIF BL=='-'
呼叫FP_Sub
RET
.ELSEIF BL=='*'
呼叫FP_Mul
RET
.ELSEIF BL=='/'
呼叫FP_Div
RET
.ELSEIF BL=='('
.ELSEIF BL==')'
.ELSEIF BL=='^'
呼叫FP_电源
RET
.ELSEIF BL=='。'
致电FP_Dec
.ELSEIF(BL=='E'| | BL=='E')
打电话给FP_E
.ELSEIF(BL=='C'| | BL=='C')
检测函数“o”、“s”、“o”、“s”
呼叫FP_Cos
RET
.ELSEIF(BL=='S'| | BL=='S')
检测函数'i','n','i','n'
打电话给你
RET
.ELSEIF(BL=='T'| | BL=='T')
检测函数“a”、“n”、“a”、“n”
打电话给陈福平
RET
.ELSEIF(BL=='L'| | BL=='L')
检测函数'o','g','o','g'
检测函数“1”、“0”、“1”、“0”
调用FP_日志
RET
.ELSEIF(BL=='R'| | BL=='R')
;------------------------------如果数字跟在后面,则显示错误------------------------------------------------------------------------------------------
其他的
JMP无效字符
.ENDIF
RET
令牌ENDP
FP_添加程序FAR
呼叫令牌
RET
FP_添加ENDP
FP_子过程FAR
呼叫令牌
RET
FP_Sub ENDP
FP_Mul PROC FAR
呼叫令牌
RET
FP_Mul ENDP
FP_Div PROC FAR
呼叫令牌
RET
财务政策组
FP_电源程序FAR
呼叫令牌
RET
功率端
FP_Dec PROC FAR
呼叫令牌
RET
FP_Dec ENDP
FP_E PROC FAR
呼叫令牌
RET
FP_E ENDP
FP_Cos PROC FAR
呼叫令牌
RET
FP_Cos ENDP
FP_Sin PROC FAR
呼叫令牌
RET
法新社
Token       PROC FAR
            ...
            JB Only_Nums
            ...
            JMP Character_Error
            ...
            JMP Invalid_Char
            ...
            RET
Token       ENDP

MAIN        PROC FAR
            ...
Only_Nums::         ;No operands was given error message
Character_Error::   ;output error message (trig and log function)
Invalid_Char::      ;output invalid character detected (invalid characted detected in input file
            ...
MAIN        ENDP