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