Annotation of os2sdk/os2doc/masm.txt, revision 1.1

1.1     ! root        1:                        OS/2 SDK MASM UPDATE
        !             2: 
        !             3: 
        !             4:                       Installing the Assembler
        !             5: 
        !             6: The OS/2 SDK version of the assembler does not include a SETUP
        !             7: program. You install files by copying them directly from the release
        !             8: disks.
        !             9: 
        !            10: 
        !            11:                      Assembly Language Under OS/2 
        !            12: 
        !            13: This file describes some of the differences between assembly language 
        !            14: under OS/2 and assembly language under DOS. It discusses new 
        !            15: techniques you will have to learn for protected-mode programs, and 
        !            16: summarizes differences in tools used for program development. 
        !            17: 
        !            18: A Sample Program
        !            19: ----------------
        !            20: 
        !            21: The following program is an OS/2 version of the sample programs in 
        !            22: Chapter 1 of the Microsoft Macro Assembler Programmer's Guide:
        !            23: 
        !            24:           TITLE   hellos2
        !            25:           INCLUDELIB doscalls.lib    ; <1>
        !            26:           .286
        !            27:           .MODEL  small
        !            28: 
        !            29:           ; <2>
        !            30: pushc     MACRO   pushed, pushed2    ;; Define bind from command line
        !            31:           IFDEF   bind               ;;   if you want to bind the program
        !            32:           mov     ax, pushed pushed2 ;; Push constant for 8088/8086
        !            33:           push    ax
        !            34:           ELSE
        !            35:           push    pushed pushed2     ;; Push constant for 80186+
        !            36:           ENDIF
        !            37:           ENDM
        !            38: 
        !            39:           .STACK  800h       ; <3>
        !            40:           .DATA
        !            41: message   DB      "Hello, world.",13,10
        !            42: lmessage  EQU     $ - message
        !            43: bytesout  DD      ?
        !            44: 
        !            45:           .CODE
        !            46:           EXTRN   DosWrite:FAR, DosExit:FAR  ; Declare OS/2 calls <4>
        !            47: start:    ; <5>
        !            48: 
        !            49: ; DosWrite function used to write to screen <6>
        !            50:                                      ; <7>
        !            51:           pushc   1                  ; Push 1 as handle for standard output
        !            52:           push    ds                 ; Push far address of 
        !            53:           pushc   OFFSET message     ;   "message" 
        !            54:           pushc   lmessage           ; Push length of "message"
        !            55:           push    ds                 ; Push far address of 
        !            56:           pushc   OFFSET bytesout    ;   "bytesout" 
        !            57: 
        !            58:           call    DosWrite           ; Make API call <8>
        !            59:                                      ; AX contains error code <9>
        !            60:                                      ; Variable "bytesout" contains 
        !            61:                                      ;   number of bytes written
        !            62: 
        !            63: ; DosExit function used to return to DOS
        !            64: 
        !            65:           pushc   1                  ; Push action 1 to end all threads
        !            66:           pushc   0                  ; Push return code 0
        !            67:           call    DosExit            ; Exit
        !            68:           
        !            69:           END     start
        !            70: 
        !            71: Note the following ways in which OS/2 programs differ from comparable 
        !            72: DOS programs:
        !            73: 
        !            74:    1. OS/2 programs must always be linked with the DOSCALLS library. 
        !            75:       You can specify this in the source file with the INCLUDELIB 
        !            76:       directive. 
        !            77: 
        !            78:    2. OS/2 programs require an 80286 (or higher) processor. This means 
        !            79:       you safely use instructions that are available on the 80826, but 
        !            80:       not on earlier processors, since your programs can never run on 
        !            81:       the earlier processors anyway. However, if you wish to bind the 
        !            82:       program so that it will work either under OS/2 or DOS, you will 
        !            83:       probably want to use instructions recognized by all processors. 
        !            84:       For example, a constant can be pushed directly under the 80286, 
        !            85:       but it must be loaded into a register first under the 8086. The 
        !            86:       sample program uses a macro to conditionally handle either case. 
        !            87:     
        !            88:    3. Since OS/2 uses the stack to pass arguments to DOS calls, you 
        !            89:       may need a larger stack for OS/2 programs than for comparable 
        !            90:       DOS programs. 
        !            91: 
        !            92:    4. OS/2 system calls are far external routines and must be declared 
        !            93:       as such in the source code. 
        !            94: 
        !            95:    5. In DOS a data segment must be loaded into DS, but in OS/2 a 
        !            96:       default data segment (the one declared with .DATA) is 
        !            97:       automatically loaded into DS. 
        !            98: 
        !            99:    6. For compatibility with the DOS examples in the Programmer's 
        !           100:       Guide, the DosWrite function is used to write to the screen. The 
        !           101:       VioWrtTTY function is a simpler alternative in many cases. See 
        !           102:       the Microsoft Operating System/2 Programmer's Reference for a 
        !           103:       complete list of OS/2 functions and their arguments. 
        !           104: 
        !           105:    7. Arguments are pushed onto the stack using the Pascal calling 
        !           106:       convention. Passed addresses are always far. The called routine 
        !           107:       cleans up the stack, so there is no need to pop the arguments 
        !           108:       after the call. 
        !           109: 
        !           110:    8. For readability, the OS/2 API (Application Program Interface) 
        !           111:       calls are given in mixed case (DosWrite rather than DOSWRITE). 
        !           112:       Actually the routine names are all uppercase, but you can used 
        !           113:       mixed case because MASM converts names to uppercase. If you are 
        !           114:       writing routines for a case-sensitive language (such as C) you 
        !           115:       should give the names in uppercase and use the /MX or /ML 
        !           116:       assembler option. 
        !           117: 
        !           118:    9. All OS/2 calls return 0 in AX if the call was successful, or an 
        !           119:       error code in AX if it was not. If additional information needs 
        !           120:       to be passed back to the program, it will be placed in an 
        !           121:       address passed as an argument to the call. For example, DosWrite 
        !           122:       returns the number of bytes written in the variable ("bytesout" 
        !           123:       in the example) whose address was passed as the last argument. 
        !           124: 
        !           125: Assembling, Linking, and Binding
        !           126: --------------------------------
        !           127: 
        !           128: Assembly under OS/2 is exactly the same as under DOS. The MASM.EXE 
        !           129: program is bound so that it runs in either environment. For example, 
        !           130: use the following command line to assemble the sample program for 
        !           131: OS/2:
        !           132: 
        !           133:   MASM hellos2;
        !           134: 
        !           135: If you want to assemble program to be bound so that it will run under
        !           136: either OS/2 or DOS, use this command line:
        !           137: 
        !           138:   MASM /Dbind hellos2;
        !           139: 
        !           140: This passes a message to the "pushc" macro to push constants in a 
        !           141: format compatible with the 8088/8086.
        !           142: 
        !           143: The linker has an additional field for a definition file under OS/2, 
        !           144: as described in the CodeView and Utilities manual. This field is not 
        !           145: used for the sample file. You must also link with DOSCALLS.LIB (which 
        !           146: may be located in the directory specified by the LIB environment 
        !           147: variable). 
        !           148: 
        !           149: If DOSCALLS.LIB is specified in the source file with the INCLUDELIB 
        !           150: directive (as in the sample), use the following command line: 
        !           151: 
        !           152:   LINK hellos2;
        !           153: 
        !           154: You can also specify DOSCALLS.LIB in the command line:
        !           155: 
        !           156:   LINK hellos2,,,DOSCALLS;
        !           157: 
        !           158: OS/2 applications use dynamic linking: procedure calls are not 
        !           159: resolved until the program is loaded into memory.  When the program is 
        !           160: loaded, the code required by a call is extracted from a dynamic link 
        !           161: library and loaded with the program. All OS/2 system calls are 
        !           162: contained in dynamic link libraries. 
        !           163: 
        !           164: The DOSCALLS.LIB library does not contain any code for OS/2 system 
        !           165: calls. Instead, it contains dynamic link reference records. The linker 
        !           166: uses these records to make the connection between the OS/2 system call 
        !           167: in the application and the dynamic link library containing the system 
        !           168: procedure. 
        !           169: 
        !           170: You can write OS/2 programs that run under either OS/2 or MS-DOS 3.0 
        !           171: or higher by restricting the OS/2 system calls your program uses. OS/2 
        !           172: function calls are known collectively as the applications program 
        !           173: interface (API). If you restrict your program to a subset of these 
        !           174: functions, known as the Family API, you can write programs that run 
        !           175: under both OS/2 and MS-DOS 3.0 or higher. See the Microsoft Operating 
        !           176: System/2 Programmer's Reference for a list of the Family API 
        !           177: functions. 
        !           178: 
        !           179: Once you have written, assembled, and linked a program using only 
        !           180: Family API functions, you must bind the program using the BIND utility 
        !           181: to produce a version that runs under either operating system.  Binding 
        !           182: resolves references to dynamic link routines so the application runs 
        !           183: without the dynamic link libraries under DOS. 
        !           184: 
        !           185: Because the sample program uses only Family API calls, you can bind it 
        !           186: using the following command: 
        !           187: 
        !           188:   BIND hellos2 C:\LIB\DOSCALLS.LIB
        !           189: 
        !           190: Note that BIND automatically includes the file API.LIB, so you
        !           191: do not need to specify API.LIB on the command line.
        !           192: 
        !           193: To debug OS/2 programs using CodeView, use the protected-mode version, 
        !           194: CVP.EXE. The options for specifying debug information are the same as 
        !           195: in DOS. For example:
        !           196: 
        !           197:   MASM /ZI hellos2;
        !           198:   LINK /CO hellos2;
        !           199:   CVP hellos2 
        !           200: 
        !           201: Note that you cannot debug bound programs. However, you can debug a 
        !           202: protected-mode version of the program. If the program is free of 
        !           203: logical errors in protected mode, it should work the same when bound 
        !           204: and run under DOS. 
        !           205: 
        !           206: Register and Memory Consideration 
        !           207: ---------------------------------
        !           208: 
        !           209: The startup conditions for an OS/2 program are significantly different 
        !           210: than conditions for a comparable DOS program. Two major differences 
        !           211: are that OS/2 programs do not have a PSP and memory is only allocated 
        !           212: for the data and code required by the program. 
        !           213: 
        !           214: Note these specific differences: 
        !           215: 
        !           216:    o Under OS/2, AX contains the segment value of the start of the 
        !           217:      program's environment. In other words, AX:0 points to the 
        !           218:      environment. 
        !           219:      
        !           220:      Under DOS, the word at 2Ch of the Program Segment Prefix (PSP) is 
        !           221:      the segment value of the start of the environment. 
        !           222:    
        !           223:    o Under OS/2 any program arguments are part of the program's 
        !           224:      environment. BX contains the starting offset. Thus AX:BX points 
        !           225:      to the name of the executable program name. It is followed by a 
        !           226:      null byte and then any command line arguments exactly as typed on 
        !           227:      the command line. A null terminates the command line. 
        !           228:      
        !           229:      Under DOS, the command line is unrelated to the environment. It 
        !           230:      starts at byte 81h of the PSP. The length of the command line is 
        !           231:      in the byte at 80h in the PSP and the first two arguments are 
        !           232:      parsed into uppercase file-name format at bytes 5Ch and 6Ch 
        !           233:      respectively of the PSP. 
        !           234: 
        !           235:    o Under OS/2, DS contains the segment of the automatic data 
        !           236:      segment. This is the segment named DGROUP, and it contains both 
        !           237:      the stack and data. If you use simplified segment directives, 
        !           238:      this is the .DATA segment. If you do not use simplified segment 
        !           239:      directives, you must place one data segment in a group called 
        !           240:      DGROUP. For example: 
        !           241: 
        !           242:        _DATA   SEGMENT WORD PUBLIC 'DATA'
        !           243:                .
        !           244:                .
        !           245:                .
        !           246:        _DATA   ENDS
        !           247:         
        !           248:        DGROUP  GROUP   _DATA
        !           249:                ASSUME  ds:DGROUP
        !           250:     
        !           251:      Under DOS (.EXE format), DS points to the PSP. Before using a 
        !           252:      data segment, you must initialize DS to the segment. Use of a 
        !           253:      group (such as DGROUP) is optional. For example: 
        !           254: 
        !           255:        _DATA   SEGMENT WORD PUBLIC 'DATA'
        !           256:                .
        !           257:                .
        !           258:                .
        !           259:        _DATA   ENDS
        !           260:         
        !           261:                ASSUME  ds:_DATA
        !           262:                .
        !           263:                .
        !           264:                .
        !           265:                mov     ax,_DATA
        !           266:                mov     ds,ax
        !           267:     
        !           268:    o Under OS/2, only the memory required by the program is allocated. 
        !           269:      Each segment has an allocated size. Data beyond the allocated 
        !           270:      boundary cannot be accessed. On startup, DS and SS are the same--
        !           271:      the automatic data segment is used both for data and stack. SP 
        !           272:      and CX point to the end of the allocated automatic data segment. 
        !           273:      CS:IP points to the start of the code segment. 
        !           274:      
        !           275:      Under DOS, programs attempt to use all of memory on startup. If a 
        !           276:      program needs to allocate dynamic memory, it must first use a DOS 
        !           277:      call to adjust the program's memory allocation to match the 
        !           278:      actual memory use. This is not necessary under OS/2, since the 
        !           279:      operating system automatically allocates only what the program 
        !           280:      needs. 
        !           281: 
        !           282:    o Under OS/2, segments are actually selectors managed by the 
        !           283:      operating system. They are not tied to actual memory addresses 
        !           284:      and any attempt to do segment arithmetic will fail. All memory 
        !           285:      allocation must be done through operating system calls. 

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.