100 lines
1.5 KiB
NASM
100 lines
1.5 KiB
NASM
|
|
; This is an example of setting up 32-bit program with flat memory model
|
|
; using DPMI. It requires 32-bit DPMI host in order to start.
|
|
|
|
include '80386.inc'
|
|
include 'format/mz.inc'
|
|
|
|
heap 0 ; no additional memory
|
|
|
|
segment loader use16
|
|
|
|
push cs
|
|
pop ds
|
|
|
|
mov ax,1687h
|
|
int 2Fh
|
|
or ax,ax ; DPMI installed?
|
|
jnz error
|
|
test bl,1 ; 32-bit programs supported?
|
|
jz error
|
|
mov word [mode_switch],di
|
|
mov word [mode_switch+2],es
|
|
mov bx,si ; allocate memory for DPMI data
|
|
mov ah,48h
|
|
int 21h
|
|
jc error
|
|
mov es,ax
|
|
mov ax,1
|
|
call far [mode_switch] ; switch to protected mode
|
|
jc error
|
|
|
|
mov cx,1
|
|
xor ax,ax
|
|
int 31h ; allocate descriptor for code
|
|
mov si,ax
|
|
xor ax,ax
|
|
int 31h ; allocate descriptor for data
|
|
mov di,ax
|
|
mov dx,cs
|
|
lar cx,dx
|
|
shr cx,8
|
|
or cx,0C000h
|
|
mov bx,si
|
|
mov ax,9
|
|
int 31h ; set code descriptor access rights
|
|
mov dx,ds
|
|
lar cx,dx
|
|
shr cx,8
|
|
or cx,0C000h
|
|
mov bx,di
|
|
int 31h ; set data descriptor access rights
|
|
mov ecx,main
|
|
shl ecx,4
|
|
mov dx,cx
|
|
shr ecx,16
|
|
mov ax,7 ; set descriptor base address
|
|
int 31h
|
|
mov bx,si
|
|
int 31h
|
|
mov cx,0FFFFh
|
|
mov dx,0FFFFh
|
|
mov ax,8 ; set segment limit to 4 GB
|
|
int 31h
|
|
mov bx,di
|
|
int 31h
|
|
|
|
mov ds,di
|
|
mov es,di
|
|
mov fs,di
|
|
mov gs,di
|
|
push 0
|
|
push si
|
|
push dword start
|
|
retfd
|
|
|
|
error:
|
|
mov ax,4CFFh
|
|
int 21h
|
|
|
|
mode_switch dd ?
|
|
|
|
segment main use32
|
|
|
|
start:
|
|
mov esi,hello
|
|
.loop:
|
|
lodsb
|
|
or al,al
|
|
jz .done
|
|
mov dl,al
|
|
mov ah,2
|
|
int 21h
|
|
jmp .loop
|
|
.done:
|
|
|
|
mov ax,4C00h
|
|
int 21h
|
|
|
|
hello db 'Hello from protected mode!',0Dh,0Ah,0
|