Search code examples
assemblymacrostasm

how to expand TASM macros


Is there a way to expand macros with Borland's TASM ? I'd like to transform a TASM compatible .ASM file to see all his macros expanded. Couldn't find any options to do that.


Solution

  • Use TASM's command-line option /la to produce an expanded listing. From this listing, you can see the high-level and low-level expansions. This feature works on all versions of TASM down to the initial release in 1988.

    For example, let's say you have the following TASM macro:

    OUTPUTMESSAGE MACRO hConsole,stringval
    LOCAL msg
        .data
    msg  db  '&stringval',0
        .code
        call outputString ,hConsole,OFFSET msg
    ENDM ;OUTPUTMESSAGE
    

    And you want to see how the following source is expanded:

    OUTPUTMESSAGE hConsole,<This app was assembled with TASM version >
    OUTPUTMESSAGE hConsole,%??version
    

    The listing file produced with /la (I happened to be using version 5.4) produces the following:

        516                      OUTPUTMESSAGE hConsole,<This app was assembled with TASM version >
    1   517 0000018F                 .data
    1   518 00000000  54 68 69 73 20 61 70+  ??0000  db  'This app was assembled with TASM version ',0
        519       70 20 77 61 73 20 61+
        520       73 73 65 6D 62 6C 65+
        521       64 20 77 69 74 68 20+
        522       54 41 53 4D 20 76 65+
        523       72 73 69 6F 6E 20 00
    1   524 0000002A                 .code
    2   525 0000018F  C8 0000 00             ENTERD  00000h,0
    2   526                      call outputString ,hConsole,OFFSET ??0000
    3   527 00000193  68 00000000r           PUSH    OFFSET ??0000
    3   528 00000198  FF 75 08           PUSH    hConsole
    3   529 0000019B  E8 FFFFFE9B            CALL    outputString
        530                      OUTPUTMESSAGE hConsole,%??version
    1   531 000001A0                 .data
    1   532 0000002A  31 32 38 34 00     ??0001  db  '1284',0
    1   533 0000002F                 .code
    1   534                      call outputString ,hConsole,OFFSET ??0001
    2   535 000001A0  68 0000002Ar           PUSH    OFFSET ??0001
    2   536 000001A5  FF 75 08           PUSH    hConsole
    2   537 000001A8  E8 FFFFFE8E            CALL    outputString
    

    The columns correspond to [depth] [line#] [offset] [machine_code] [source]. Unfortunately as you'll find, the [line#] column isn't particularly useful. Below is a snip from the TASM5 User Guide that describes the columns:

    [depth] - indicates the level of nesting of Include files and macros within your
              listing file.
    
    [line#] - is the number of the line in the listing file (not including header
              and title lines). Line numbers are particularly useful when the
              cross-reference feature of Turbo Assembler, which refers to lines by
              line number, is used. Be aware that the line numbers in [line#] are
              not the source module line numbers. For example, if a macro is
              expanded or a file is included, the line-number field will continue to
              advance, even though the current line in the source module stays the
              same. To translate a line number (for example, one that the
              cross-referencer produced) back to the source file, you must look up
              the line number in the listing file, and then find that same line (by
              eye, not by number) in the source file.
    
    [offset] - is the offset in the current segment of the start of the machine code
               generated by the associated assembler source line.
    
    [machine_code] - is the actual sequence of hexadecimal byte and word values that
                     is assembled from the associated assembler source line.
    
    [source] - is simply the original assembler line, comments and all. Some
               assembler lines, such as those that contain only comments, don't
               generate any machine code; these lines have no [offset] or [machine_
               code] fields, but do have a line number.