| Index | Manual | Download | Source | Macros | Embedded word Case ins.
Sitemap | Links | Forum | Tests | Projects

# Test t7925: Compile to MZ in LARGE model

Description
  Executable MZ program with segments [CODE],[RODATA],[DATA],[BSS],[STACK]. In FARCODE memory models (COMPACT|LARGE|HUGE) instructions CALL and RET are by default FAR. In FARDATA memory models (MEDIUM|LARGE|HUGE) access to each data segment requires to update DS.
See also
  t7921 t7922 t7925 t7926
Tested procedures
  PfomfCompile PfmzCompile PfomfLoadPgm PgmLink

Source & expected listing t7925.htm.lst
  `| | EUROASM AUTOSEGMENT=ON,CPU=086,DUMPWIDTH=24 |7437393235 |%TEST %SET t7925 ; Name of EuroAssembler test program. |4C41524745 |%MODEL %SET LARGE ; Memory model of the test program and its modules. |31 |%FARDATA %SETB "%MODEL"=="COMPACT" || "%MODEL"=="LARGE" || "%MODEL"=="HUGE" | |;; Boolean var %FARDATA is set when each of [RODATA],[DATA],[BSS] requires its own segment address. | |;; | |;; Create the first auxilliary OMF module with functions Write.D16 and Beep.D16. | |%TEST.WB PROGRAM FORMAT=OMF,MODEL=%MODEL |[CODE] ::::Section changed. |0000: |Write.D16:: PROC ; Display ASCIIZ string pointed to by DS:SI using DOS. |0000:B402 | MOV AH,02h ; DOS service Write character form DL to standard output. |0002:FC | CLD ; Direction forward. |0003:AC |.1:LODSB ; Load a character from string to AL, increment SI. |0004:3C00 | CMP AL,0 ; Test if zero-terminator reached. |0006:7406 | JE .9: ; Exit the procedure if AL=0. |0008:88C2 | MOV DL,AL |000A:CD21 | INT 21h ; Otherwise display the character AL and advance screen cursor. |000C:EBF5 | JMP .1: ; Repeat with following characters. |000E:CB |.9:RET ; AX,DL,SI are clobbered. |000F: | ENDP Write.D16:: | |;; |000F: |Beep.D16:: PROC ; Display message "Beeping.." and play a sound using DOS. |000F:BE[0000] | MOV SI,=B"Beeping..." ; Define a literal string in [RODATA]. |TRUE | %IF %FARDATA |0012:B8{0000} | MOV AX,PARA# =B"Beeping..." |0015:8ED8 | MOV DS,AX ; Paragraph address of literal segment [RODATA]. | | %ENDIF |0017:9A[0000]{0000} | CALL Write.D16:: ; Display the notification "Beeping...". |001C:BE[0000] | MOV SI,=W(0x0007) ; Define ASCIIZ string with BEL character in [RODATA]. |001F:9A[0000]{0000} | CALL Write.D16:: ; Play the beep sound. |0024:CB | RET ; AX,DL,SI are clobbered. |0025: | ENDP Beep.D16:: |[@LT2] ====ListLiterals in section [@LT2]. |0000:0700 =W(0x0007) |[@LT1] ====ListLiterals in section [@LT1]. |0000:42656570696E672E~=B"Beeping..." | | ENDPROGRAM %TEST.WB | **** ListMap "t7925.WB.obj",model=LARGE,groups=0,segments=2,entry=,stack= | [CODE],FA=00000072h,RVA=00000000h,size=00000025h=37,width=16,align=0010h,purpose=CODE | [RODATA],FA=000000C0h,RVA=00000000h,size=0000000Dh=13,width=16,align=0010h,purpose=RODATA+LITERAL | **** ListGlobals "t7925.WB.obj",Global=0,Public=2,Extern=0,eXport=0,Import=0 | Beep.D16,[CODE]:0000000Fh,scope='P' | Write.D16,[CODE]:00000000h,scope='P' | |;; | |;; Create other auxilliary OMF module with function Exit.D16. | |%TEST.EX PROGRAM FORMAT=OMF,MODEL=%MODEL |[CODE] ::::Section changed. |0000: |Exit.D16:: PROC ; Display message "End", terminate the program and return to DOS. |0000:BE[0000] | MOV SI,.M: ; String "End" will be defined in segment [BSS] at DS:SI. |TRUE | %IF %FARDATA |0003:B8{0000} | MOV AX,PARA# .M: |0006:8ED8 | MOV DS,AX ; Paragraph address of segment [BSS]. | | %ENDIF |0008:C704456E | MOVW [SI+0],"En" ; Dynamically initialize the notification string. |000C:C744026420 | MOVW [SI+2],"d " ; Assume DS=PARA# [BSS]. |0011:C744040D0A | MOVW [SI+4],0x0A0D ; CR+LF. |0016:C6440600 | MOVB [SI+6],0 ; Zero-terminate the notiofication string. |001A:9A[0000]{0000} | CALL Write.D16:: ; Display the notification "End". |001F:B44C | MOV AH,4Ch ; DOS service Terminate program. |0021:CD21 | INT 21h |[BSS] ::::Section changed. |0000:.............. |.M:DB 7*BYTE ; Reserve space for ASCIIZ string "End" in [BSS] segment. |[CODE] ::::Section changed. |0023: | ENDP Exit.D16:: | | ENDPROGRAM %TEST.EX | **** ListMap "t7925.EX.obj",model=LARGE,groups=0,segments=2,entry=,stack= | [CODE],FA=0000006Bh,RVA=00000000h,size=00000023h=35,width=16,align=0010h,purpose=CODE | [BSS],FA=00000000h,RVA=00000000h,size=00000007h=7,width=16,align=0010h,purpose=BSS | **** ListGlobals "t7925.EX.obj",Global=0,Public=1,Extern=1,eXport=0,Import=0 | Exit.D16,[CODE]:00000000h,scope='P' | Write.D16,[Write.D16]:00000000h,scope='E' | |;; | |;; Create the main program which links auxilliary OMF modules. | |%TEST PROGRAM FORMAT=MZ, MODEL=%MODEL, ENTRY=Start |[CODE] ::::Section changed. |0000:90 |Start:NOP |0001:BE[0000] | MOV SI,Msg |0004:B8{0000} | MOV AX,PARA# Msg ; MZ program requires paragraph address of [DATA] segment |0007:8ED8 | MOV DS,AX ; in all realmode models, including TINY. |0009:9A[0000]{0000} | CALL Write.D16:: |000E:9A[0000]{0000} | CALL Beep.D16:: |0013:9A[0000]{0000} | CALL Exit.D16:: | | LINK %TEST.WB.obj, %TEST.EX.obj |[DATA] ::::Section changed. |0000:3136626974204C41~|Msg:DB '%^WIDTH[]bit %MODEL MZ program "%^OUTFILE" linked',13,10 |002B:2077697468204C41~| DB ' with %MODEL OMF module "%TEST.WB.obj" and "%TEST.EX.obj".',13,10,0 | | ENDPROGRAM %TEST |# I0560 Linking OMF module "./t7925.WB.obj". |# I0560 Linking OMF module "./t7925.EX.obj". | **** ListMap "t7925.exe",model=LARGE,groups=1,segments=5,entry=Start,stack=[SGROUP]:00002000h | [CODE],FA=00000080h,RVA=00000000h,size=00000073h=115,width=16,align=0010h,purpose=CODE | [RODATA],FA=00000100h,RVA=00000080h,size=0000000Dh=13,width=16,align=0010h,purpose=RODATA | [DATA],FA=00000110h,RVA=00000090h,size=00000067h=103,width=16,align=0010h,purpose=DATA | [BSS],FA=00000180h,RVA=00000100h,size=00000007h=7,width=16,align=0010h,purpose=BSS | [SGROUP],FA=00000180h,RVA=00000110h,size=00002000h=8192,group [STACK] | [STACK],FA=00000180h,RVA=00000110h,size=00002000h=8192,width=16,align=0010h,purpose=STACK | **** ListGlobals "t7925.exe",Global=0,Public=4,Extern=0,eXport=0,Import=0 | Beep.D16,[CODE]:0000002Fh,RVA=0000002Fh,scope='P' | Exit.D16,[CODE]:00000050h,RVA=00000050h,scope='P' | Start,[CODE]:00000000h,RVA=00000000h,scope='P' | Write.D16,[CODE]:00000020h,RVA=00000020h,scope='P'`

