如何在 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.asmProgram.asm必须assembled 生成的 object 文件必须与 TLINK.

一起 linked