source: vendor/emx/current/src/dos/symbols.asm

Last change on this file was 18, checked in by bird, 22 years ago

Initial revision

  • Property cvs2svn:cvs-rev set to 1.1
  • Property svn:eol-style set to native
  • Property svn:executable set to *
File size: 9.7 KB
Line 
1;
2; SYMBOLS.ASM -- Manage symbol tables
3;
4; Copyright (c) 1991-1995 by Eberhard Mattes
5;
6; This file is part of emx.
7;
8; emx is free software; you can redistribute it and/or modify it
9; under the terms of the GNU General Public License as published by
10; the Free Software Foundation; either version 2, or (at your option)
11; any later version.
12;
13; emx is distributed in the hope that it will be useful,
14; but WITHOUT ANY WARRANTY; without even the implied warranty of
15; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16; GNU General Public License for more details.
17;
18; You should have received a copy of the GNU General Public License
19; along with emx; see the file COPYING. If not, write to
20; the Free Software Foundation, 59 Temple Place - Suite 330,
21; Boston, MA 02111-1307, USA.
22;
23; See emx.asm for a special exception.
24;
25
26__SYMBOLS = 1
27
28 INCLUDE EMX.INC
29 INCLUDE SYMBOLS.INC
30 INCLUDE SIGNAL.INC
31 INCLUDE PROCESS.INC
32
33 PUBLIC SYM_BY_NAME, SYM_BY_ADDR, SYM_MODULE, SYM_BEFORE
34
35SV_CODE SEGMENT
36
37 ASSUME CS:SV_CODE, DS:NOTHING
38
39;
40; In: DS:DI Pointer to process table entry
41; DS:BX Name of symbol (0 terminated)
42; LDTR Set for process
43;
44; Out: EDX Address
45; AL Code/data
46; CY Not found
47;
48; Note: Assumes that symbols in the string table are unique
49;
50 ASSUME DI:PTR PROCESS
51SYM_BY_NAME PROC NEAR
52 PUSH ES
53 PUSH ECX
54 PUSH ESI
55 PUSH EBP
56 MOV DX, BX
57 CMP [DI].P_SYMBOLS, 0
58 JE SBN_LOOSE
59 MOV AX, L_SYM_SEL
60 .386P
61 VERR AX
62 .386
63 JNZ SBN_LOOSE
64 MOV ES, AX
65 MOV ESI, [DI].P_STR_OFF
66 MOV ECX, ES:[ESI]
67 ADD ECX, ESI
68 ADD ESI, 4
69SBN1: MOV BX, DX
70 CMP ESI, ECX
71 JAE SHORT SBN_LOOSE
72 MOV EBP, ESI
73SBN2: MOV AL, ES:[ESI]
74 CMP AL, [BX]
75 JNE SHORT SBN3
76 INC BX
77 INC ESI
78 OR AL, AL
79 JNZ SHORT SBN2
80 JMP SHORT SBN4
81
82SBN3: INC ESI
83 CMP BYTE PTR ES:[ESI-1], 0
84 JNE SHORT SBN3
85 JMP SHORT SBN1
86
87SBN4: SUB EBP, [DI].P_STR_OFF
88 MOV ESI, 0
89 ASSUME ESI:NEAR32 PTR NLIST
90 MOV ECX, [DI].P_SYMBOLS
91SBN5: CMP ES:[ESI].N_STRING, EBP
92 JE SHORT SBN7
93SBN6: ADD ESI, SIZE NLIST
94 LOOPD SBN5
95 JMP SHORT SBN_LOOSE
96
97SBN7: MOV AL, ES:[ESI].N_TYPE
98 AND AL, NOT N_EXT
99 MOV AH, SYM_TEXT
100 CMP AL, N_TEXT
101 JE SHORT SBN8
102 MOV AH, SYM_DATA
103 CMP AL, N_DATA
104 JE SHORT SBN8
105 CMP AL, N_BSS
106 JE SHORT SBN8
107 JMP SHORT SBN6
108
109SBN8: MOV AL, AH
110 MOV BX, DX
111 MOV EDX, ES:[ESI].N_VALUE
112 CLC
113 JMP SHORT SBN_RET
114
115SBN_LOOSE: STC
116 MOV BX, DX
117SBN_RET: POP EBP
118 POP ESI
119 POP ECX
120 POP ES
121 RET
122 ASSUME ESI:NOTHING
123 ASSUME DI:NOTHING
124SYM_BY_NAME ENDP
125
126
127;
128; In: DS:DI Pointer to process table entry
129; EDX Address
130; AL Code/data
131; LDTR Set for process
132;
133; Out: ES:EBX Pointer to name
134; DX Descriptor (line number)
135; CY Not found
136;
137; This function searches the list backwards, to meet a `real' symbol
138; before a file name (eg, __time before time.o). Yes, it's a hack.
139;
140 ASSUME DI:PTR PROCESS
141SYM_BY_ADDR PROC NEAR
142 PUSH ECX
143 PUSH ESI
144 PUSH EBP
145 MOV BL, AL
146 CMP [DI].P_SYMBOLS, 0
147 JE SBA_LOOSE
148 MOV AX, L_SYM_SEL
149 .386P
150 VERR AX
151 .386
152 JNZ SBA_LOOSE
153 MOV ES, AX
154 MOV ECX, [DI].P_SYMBOLS
155 MOV ESI, ECX
156 DEC ESI
157 IMUL ESI, SIZE NLIST
158 ASSUME ESI:NEAR32 PTR NLIST
159SBA1: CMP ES:[ESI].N_VALUE, EDX
160 JE SHORT SBA3
161SBA2: SUB ESI, SIZE NLIST
162 LOOPD SBA1
163 JMP SHORT SBA_LOOSE
164
165SBA3: MOV AL, ES:[ESI].N_TYPE
166 AND AL, NOT N_EXT
167 MOV AH, SYM_TEXT
168 CMP AL, N_TEXT
169 JE SHORT SBA4
170 MOV AH, SYM_DATA
171 CMP AL, N_DATA
172 JE SHORT SBA4
173 CMP AL, N_BSS
174 JE SHORT SBA4
175 CMP AL, N_SLINE
176 JNE SHORT SBA2
177 CMP BL, SYM_LINE
178 JNE SHORT SBA2
179 JMP SHORT SBA5
180
181SBA4: CMP BL, SYM_ANY
182 JE SHORT SBA5
183 CMP BL, AH
184 JNE SHORT SBA2
185SBA5: MOV EBX, ES:[ESI].N_STRING
186 ADD EBX, [DI].P_STR_OFF
187 MOV DX, ES:[ESI].N_DESC
188 CLC
189 JMP SHORT SBA_RET
190
191SBA_LOOSE: STC
192SBA_RET: POP EBP
193 POP ESI
194 POP ECX
195 RET
196 ASSUME ESI:NOTHING
197 ASSUME DI:NOTHING
198SYM_BY_ADDR ENDP
199
200
201;
202; In: DS:DI Pointer to process table entry
203; EDX Address
204; LDTR Set for process
205;
206; Out: ES:EBX Pointer to file name
207; CY Not found
208;
209; This functions assumes that the list is sorted by address.
210;
211 ASSUME DI:PTR PROCESS
212SYM_MODULE PROC NEAR
213 PUSH ECX
214 PUSH ESI
215 PUSH EBP
216 CMP [DI].P_SYMBOLS, 0
217 JE SBM_LOOSE
218 MOV AX, L_SYM_SEL
219 .386P
220 VERR AX
221 .386
222 JNZ SBM_LOOSE
223 MOV ES, AX
224 MOV ECX, [DI].P_SYMBOLS
225 MOV ESI, 0
226 ASSUME ESI:NEAR32 PTR NLIST
227 MOV EBP, -1 ; Nothing found yet
228SBM1: MOV AL, ES:[ESI].N_TYPE
229 CMP AL, 64H ; Main module
230 JE SHORT SBM4
231 CMP AL, 84H ; Submodule
232 JE SHORT SBM4
233SBM2: ADD ESI, SIZE NLIST
234 LOOPD SBM1
235SBM3: CMP EBP, -1
236 JE SHORT SBM_LOOSE
237 MOV ESI, EBP
238 MOV EBX, ES:[ESI].N_STRING
239 ADD EBX, [DI].P_STR_OFF
240 CLC
241 JMP SHORT SBM_RET
242
243SBM4: CMP ES:[ESI].N_VALUE, EDX
244 JA SHORT SBM3
245 MOV EBP, ESI
246 JMP SHORT SBM2
247
248SBM_LOOSE: STC
249SBM_RET: POP EBP
250 POP ESI
251 POP ECX
252 RET
253 ASSUME ESI:NOTHING
254 ASSUME DI:NOTHING
255SYM_MODULE ENDP
256
257
258;
259; In: DS:DI Pointer to process table entry
260; EDX Address
261; LDTR Set for process
262;
263; Out: ES:EBX Pointer to name
264; EAX Address
265; CY Not found
266;
267; This functions assumes that file names come after other symbols.
268;
269 ASSUME DI:PTR PROCESS
270SYM_BEFORE PROC NEAR
271 PUSH ECX
272 PUSH ESI
273 PUSH EBP
274 CMP [DI].P_SYMBOLS, 0
275 JE SBB_LOOSE
276 MOV AX, L_SYM_SEL
277 .386P
278 VERR AX
279 .386
280 JNZ SBB_LOOSE
281 MOV ES, AX
282 MOV EBP, -1 ; Nothing found yet
283 MOV ECX, [DI].P_SYMBOLS
284 MOV ESI, 0
285 ASSUME ESI:NEAR32 PTR NLIST
286 MOV EBP, -1
287 MOV EBX, 0
288SBB1: MOV AL, ES:[ESI].N_TYPE
289 AND AL, NOT N_EXT
290 CMP AL, N_TEXT
291 JE SHORT SBB3
292 CMP AL, N_DATA
293 JE SHORT SBB3
294 CMP AL, N_BSS
295 JE SHORT SBB3
296SBB2: ADD ESI, SIZE NLIST
297 LOOPD SBB1
298 CMP EBP, -1
299 JE SHORT SBB_LOOSE
300 MOV ESI, EBP
301 MOV EBX, ES:[ESI].N_STRING
302 ADD EBX, [DI].P_STR_OFF
303 MOV EAX, ES:[ESI].N_VALUE
304 CLC
305 JMP SHORT SBB_RET
306
307
308SBB3: CMP ES:[ESI].N_VALUE, EDX
309 JA SHORT SBB2
310 CMP ES:[ESI].N_VALUE, EBX
311 JB SHORT SBB2
312 MOV EBP, ESI
313 MOV EBX, ES:[ESI].N_VALUE
314 JMP SHORT SBB2
315
316SBB_LOOSE: STC
317SBB_RET: POP EBP
318 POP ESI
319 POP ECX
320 RET
321 ASSUME ESI:NOTHING
322 ASSUME DI:NOTHING
323SYM_BEFORE ENDP
324
325
326
327
328SV_CODE ENDS
329
330 END
Note: See TracBrowser for help on using the repository browser.