如何在 TASM x64 中连接外部文件
How to connect extern files in TASM x64
我无法将外部文件连接到我的程序。我正在尝试连接一个充满宏的文件。我将所有文件都放在同一个文件夹中。那么,我该如何正确地扩展这些文件,以便我可以调用其中的宏呢?
代码:
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
只需 INCLUDE
文件并使用宏。
EXTRN
指令,注意missingE
†,用来声明一个符号,就像一个函数,在另一个 object 文件 1 中定义,通常是单独源文件的结果(这在混合 C 和汇编时很典型)。
备注
INCLUDE
指令就像包含文件内容的 copy-paste 代替指令。
确保包含的内容与 "surrounding" 兼容 - 即确保 copy-pasting 文件的内容将生成正确的来源。
要使用宏,根据其 meta-code2 的性质,assembler 需要访问其代码,因此 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__
注意要assemble和linkprogram.asm,另外一个文件,macros.asm 是一个附属文件(就像 C 中的 headers)。
† EXTERN
不是有效指令并生成错误报告
1 对于 tech-savvy,它将在 OMF object 文件中创建一个条目 8Ch
.OBJ 由 TASM.
生成
2 是代码推理并生成代码。
3 对于 tech-savvy,EXTRN
在这里没有意义,因为外部符号减少到 2/4 字节偏移量和(类型)索引在 DOS Object 文件使用的 Object Module Format (OMF) 中包含调试信息。
附录
这个有点off-topic,没必要回答这个问题,reader可以看完了,看不下去了,不亏。
为了更好地理解 INCLUDE
符号和 EXTRN
符号之间的区别,这里展示了使用外部定义的 exit
函数而不是宏的相同程序.
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必须assembled 生成的 object 文件必须与 TLINK.
一起 linked
我无法将外部文件连接到我的程序。我正在尝试连接一个充满宏的文件。我将所有文件都放在同一个文件夹中。那么,我该如何正确地扩展这些文件,以便我可以调用其中的宏呢?
代码:
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
只需 INCLUDE
文件并使用宏。
EXTRN
指令,注意missingE
†,用来声明一个符号,就像一个函数,在另一个 object 文件 1 中定义,通常是单独源文件的结果(这在混合 C 和汇编时很典型)。
备注
INCLUDE
指令就像包含文件内容的 copy-paste 代替指令。
确保包含的内容与 "surrounding" 兼容 - 即确保 copy-pasting 文件的内容将生成正确的来源。
要使用宏,根据其 meta-code2 的性质,assembler 需要访问其代码,因此 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__
注意要assemble和linkprogram.asm,另外一个文件,macros.asm 是一个附属文件(就像 C 中的 headers)。
† EXTERN
不是有效指令并生成错误报告
1 对于 tech-savvy,它将在 OMF object 文件中创建一个条目 8Ch
.OBJ 由 TASM.
2 是代码推理并生成代码。
3 对于 tech-savvy,EXTRN
在这里没有意义,因为外部符号减少到 2/4 字节偏移量和(类型)索引在 DOS Object 文件使用的 Object Module Format (OMF) 中包含调试信息。
附录
这个有点off-topic,没必要回答这个问题,reader可以看完了,看不下去了,不亏。
为了更好地理解 INCLUDE
符号和 EXTRN
符号之间的区别,这里展示了使用外部定义的 exit
函数而不是宏的相同程序.
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必须assembled 生成的 object 文件必须与 TLINK.
一起 linked