Expected messages t7925.out
  `I0180 Assembling source file "t7925.htm". I0270 Assembling source "t7925". I0310 Assembling source pass 1. I0330 Assembling source pass 2 - final. I0470 Assembling program "t7925.WB". "t7925.htm"{83} I0510 Assembling program pass 1. "t7925.htm"{83} I0510 Assembling program pass 2. "t7925.htm"{83} I0530 Assembling program pass 3 - final. "t7925.htm"{83} I0660 16bit LARGE OMF file "t7925.WB.obj" created, size=217. "t7925.htm"{112} I0650 Program "t7925.WB" assembled in 3 passes with errorlevel 0. "t7925.htm"{112} I0470 Assembling program "t7925.EX". "t7925.htm"{121} I0510 Assembling program pass 1. "t7925.htm"{121} I0510 Assembling program pass 2. "t7925.htm"{121} I0510 Assembling program pass 3. "t7925.htm"{121} I0530 Assembling program pass 4 - final. "t7925.htm"{121} I0660 16bit LARGE OMF file "t7925.EX.obj" created, size=174. "t7925.htm"{140} I0650 Program "t7925.EX" assembled in 4 passes with errorlevel 0. "t7925.htm"{140} I0470 Assembling program "t7925". "t7925.htm"{149} I0510 Assembling program pass 1. "t7925.htm"{149} I0510 Assembling program pass 2. "t7925.htm"{149} I0530 Assembling program pass 3 - final. "t7925.htm"{149} I0560 Linking OMF module "./t7925.WB.obj". "t7925.htm"{162} I0560 Linking OMF module "./t7925.EX.obj". "t7925.htm"{162} I0660 16bit LARGE MZ file "t7925.exe" created, size=375. "t7925.htm"{162} I0650 Program "t7925" assembled in 3 passes with errorlevel 0. "t7925.htm"{162} I0750 Source "t7925" (238 lines) assembled in 2 passes with errorlevel 0. I0860 Listing file "t7925.htm.lst" created, size=7226. I0990 EuroAssembler terminated with errorlevel 0.`

