home *** CD-ROM | disk | FTP | other *** search
/ io Programmo 10 / ioProg_10.iso / soft / pmode / hello1.asm < prev    next >
Encoding:
Assembly Source File  |  1997-10-19  |  2.3 KB  |  112 lines

  1. ; hello1.asm : scrive un messaggio nella memoria video
  2. ;
  3. ; secondo metodo : il descrittore e` creato automaticamente dal DPMI
  4. ;
  5. ;
  6.  
  7.     BITS 16
  8.         SECTION .text
  9.     ORG    0x100
  10.  
  11.         jmp    start
  12.  
  13.         err_dpmi   db 'nessun DPMI in memoria.$'
  14.     err_memory db 'memoria insufficiente.$'
  15.         err_pmode  db 'errore entrando in modo protetto.$'
  16.  
  17.         err_pm     db 'errore DPMI.$'
  18.         msg_hello  db 'Hello, world! (1)'
  19.  
  20.         endl       db 13,10,'$'
  21.         pm_ptr       dd 0
  22.  
  23.  
  24. write_exit:
  25.     mov    ah,0x9
  26.         int    21h
  27.         mov    dx,endl
  28.         int    21h
  29.         mov    al,1
  30.  
  31. exit:
  32.     mov    ah,4ch
  33.         int    21h
  34.  
  35. start:
  36.         add    bx,0x1000
  37.     mov    ah,0x4a
  38.         int    21h      ; riserva 64K di memoria per questo programma
  39.  
  40.         ;
  41.         ; controllo presenza DPMI server
  42.         ;
  43.         mov    ax,1687h
  44.         int    2fh
  45.         test    ax,ax
  46.         mov    dx,err_dpmi
  47.         jnz    write_exit
  48.  
  49.         mov    [pm_ptr+2],es    ; memorizzo l'indirizzo usato per
  50.         mov    [pm_ptr],di     ; entrare in modo protetto
  51.  
  52.         test    si,si
  53.         jz    .go
  54.  
  55.         ; SI contiene i paragrafi di memoria che bisogna allocare
  56.     mov    bx,si
  57.     mov    ah,48h
  58.     int    21h
  59.     mov    dx,err_memory
  60.     jc    write_exit
  61.     mov    es,ax
  62.  
  63. .go
  64.     ; pongo ax = 0, indica modo protetto a 16 bit
  65.     xor    ax,ax
  66.         call    word far [pm_ptr]
  67.         mov    dx,err_pmode
  68.         ;
  69.         ; se c'e` un errore siamo ancora in modo reale,
  70.         ; percio` scrivi un messaggio di errore
  71.         jc    write_exit
  72.  
  73.         ; ----- ora siamo in modo protetto ------
  74.         ;
  75.         ; tutti i registri (tranne ES) hanno la stessa base
  76.         ; di prima, percio` e` possibile utilizzare le stesse
  77.         ; variabili
  78.         ;
  79.         ; ES contiene il selettore che punta al PSP del programma
  80.  
  81.  
  82.         ;
  83.         ; ora uso un metodo alternativo, la funzione 2h del
  84.         ; DPMI converte automaticamente in selettore un
  85.         ; segmento utilizzato per il modo reale!
  86.         ;
  87.  
  88.      mov    ax,2
  89.         mov    bx,0xb800    ; segmento modo reale
  90.         int    31h
  91.         mov    dx,err_pm
  92.         jc    write_exit
  93.  
  94.  
  95.         mov    es,ax        ; in ax c'e` il selettore
  96.         xor    di,di
  97.         mov    ah,4fh
  98.         mov    cx,17
  99.         mov    si,msg_hello
  100. .next                           ; scrivi la stringa
  101.         lodsb
  102.         stosw
  103.         loop    .next
  104.  
  105.  
  106.         mov    al,0
  107.         jmp    exit
  108.  
  109.  
  110.  
  111.  
  112.