home *** CD-ROM | disk | FTP | other *** search
- ; hello0.asm : scrive un messaggio nella memoria video
- ;
- ; primo metodo : il descrittore e` creato manualmente
- ;
- ;
- BITS 16
- SECTION .text
- ORG 0x100
-
- jmp start
-
- err_dpmi db 'nessun DPMI in memoria.$'
- err_memory db 'memoria insufficiente.$'
- err_pmode db 'errore entrando in modo protetto.$'
-
- err_pm db 'errore DPMI.$'
- msg_hello db 'Hello, world! (0)'
-
- endl db 13,10,'$'
- pm_ptr dd 0
-
- descriptor ; descrittore
- dw 3999 ; limite 4000 caratteri
- dw 0x8000 ; base 0xB8000 (bit 0..15)
- db 0x0b ; base 0xb8000 (bit 16..23)
- db 0xf2 ; P=1 DPL=3 W=1 (descrittore dati)
- db 0 ; 0 per compatibilita` col 286
- db 0 ; base 0xb8000 (bit 24..31)
-
-
- write_exit:
- mov ah,0x9
- int 21h
- mov dx,endl
- int 21h
- mov al,1
-
- exit:
- mov ah,4ch
- int 21h
-
- start:
- add bx,0x1000
- mov ah,0x4a
- int 21h ; riserva 64K di memoria per questo programma
-
- ;
- ; controllo presenza DPMI server
- ;
- mov ax,1687h
- int 2fh
- test ax,ax
- mov dx,err_dpmi
- jnz write_exit
-
- mov [pm_ptr+2],es ; memorizzo l'indirizzo usato per
- mov [pm_ptr],di ; entrare in modo protetto
-
- test si,si
- jz .go
-
- ; SI contiene i paragrafi di memoria che bisogna allocare
- mov bx,si
- mov ah,48h
- int 21h
- mov dx,err_memory
- jc write_exit
- mov es,ax
-
- .go
- ; pongo ax = 0, indica modo protetto a 16 bit
- xor ax,ax
- call word far [pm_ptr]
- mov dx,err_pmode
- ;
- ; se c'e` un errore siamo ancora in modo reale,
- ; percio` scrivi un messaggio di errore
- jc write_exit
-
- ; ----- ora siamo in modo protetto ------
- ;
- ; tutti i registri (tranne ES) hanno la stessa base
- ; di prima, percio` e` possibile utilizzare le stesse
- ; variabili
- ;
- ; ES contiene il selettore che punta al PSP del programma
-
-
- ; richiedo un descrittore nella LDT
- ; il decrittore viene creato di tipo dati con base e limite 0
- mov ax,0
- mov cx,1
- int 31h
- mov dx,err_pm
- jc write_exit
-
- mov si,ax ; salvo in SI il selettore
-
- ;
- ; copio il descrittore nella LDT
- ;
-
- mov bx,ax
- mov ax,0ch
- mov di,descriptor
- push ds
- pop es
- int 31h
- mov dx,err_pm
- jc write_exit
-
- ;
- ; scrivo la stringa nella memoria video
- ;
-
- mov es,si ; in es il selettore appena creato
- xor di,di
- mov ah,4fh
- mov cx,17
- mov si,msg_hello
- .next ; scrivi la stringa
- lodsb
- stosw
- loop .next
-
-
-
- mov al,0
- jmp exit
-
-
-
-
-