Expected output file t7925. exe

      0000: 4D 5A 77 01 01 00 09 00 08 00 02 02 FF FF 11 00  MZw··°·°·°··¤¤·°
      0010: 00 20 2F 80 00 00 00 00 40 00 00 00 00 00 00 00  °¯/¤°°°°@°°°°°°°
      0020: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  °°°°°°°°°°°°°°°°
      0030: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  °°°°°°°°°°°°°°°°
      0040: 05 00 00 00 0C 00 00 00 11 00 00 00 16 00 00 00  ·°°°·°°°·°°°·°°°
      0050: 33 00 00 00 3A 00 00 00 42 00 00 00 54 00 00 00  3°°°:°°°B°°°T°°°
      0060: 6D 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  m°°°°°°°°°°°°°°°
      0070: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  °°°°°°°°°°°°°°°°
      0080: 90 BE 00 00 B8 09 00 8E D8 9A 20 00 00 00 9A 2F  ¤¤°°¤·°¤¤¤¯°°°¤/
      0090: 00 00 00 9A 50 00 00 00 90 90 90 90 90 90 90 90  °°°¤P°°°¤¤¤¤¤¤¤¤
      00A0: B4 02 FC AC 3C 00 74 06 88 C2 CD 21 EB F5 CB BE  ¤·¤¤<°t·¤¤¤!¤¤¤¤
      00B0: 02 00 B8 08 00 8E D8 9A 20 00 00 00 BE 00 00 9A  ·°¤·°¤¤¤¯°°°¤°°¤
      00C0: 20 00 00 00 CB 90 90 90 90 90 90 90 90 90 90 90  ¯°°°¤¤¤¤¤¤¤¤¤¤¤¤
      00D0: BE 00 00 B8 10 00 8E D8 C7 04 45 6E C7 44 02 64  ¤°°¤·°¤¤¤·En¤D·d
      00E0: 20 C7 44 04 0D 0A C6 44 06 00 9A 20 00 00 00 B4  ¯¤D··¬¤D·°¤¯°°°¤
      00F0: 4C CD 21 00 00 00 00 00 00 00 00 00 00 00 00 00  L¤!°°°°°°°°°°°°°
      0100: 07 00 42 65 65 70 69 6E 67 2E 2E 2E 00 00 00 00  ·°Beeping...°°°°
      0110: 31 36 62 69 74 20 4C 41 52 47 45 20 4D 5A 20 70  16bit¯LARGE¯MZ¯p
      0120: 72 6F 67 72 61 6D 20 22 74 37 39 32 35 2E 65 78  rogram¯"t7925.ex
      0130: 65 22 20 6C 69 6E 6B 65 64 0D 0A 20 77 69 74 68  e"¯linked·¬¯with
      0140: 20 4C 41 52 47 45 20 4F 4D 46 20 6D 6F 64 75 6C  ¯LARGE¯OMF¯modul
      0150: 65 20 22 74 37 39 32 35 2E 57 42 2E 6F 62 6A 22  e¯"t7925.WB.obj"
      0160: 20 61 6E 64 20 22 74 37 39 32 35 2E 45 58 2E 6F  ¯and¯"t7925.EX.o
      0170: 62 6A 22 2E 0D 0A 00                             bj".·¬°

▲Back to the top▲