如何在TASM x64中连接extern文件

时间:2017-09-15 18:54:55

标签: assembly tasm x86-16

我无法将外部文件连接到我的程序。我正在尝试连接一个充满宏的文件。我将所有文件放在同一个文件夹中。那么,我如何正确地输出这些文件,以便我可以打电话给他们的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

1 个答案:

答案 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