Technical Notes Database
TN357D.txt TASM 1.0 1.01 - ORDER OF ARG DIRECTIVE OPERANDS -
Category :Pascal
Platform :All
Product :Turbo Pascal 5.0 5.5
Description:
Q. In what order should the operands to the Arg directive
appear? Should they be the same as the order in the calling
procedure or in reverse?
A. The answer depends upon the language that you're using and
whether or not you're using the .model memory model, language
option.
Case 1: You are using the full segment definitions or you are
using the .model directive without specifying a
language.
The leftmost symbol in the Arg list is always nearest the top
of the stack (TOS). Thus, if your proc definition is
myproc proc far
arg first:word, second:word
first will evaluate to [BP + 06H], the size of the four byte
far return address plus the size of the two byte BP register
pushed onto the stack. The symbol, second, will evaluate to
[BP + 08H], two bytes further from TOS.
Again, the key point to remember is that the leftmost symbol
is nearest TOS.
If you are using Pascal or Basic, arguments are pushed from
left to right onto the stack. This is called Pascal calling
syntax or Pascal calling conventions. In this case, the last
argument in the list is nearest TOS. For example:
{$F+}
procedure myproc(one:integer; two:integer); external;
{$F-}
...
procedure myproc(first:integer; second:integer);
...
The variable, first, is pushed onto the stack followed by
second. Thus, second is nearest TOS. In this case, you would
want to set up your Arg list as follows:
myproc proc far
arg second:word, first:word
push bp
mov bp,sp
The symbol, second, would evaluate to [BP + 06H], the symbol
nearest TOS, and first would evaluate to [BP + 08H].
To get the correct results with Basic or Pascal while using
the simplified segment directives or .model without the
language option, you must reverse the order of the arguments
as they appear in the high level language calling routine's
parameter list.
If you are calling the Assembler routine from a C module and
you are NOT using Pascal calling conventions, then the
arguments are pushed onto the stack from right to left. Thus,
the leftmost argument is nearest TOS and there is no need to
reverse the order to the symbols in the Arg list.
If you wish to use Pascal calling conventions in Turbo C, use
the -p option for TCC or the Pascal keyword. Pascal calling
syntax can also be enabled from within TC by setting the
/Options/Compiler/Code generation/Calling convention to
Pascal.
Case 2: You are using the .model memory model, language
directive.
All you need to do is put the Arg list symbols in the same
order as they appear in the calling routine's parameter list.
This is the easiest method, by far. Remember to include the
comma after the memory model in the .model directive and to
specify the language. If you are using Turbo Pascal, just use
.model TPascal.
Reference:
7/16/98 4:35:31 PM
Last Modified: 01-SEP-99