我无法将外部文件连接到我的程序。我正在尝试连接一个充满宏的文件。我将所有文件放在同一个文件夹中。那么,我如何正确地输出这些文件,以便我可以打电话给他们的MACROS?
CODE:
include PCMAC.INC
.model small
.stack 100h
.data
Prompt_a DB 'Enter A:$'
Prompt_b DB 'Enter B:$'
Output db 'The sum is $'
CR EQU 0dh ;13 \r moves the cursor to begginig of current row
LF EQU 0ah ;10 new line
.code
EXTERN GETDEC:NEAR, PUTDEC:NEAR
main proc
mov ax, @data
mov ds, ax
_PutStr Prompt_a
call GETDEC ;number in AX after
mov bx, ax
_PutStr Prompt_b
call GETDEC ; still in AX
add bx, ax
_PutStr Output
mov ax, bx
call PUTDEC ;Print num in AX
_PUTCH 13, 10
_exit 0 ; Finished/return to dos
main endp
end main
错误消息:
Assembling file: test.asm
**Error** test.asm(13) Illegal instruction
**Error** test.asm(19) Undefined symbol: GETDEC
**Error** test.asm(22) Undefined symbol: GETDEC
**Error** test.asm(26) Undefined symbol: PUTDEC
Error messages: 4
Warning messages: None
Passes: 1
Remaining memory: 455k
答案 0 :(得分:1)
只需INCLUDE
文件并使用宏。
EXTRN
指令,请注意缺少 E
†,用于声明在另一个对象中定义的符号,如函数文件 1 通常是单独源文件的结果(这在混合C和汇编时很常见)。
注意强>
INCLUDE
指令就像包含文件内容的复制粘贴一样代替指令
确保包含的内容与“周围”兼容 - 即确保复制粘贴文件内容将生成正确的源。
要使用宏,根据元代码 2 的性质,汇编程序需要访问其代码,因此INCLUDE
是正确的指令 3 因为它复制了当前文件中宏的源代码。
示例强>
macros.asm
exit MACRO
mov ax, 4c00h
int 21h
ENDM
program.asm
.8086
.MODEL SMALL
.STACK 100h
;Macros are fine here
INCLUDE mc2.asm
_CODE SEGMENT PARA PUBLIC 'CODE' USE16
ASSUME CS:_CODE, DS:_CODE
ORG 100h
__START__:
;This is the macro in the macros.asm file
exit
_CODE ENDS
END __START__
请注意,您必须汇编并链接 program.asm ,其他文件 macros.asm 是一个卫星文件(如C中的标题)。
† EXTERN
不是有效指令并生成报告的错误
1 对于技术娴熟的人来说,它会在TASM生成的OMF目标文件 .OBJ 中创建一个条目8Ch
。 / p>
2 这是推理和生成代码的代码。
3 对于技术娴熟的人来说,EXTRN
在这里没有任何意义,因为外部符号减少到2/4字节偏移量和包含调试信息的(类型)索引{ DOS对象文件使用{3}}。
<强>附录强>
这有点偏离主题,没有必要回答这个问题,读者可以停止阅读,如果它感到不知所措,没有任何损失。
为了更好地理解INCLUDE
符号与EXTRN
之间的区别,这里提供了使用外部定义的exit
函数而不是宏的相同程序。 / p>
Library.asm
.8086
.MODEL SMALL
PUBLIC exit
_CODE SEGMENT PARA PUBLIC 'CODE' USE16
ASSUME CS:_CODE, DS:_CODE
exit:
mov ax, 4c00h
int 21h
;No need to ret
_CODE ENDS
;No need for an entry-point
END
Program.asm
.8086
.MODEL SMALL
.STACK 100h
;The type PROC is necessary or TASM will interpret the symbol
;as a variable generating an indirect call! e.g. call [exit]
EXTRN exit:PROC
_CODE SEGMENT PARA PUBLIC 'CODE' USE16
ASSUME CS:_CODE, DS:_CODE
ORG 100h
__START__:
call exit
_CODE ENDS
END __START__
这次 Library.asm 和 Program.asm 必须进行汇编,生成的目标文件必须与链接在一起TLINK