DOS-debug

Форк
0
/
DPMIBK32.ASM 
191 строка · 3.7 Кб
1

2
;--- DPMIBK32.ASM: 32bit DPMI application written in MASM syntax.
3
;--- this sample temporarily switches back to real-mode.
4
;--- assemble: JWasm -mz dpmibk32.asm
5

6
LF  equ 10
7
CR  equ 13
8

9
    .386
10
    .model small
11

12
    .dosseg     ;this ensures that stack segment is last
13

14
    .stack 1024
15

16
;--- DPMI real-mode call structure
17

18
RMCS struct
19
rEDI    dd ?
20
rESI    dd ?
21
rEBP    dd ?
22
        dd ?
23
rEBX    dd ?
24
rEDX    dd ?
25
rECX    dd ?
26
rEAX    dd ?
27
rFlags  dw ?
28
rES     dw ?
29
rDS     dw ?
30
rFS     dw ?
31
rGS     dw ?
32
rIP     dw ?
33
rCS     dw ?
34
rSP     dw ?
35
rSS     dw ?
36
RMCS ends
37

38
    .data
39

40
szWelcome db "welcome in protected-mode",CR,LF,0
41
szBackinPM db "back in protected-mode",CR,LF,0
42

43
    .code
44

45
start:
46
    push eax
47
    mov esi, offset szWelcome
48
    call printstring
49
    pop ebx
50

51
;--- switch back to real-mode
52

53
    sub esp, sizeof RMCS+2
54
    mov ebp,esp
55
    xor eax, eax
56
    mov [ebp].RMCS.rIP, offset backtoreal
57
    mov [ebp].RMCS.rCS, _TEXT16
58
    mov [ebp].RMCS.rFlags, ax
59
    mov [ebp].RMCS.rDS, ax
60
    mov [ebp].RMCS.rES, ax
61
    mov [ebp].RMCS.rFS, ax
62
    mov [ebp].RMCS.rGS, ax
63
    lea eax,[ebp-20h]
64
    mov [ebp].RMCS.rSP, ax
65
    mov [ebp].RMCS.rSS, bx
66
    xor bx,bx
67
    xor cx,cx
68
    mov edi,ebp
69
    push ss
70
    pop es
71
    mov ax,0301h	;temporarily switch to real-mode
72
    int 31h
73

74
    mov esi, offset szBackinPM
75
    call printstring
76
    mov ax, 4C00h   ;normal client exit
77
    int 21h
78

79
;--- print a string in protected-mode with simple
80
;--- DOS commands not using pointers.
81

82
printstring:
83
    lodsb
84
    and al,al
85
    jz stringdone
86
    mov dl,al
87
    mov ah,2
88
    int 21h
89
    jmp printstring
90
stringdone:
91
    ret
92

93
;--- now comes the 16bit initialization part
94

95
_TEXT16 segment use16 word public 'CODE'
96

97
backtoreal:
98
    push cs
99
    pop ds
100
    mov dx,offset dBackinRM
101
    mov ah,9
102
    int 21h
103
    retf            ;back to protected-mode
104

105

106
start16:
107
    mov ax,ss
108
    mov cx,es
109
    sub ax, cx
110
    mov bx, sp
111
    shr bx, 4
112
    inc bx
113
    add bx, ax
114
    mov ah, 4Ah     ;free unused memory
115
    int 21h
116

117
    mov ax, 1687h   ;DPMI host installed?
118
    int 2Fh
119
    and ax, ax
120
    jnz nohost
121
    push es         ;save DPMI entry address
122
    push di
123
    and si, si      ;requires host client-specific DOS memory?
124
    jz nomemneeded
125
    mov bx, si
126
    mov ah, 48h     ;alloc DOS memory
127
    int 21h
128
    jc nomem
129
    mov es, ax
130
nomemneeded:
131
    mov ax, DGROUP
132
    mov ds, ax
133
    mov bx, ss
134
    mov bp, sp
135
    mov ax, 0001        ;start a 32-bit client
136
    call far ptr [bp]   ;initial switch to protected-mode
137
    jc initfailed
138

139
;--- now in protected-mode
140

141
;--- create a 32bit code selector and jump to 32bit code
142

143
    push bx     ;save stack segment
144
    mov cx,1
145
    mov ax,0
146
    int 31h
147
    mov bx,ax
148
    mov cx,_TEXT
149
    mov dx,cx
150
    shl dx,4
151
    shr cx,12
152
    mov ax,7
153
    int 31h     ;set base address
154
    mov dx,-1
155
    mov cx,0
156
    mov ax,8
157
    int 31h     ;set descriptor limit to 64 kB
158
    mov cx,cs
159
    lar cx,cx
160
    shr cx,8
161
    or ch,40h
162
    mov ax,9
163
    int 31h     ;set code descriptors attributes to 32bit
164
    pop ax      ;store stack segment in AX
165
    push ebx
166
    push offset start
167
    retd        ;jump to 32-bit code
168

169
nohost:
170
    mov dx, offset dErr1
171
    jmp error
172
nomem:
173
    mov dx, offset dErr2
174
    jmp error
175
initfailed:
176
    mov dx, offset dErr3
177
error:
178
    push cs
179
    pop ds
180
    mov ah, 9
181
    int 21h
182
    mov ax, 4C00h
183
    int 21h
184

185
dErr1 db "no DPMI host installed",CR,LF,'$'
186
dErr2 db "not enough DOS memory for initialisation",CR,LF,'$'
187
dErr3 db "DPMI initialisation failed",CR,LF,'$'
188
dBackinRM db "switched to real-mode",CR,LF,'$'
189

190
_TEXT16 ends
191

192
    end start16
193

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.