home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / caway349.zip / BIN / MULTFLAT.ASM < prev    next >
Assembly Source File  |  1996-06-17  |  2KB  |  116 lines

  1. ;
  2. ;Test of mixing 32-bit and 16-bit segment references in FLAT model
  3. ;
  4.  
  5.     .386
  6.     .model small
  7.     .stack 1024
  8.  
  9.  
  10.     .code
  11.  
  12. start:
  13.     mov    ax,DGROUP
  14.     mov    ds,eax        ; mov <segreg>,eax instead of mov <segreg>,ax shuts off
  15.     mov    es,eax        ;  MASM's superfluous 66h prefix byte (OPSIZE) generation.
  16.                     ;  Other assemblers may insist on mov <segreg>,ax form.
  17.                     ;  At least some versions of TASM don't care.
  18.  
  19. ;
  20. ;A nice simple one, 32-bit to 32-bit
  21. ;
  22.     mov    edx,offset DGROUP:Message1
  23.     mov    ah,9
  24.     int    21h
  25. ;
  26. ;32-bit to 16-bit as a FLAT reference (DGROUP should be the frame)
  27. ;
  28.     mov    edx,offset DGROUP:Message2
  29.     mov    ah,9
  30.     int    21h
  31. ;
  32. ;32-bit to 16-bit with a 16-bit frame, should be a normal fixup.
  33. ;
  34.     push    ds
  35.     mov    ax,_DATA16
  36.     mov    ds,eax
  37.     assume ds:_DATA16
  38.     mov    dx,offset _DATA16:Message3
  39.     mov    ah,9
  40.     int    21h
  41.     assume ds:DGROUP
  42.     pop    ds
  43. ;
  44. ;Give 16-bit code a shout.
  45. ;
  46.  
  47.     call    fword ptr to16
  48.  
  49.     mov    ax,4c00h
  50.     int    21h
  51.  
  52.     .data
  53.  
  54. Message1    db "32-bit to 32-bit FLAT fixup",13,10,"$"
  55. Message4    db "16-bit to 32-bit (32-bit frame) FLAT fixup",13,10,"$"
  56.  
  57. ; a terribly ugly but effective way to get the assembler to generate
  58. ; the proper set of instructions here for calling 16-bit code
  59. to16    DW    OFFSET start16
  60.         DW    0
  61.         DW    _TEXT16
  62.  
  63. _TEXT16    segment word public use16 'CODE'
  64.     assume cs:_TEXT16
  65.  
  66. ;
  67. ;Assume DS would normally address DGROUP like it does here.
  68. ;
  69.     assume ds:DGROUP
  70.  
  71. start16:
  72.  
  73. ;
  74. ;Reference 32-bit data with a 32-bit frame even though we're in a 16-bit code
  75. ;segment, should come out FLAT.
  76. ;
  77.     mov    edx,offset DGROUP:Message4
  78.     mov    ah,9
  79.     int    21h
  80. ;
  81. ;Reference 16-bit data but use a 32-bit frame (DGROUP) and we should still get
  82. ;FLAT.
  83. ;
  84.     mov    edx,offset DGROUP:Message5
  85.     mov    ah,9
  86.     int    21h
  87. ;
  88. ;Do normal reference.
  89. ;
  90.     push    ds
  91.     mov    ax,_DATA16
  92.     mov    ds,ax
  93.     assume ds:_DATA16
  94.     mov    dx,offset _DATA16:Message6
  95.     mov    ah,9
  96.     int    21h
  97.     assume ds:DGROUP
  98.     pop    ds
  99.  
  100.     db 66h    ;need an override to return to 32-bit
  101.     retf
  102.  
  103. _TEXT16    ends
  104.  
  105.  
  106. _DATA16    segment word public use16 'DATA'
  107.  
  108. Message2    db "32-bit to 16-bit (32-bit frame) FLAT fixup",13,10,"$"
  109. Message3    db "32-bit to 16-bit (16-bit frame) normal fixup",13,10,"$"
  110. Message5    db "16-bit to 16-bit (32-bit frame) FLAT fixup",13,10,"$"
  111. Message6    db "16-bit to 16-bit (16-bit frame) normal fixup",13,10,"$"
  112.  
  113. _DATA16    ends
  114.  
  115.     end    start
  116.