## ALP Programming Guide and Reference

[prev][next][parent][TOC]

### LOCAL (Define Local Procedure Variables)

The LOCAL directive defines local stack variables from within a code procedure.

Syntax

    LOCAL   Local - Spec   [ ,   [ LineBreak ]   Local - Spec   . . . ]

Local-Spec:
Local-Name [:Type-Declaration]
Local-Name[Count] [:Type-Declaration]

The optional LineBreak entry allows you to end a Local-Spec entry with a comma, enter an optional EndOfLine-Comment followed by a physical NewLine character, then continue with a new Local-Spec on the next line.

Remarks

The LOCAL assembler directive can only appear within the body of a procedure. If used, the LOCAL directive(s) must immediately follow the PROC statement that encloses them, and they must appear before any instructions, code labels, or directives that modify the location counter. Multiple LOCAL directives may appear in succession.

Each Local-Name is defined as a Numeric-EquateName that is visible only from within the body of the procedure. The value assigned to the variable name is an expression that defines the type of the variable and its location on the stack relative to the value of the frame pointer (the BP or EBP register). The assembler reserves space on the stack for each local variable and automatically calculates their locations. After all Local- Spec entries have been processed, the assembler allocates the space by generating instructions to adjust the stack pointer. The assembler also generates instructions to restore the state of the stack and frame pointers when the procedure exits.

The optional [Count] entry can be used to indicate that the variable is a simple "array" of values, where Count is a constant expression. If used, the square brackets surrounding the Count must be specified. Use of this notation is discouraged however, because it does not associate a "true array" data type with the variable, and cannot be viewed as such from within a symbolic debugger. ALP allows the variable to be associated with a "true array" data type through use of the native Type-Declaration syntax.

The Type-Declaration field specifies the data type to be associated with the Local-Name. If this field is omitted, the data type defaults to WORD if the procedure is defined within a USE16 segment, and DWORD if the procedure is defined within a USE32 segment.

Example

    ;   bootdrv . asm   :   Returns   value   of   OS / 2   boot   drive   as   exit   code
    ;   assemble   as   :   alp   + Od   bootdrv . asm
    ;   link   as       :   link386   / de   bootdrv ;

             . 386                            ;   Assemble   for   32 - bit   processors
             . model   flat , syscall           ;   OS / 2   flat   model / calling   convention
             . stack   4096

             EXTERN   DosExit : PROC           ;   OS / 2   DosExit ( )   API
             EXTERN   DosQuerySysInfo : PROC   ;   OS / 2   DosQuerySysInfo ( )   API
             INCLUDELIB   os2386 . lib         ;   link   with   these   routines

    ;   These   are   values   taken   from   OS / 2   API   headers .    See   the   OS / 2   Toolkit
    ;   Control   Program   Programming   Guide   and   Reference   for   more   information .

    EXIT _ PROCESS      EQU    1                 ;   for   DosExit
    QSV _ BOOT _ DRIVE    EQU    5                 ;   For   DosQuerySysInfo

    ULONG     TYPEDEF   DWORD                  ;   use   OS / 2   type   convention

             . code                           ;   open   code   segment

    main      PROC
             LOCAL   BootDrive : ULONG         ;   place   to   put   value   of   boot   drive

             ;   Push   parameters   to   DosQuerySysInfo   onto   the   stack

             PUSH    sizeof   BootDrive        ;   arg   4 :   size   of   output   buffer
             LEA     EAX , BootDrive           ;   arg   3 :   Address   of   buffer
             PUSH    EAX
             PUSH    QSV _ BOOT _ DRIVE          ;   arg   2 :   last   ordinal   value   to   return
             PUSH    QSV _ BOOT _ DRIVE          ;   arg   1 :   first   ordinal ,   same   as   last
             CALL    DosQuerySysInfo         ;   invoke   API
             ADD     ESP , DWORD   *   4           ;   remove   the   parameters   from   the   stack

             CMP     EAX , 0                    ;   Did   the   API   succeed ?
             MOV     EAX , 0                    ;     if   not ,   use   zero   as   a   return   code
             JNZ     SomeKindOfError         ;     and   skip   around   to   the   exit   logic
             MOV     EAX , BootDrive           ;   else ,   return   the   boot   drive   value
    SomeKindOfError :
             push    EAX                      ;   exit   code
             push    EXIT _ PROCESS            ;   terminates   all   threads
             call    DosExit                  ;   exit   to   calling   process
             RET                             ;   never   executed
    main      ENDP

             END     main