Tasm程序声明

时间:2016-11-21 19:31:58

标签: assembly tasm

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

procName proc

procName proc near

2 个答案:

答案 0 :(得分:3)

如果您未在过程声明中指定距离(NEARFAR),则会从当前模型中推断出默认值。

  

对于 TINY COMPACT SMALL 模型,默认距离为NEAR。对于所有其他模型,FAR是默认值。

只有在您使用简化细分指令(例如.CODE.DATA.STACK)时才会出现这种情况,否则始终会假定NEAR。 您还可以在NEAR指令中指定FAR.MODEL

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

指定过程的距离自动生成两条指令:过程中使用的ret和用于调用它的call

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开关启用多次通过,否则在这种情况下您将遇到错误

  

转发参考需要覆盖。

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

答案 1 :(得分:1)

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

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

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