TASM中的这两个声明(不确定我是否在这里使用正确的词)之间有什么区别:
procName proc
和
procName proc near
答案 0 :(得分:3)
如果您未在过程声明中指定距离(NEAR
或FAR
),则会从当前模型中推断出默认值。
对于 TINY , COMPACT 和 SMALL 模型,默认距离为
NEAR
。对于所有其他模型,FAR
是默认值。
只有在您使用简化细分指令(例如.CODE
,.DATA
,.STACK
)时才会出现这种情况,否则始终会假定NEAR
。
您还可以在NEAR
指令中指定FAR
或.MODEL
。
您可以通过在声明中指定NEAR
或FAR
来覆盖过程的距离。
指定过程的距离自动生成两条指令:过程中使用的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)
使用retf
和retn
说明并使用call NEAR PTR proc1
,call 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
),则call
和ret
将相应地运作。
模型位于PDF的第92页(页脚83):
MODEL CODE DATA
---------------------------------------
tiny near near
small near near
medium far near
large far FAR