Tasm程序声明

Tasm procedure declaration

TASM 中过程的这两个声明(不确定我在这里使用的词是否正确)之间有什么区别:

procName proc

procName proc near

如果您没有指定距离(在过程声明中使用 NEARFAR),默认值是从当前模型推断的。

For TINY, COMPACT and SMALL models the default distance is NEAR. For all other models FAR is the default.

仅当您使用简化的分段指令(例如 .CODE.DATA.STACK)时才成立,否则始终假定 NEAR
您还可以在 .MODEL 指令中指定 NEARFAR

您可以通过在声明中指定 NEARFAR 来覆盖过程的距离。


指定过程的距离自动生成两条指令:在过程中使用的 rets 和用于调用它的 calls。

proc1 PROC NEAR
   ret                 ;This generates the C3 opcode (near return)
proc1 ENDP

proc2 PROC FAR
   ret                 ;This generates the CB opcode (far return)
proc2 ENDP

call proc1             ;This generates opcode E8 (call near relative direct)
call proc2             ;This generates opcode 9A (call far absolute direct)

您始终可以通过使用 retfretn 指令以及使用 call NEAR PTR proc1call FAR PTR proc2 说明符来明确说明。


当汇编程序遇到对稍后在源代码中声明的过程的调用(技术上称为 前向声明)时,它必须使用多次传递来解析调用。
它首先假设它是一个近调用,当它遇到被调用过程的声明并且它的距离不近时,汇编器需要另一遍来纠正它的猜测并生成一个远调用。

可以使用 /m 开关启用多次传递,否则在这种情况下你会遇到错误

forward reference needs override.


我无法在线找到 TASM 5 手册的 PDF 版本,唯一的来源是 this scanned version of the manual
第 10 章(pdf 的第 128 页,印刷版的第 115 页)专门介绍程序声明。

摘自书 Borland Turbo Assembler User's Guide,PDF 第 125 页(页脚 116):当 procName proc 未指定距离(近或far) 那么这是由模型决定的。如果指定了距离 (procName proc near),则 callret 将相应地运行。

模型在 PDF 的第 92 页(页脚 83):

 MODEL            CODE            DATA
---------------------------------------
 tiny             near            near
 small            near            near
 medium           far             near
 large            far             FAR