2016-11-21 89 views
0

是什么在TASM程序这两个声明(不知道如果我在这里使用正确的话)之间的区别:TASM过程声明

procName proc 

procName proc near 

回答

3

如果你不” t指定距离(在过程声明中使用NEARFAR),将从当前模型推断默认值。

对于TINYCOMPACT型的默认距离为NEAR。对于所有其他型号,FAR是默认值。

这是真的只有当你使用简化的分割指令(例如.CODE.DATA.STACK)否则NEAR总是假设。
您也可以在.MODEL指令中指定NEARFAR

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


指定程序的距离自动的两个指令的生成:在过程中使用的ret S和用于调用它的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)专用于程序声明。当procName proc没有规定的距离(近或远),那么这是由模型确定:

1

从书Borland Turbo Assembler User's Guide,PDF格式(116英尺)的125页服用。如果指定距离(procName proc near),则callret将相应地表现。

的模型是PDF 92页(83英尺):

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