| Preface |
|
xxiii | |
|
|
|
1 | (24) |
|
Welcome to Assembly Language |
|
|
1 | (6) |
|
|
|
2 | (3) |
|
Assembly Language Applications |
|
|
5 | (1) |
|
|
|
6 | (1) |
|
|
|
7 | (2) |
|
|
|
9 | (1) |
|
|
|
9 | (1) |
|
|
|
9 | (11) |
|
|
|
10 | (1) |
|
|
|
11 | (1) |
|
|
|
12 | (1) |
|
|
|
13 | (1) |
|
|
|
14 | (2) |
|
|
|
16 | (2) |
|
|
|
18 | (2) |
|
|
|
20 | (3) |
|
Truth Tables for Boolean Functions |
|
|
22 | (1) |
|
|
|
23 | (1) |
|
|
|
23 | (2) |
|
IA-32 Processor Architecture |
|
|
25 | (26) |
|
|
|
25 | (8) |
|
Basic Microcomputer Design |
|
|
26 | (1) |
|
Instruction Execution Cycle |
|
|
27 | (3) |
|
|
|
30 | (1) |
|
|
|
31 | (1) |
|
|
|
32 | (1) |
|
IA-32 Processor Architecture |
|
|
33 | (6) |
|
|
|
33 | (1) |
|
Basic Execution Environment |
|
|
34 | (2) |
|
|
|
36 | (1) |
|
Intel Microprocessor History |
|
|
37 | (1) |
|
|
|
38 | (1) |
|
|
|
39 | (4) |
|
|
|
39 | (2) |
|
|
|
41 | (2) |
|
|
|
43 | (1) |
|
Components of an IA-32 Microcomputer |
|
|
43 | (3) |
|
|
|
43 | (1) |
|
|
|
44 | (1) |
|
|
|
45 | (1) |
|
Input-Output Ports and Device Interfaces |
|
|
45 | (1) |
|
|
|
46 | (1) |
|
|
|
46 | (3) |
|
|
|
46 | (2) |
|
|
|
48 | (1) |
|
|
|
49 | (2) |
|
Assembly Language Fundamentals |
|
|
51 | (28) |
|
Basic Elements of Assembly Language |
|
|
51 | (7) |
|
|
|
52 | (1) |
|
|
|
52 | (1) |
|
|
|
53 | (1) |
|
|
|
54 | (1) |
|
|
|
54 | (1) |
|
|
|
54 | (1) |
|
|
|
54 | (1) |
|
|
|
55 | (1) |
|
|
|
55 | (2) |
|
The NOP (No Operation) Instruction |
|
|
57 | (1) |
|
|
|
58 | (1) |
|
Example: Adding Three Integers |
|
|
58 | (4) |
|
Alternative Version of AddSub |
|
|
60 | (1) |
|
|
|
61 | (1) |
|
|
|
61 | (1) |
|
Assembling, Linking, and Running Programs |
|
|
62 | (2) |
|
The Assemble-Link-Execute Cycle |
|
|
62 | (2) |
|
|
|
64 | (1) |
|
|
|
64 | (8) |
|
|
|
64 | (1) |
|
Data Definition Statement |
|
|
64 | (2) |
|
Defining Byte and Sbyte Data |
|
|
66 | (1) |
|
Defining Word and Sword Data |
|
|
67 | (1) |
|
Defining Dword and Sdword Data |
|
|
68 | (1) |
|
|
|
69 | (1) |
|
|
|
69 | (1) |
|
Defining Real Number Data |
|
|
69 | (1) |
|
|
|
69 | (1) |
|
Adding Variables to the AddSub Program |
|
|
70 | (1) |
|
Declaring Uninitialized Data |
|
|
71 | (1) |
|
|
|
71 | (1) |
|
|
|
72 | (3) |
|
|
|
72 | (1) |
|
Calculating the Sizes of Arrays and Strings |
|
|
73 | (1) |
|
|
|
74 | (1) |
|
|
|
74 | (1) |
|
|
|
75 | (1) |
|
Real-Address Mode Programming (Optional) |
|
|
75 | (1) |
|
|
|
75 | (1) |
|
|
|
76 | (1) |
|
|
|
77 | (2) |
|
Data Transfers, Addressing, and Arithmetic |
|
|
79 | (32) |
|
Data Transfer Instructions |
|
|
79 | (8) |
|
|
|
79 | (1) |
|
|
|
80 | (1) |
|
|
|
80 | (1) |
|
|
|
81 | (1) |
|
Zero/Sign Extension of Integers |
|
|
82 | (2) |
|
LAHF and SAHF Instructions |
|
|
84 | (1) |
|
|
|
84 | (1) |
|
|
|
84 | (1) |
|
|
|
85 | (1) |
|
|
|
86 | (1) |
|
|
|
87 | (7) |
|
|
|
87 | (1) |
|
|
|
87 | (1) |
|
|
|
88 | (1) |
|
|
|
88 | (1) |
|
Implementing Arithmetic Expressions |
|
|
89 | (1) |
|
Flags Affected by Addition and Subtraction |
|
|
89 | (3) |
|
Example Program (AddSub3) |
|
|
92 | (1) |
|
|
|
93 | (1) |
|
Data-Related Operators and Directives |
|
|
94 | (5) |
|
|
|
94 | (1) |
|
|
|
95 | (1) |
|
|
|
95 | (1) |
|
|
|
96 | (1) |
|
|
|
97 | (1) |
|
|
|
97 | (1) |
|
|
|
97 | (1) |
|
|
|
98 | (1) |
|
|
|
99 | (5) |
|
|
|
99 | (1) |
|
|
|
100 | (1) |
|
|
|
101 | (1) |
|
|
|
102 | (1) |
|
|
|
103 | (1) |
|
JMP and LOOP Instructions |
|
|
104 | (4) |
|
|
|
104 | (1) |
|
|
|
105 | (1) |
|
|
|
106 | (1) |
|
|
|
106 | (1) |
|
|
|
107 | (1) |
|
|
|
108 | (1) |
|
|
|
109 | (2) |
|
|
|
111 | (39) |
|
|
|
111 | (1) |
|
Linking to an External Library |
|
|
111 | (2) |
|
|
|
112 | (1) |
|
|
|
112 | (1) |
|
|
|
113 | (16) |
|
|
|
113 | (2) |
|
Individual Procedure Descriptions |
|
|
115 | (10) |
|
|
|
125 | (4) |
|
|
|
129 | (1) |
|
|
|
129 | (5) |
|
|
|
129 | (2) |
|
Push and POP Instructions |
|
|
131 | (3) |
|
|
|
134 | (1) |
|
Defining and Using Procedures |
|
|
134 | (9) |
|
|
|
134 | (2) |
|
Call and RET Instructions |
|
|
136 | (3) |
|
Example: Summing an Integer Array |
|
|
139 | (1) |
|
|
|
140 | (1) |
|
Saving and Restoring Registers |
|
|
140 | (2) |
|
|
|
142 | (1) |
|
Program Design Using Procedures |
|
|
143 | (4) |
|
Integer Summation Program (Design) |
|
|
143 | (2) |
|
Integer Summation Implementation |
|
|
145 | (2) |
|
|
|
147 | (1) |
|
|
|
147 | (1) |
|
|
|
148 | (2) |
|
|
|
150 | (43) |
|
|
|
150 | (1) |
|
Boolean and Comparison Instructions |
|
|
151 | (7) |
|
|
|
151 | (1) |
|
|
|
152 | (1) |
|
|
|
153 | (1) |
|
|
|
154 | (1) |
|
|
|
155 | (1) |
|
|
|
155 | (1) |
|
|
|
156 | (1) |
|
Setting and Clearing Individual CPU Flags |
|
|
157 | (1) |
|
|
|
157 | (1) |
|
|
|
158 | (11) |
|
|
|
158 | (1) |
|
|
|
158 | (1) |
|
Types of Conditional Jump Instructions |
|
|
159 | (4) |
|
Conditional Jump Applications |
|
|
163 | (4) |
|
Bit Testing Instructions (Optional) |
|
|
167 | (1) |
|
|
|
168 | (1) |
|
Conditional Loop Instructions |
|
|
169 | (1) |
|
Loopz and Loope Instructions |
|
|
169 | (1) |
|
Loopnz and Loopne Instructions |
|
|
169 | (1) |
|
|
|
170 | (1) |
|
|
|
170 | (9) |
|
Block-Structured IF Statements |
|
|
170 | (3) |
|
|
|
173 | (1) |
|
|
|
174 | (3) |
|
|
|
177 | (1) |
|
|
|
178 | (1) |
|
Application: Finite-State Machines |
|
|
179 | (5) |
|
Validating an Input String |
|
|
180 | (1) |
|
Validating a Signed Integer |
|
|
180 | (3) |
|
|
|
183 | (1) |
|
|
|
184 | (5) |
|
Signed and Unsigned Comparisons |
|
|
185 | (1) |
|
|
|
186 | (2) |
|
.Repeat and .While Directives |
|
|
188 | (1) |
|
|
|
189 | (1) |
|
|
|
190 | (3) |
|
|
|
193 | (31) |
|
|
|
193 | (1) |
|
Shift and Rotate Instructions |
|
|
194 | (7) |
|
Logical Shifts and Arithmetic Shifts |
|
|
194 | (1) |
|
|
|
195 | (1) |
|
|
|
196 | (1) |
|
|
|
196 | (1) |
|
|
|
197 | (1) |
|
|
|
198 | (1) |
|
|
|
198 | (1) |
|
|
|
199 | (1) |
|
|
|
199 | (1) |
|
|
|
200 | (1) |
|
Shift and Rotate Applications |
|
|
201 | (3) |
|
Shifting Multiple Doublewords |
|
|
201 | (1) |
|
|
|
202 | (1) |
|
|
|
202 | (1) |
|
Isolating MS-DOS File Date Fields |
|
|
203 | (1) |
|
|
|
203 | (1) |
|
Multiplication and Division Operations |
|
|
204 | (9) |
|
|
|
204 | (1) |
|
|
|
205 | (2) |
|
Benchmarking Multiplication Operations |
|
|
207 | (1) |
|
|
|
208 | (1) |
|
|
|
209 | (2) |
|
Implementing Arithmetic Expressions |
|
|
211 | (1) |
|
|
|
212 | (1) |
|
Extended Addition and Subtraction |
|
|
213 | (2) |
|
|
|
213 | (1) |
|
Extended Addition Example |
|
|
213 | (1) |
|
|
|
214 | (1) |
|
|
|
215 | (1) |
|
ASCII and Unpacked Decimal Arithmetic |
|
|
215 | (4) |
|
|
|
216 | (2) |
|
|
|
218 | (1) |
|
|
|
218 | (1) |
|
|
|
218 | (1) |
|
|
|
219 | (1) |
|
Packed Decimal Arithmetic |
|
|
219 | (2) |
|
|
|
219 | (1) |
|
|
|
220 | (1) |
|
|
|
220 | (1) |
|
|
|
221 | (1) |
|
|
|
222 | (2) |
|
|
|
224 | (45) |
|
|
|
224 | (1) |
|
|
|
225 | (17) |
|
|
|
225 | (8) |
|
|
|
233 | (3) |
|
Enter and Leave Instructions |
|
|
236 | (1) |
|
|
|
237 | (3) |
|
WriteStackFrame Procedure |
|
|
240 | (1) |
|
|
|
241 | (1) |
|
|
|
242 | (4) |
|
Recursively Calculating a Sum |
|
|
243 | (1) |
|
|
|
243 | (2) |
|
|
|
245 | (1) |
|
|
|
246 | (2) |
|
|
|
247 | (1) |
|
|
|
248 | (1) |
|
Invoke, ADDR, PROC, and Proto (Optional) |
|
|
248 | (10) |
|
|
|
248 | (1) |
|
|
|
249 | (1) |
|
|
|
250 | (3) |
|
|
|
253 | (2) |
|
Parameter Classifications |
|
|
255 | (1) |
|
Example: Exchanging Two Integers |
|
|
256 | (1) |
|
|
|
256 | (1) |
|
|
|
257 | (1) |
|
Creating Multimodule Programs |
|
|
258 | (9) |
|
Hiding and Exporting Procedure Names |
|
|
258 | (1) |
|
Calling External Procedures |
|
|
258 | (1) |
|
Using Variables and Symbols Across Module Boundaries |
|
|
259 | (1) |
|
Example: ArraySum Program |
|
|
260 | (1) |
|
Creating the Modules Using Extern |
|
|
261 | (3) |
|
Creating the Modules Using Invoke and PROTO |
|
|
264 | (2) |
|
|
|
266 | (1) |
|
|
|
267 | (1) |
|
|
|
268 | (1) |
|
|
|
269 | (30) |
|
|
|
269 | (1) |
|
String Primitive Instructions |
|
|
270 | (6) |
|
|
|
271 | (1) |
|
|
|
272 | (2) |
|
|
|
274 | (1) |
|
|
|
274 | (1) |
|
|
|
275 | (1) |
|
|
|
275 | (1) |
|
Selected String Procedures |
|
|
276 | (6) |
|
|
|
276 | (1) |
|
|
|
277 | (1) |
|
|
|
278 | (1) |
|
|
|
278 | (1) |
|
|
|
279 | (1) |
|
String Library Demo Program |
|
|
280 | (2) |
|
|
|
282 | (1) |
|
|
|
282 | (3) |
|
Ordering of Rows and Columns |
|
|
282 | (1) |
|
|
|
283 | (2) |
|
Base-Index Displacement Operands |
|
|
285 | (1) |
|
|
|
285 | (1) |
|
Searching and Sorting Integer Arrays |
|
|
285 | (9) |
|
|
|
286 | (1) |
|
|
|
287 | (6) |
|
|
|
293 | (1) |
|
|
|
294 | (1) |
|
|
|
295 | (4) |
|
|
|
299 | (47) |
|
|
|
299 | (14) |
|
|
|
300 | (1) |
|
Declaring Structure Variables |
|
|
301 | (1) |
|
Referencing Structure Variables |
|
|
302 | (3) |
|
Example: Displaying the System Time |
|
|
305 | (2) |
|
Structures Containing Structures |
|
|
307 | (1) |
|
|
|
307 | (3) |
|
Declaring and Using Unions |
|
|
310 | (2) |
|
|
|
312 | (1) |
|
|
|
313 | (13) |
|
|
|
313 | (1) |
|
|
|
313 | (1) |
|
|
|
314 | (1) |
|
Additional Macro Features |
|
|
315 | (3) |
|
Using the Book's Macro Library |
|
|
318 | (6) |
|
Example Program: Wrappers |
|
|
324 | (1) |
|
|
|
325 | (1) |
|
Conditional-Assembly Directives |
|
|
326 | (12) |
|
Checking for Missing Arguments |
|
|
326 | (2) |
|
Default Argument Initializers |
|
|
328 | (1) |
|
|
|
328 | (1) |
|
IF, ELSE, and ENDIF Directives |
|
|
328 | (1) |
|
The IFIDN and IFIDNI Directives |
|
|
329 | (1) |
|
Example: Summing a Matrix Row |
|
|
330 | (3) |
|
|
|
333 | (3) |
|
|
|
336 | (1) |
|
|
|
337 | (1) |
|
|
|
338 | (4) |
|
|
|
338 | (1) |
|
|
|
338 | (1) |
|
|
|
339 | (1) |
|
|
|
340 | (1) |
|
|
|
340 | (2) |
|
|
|
342 | (1) |
|
|
|
342 | (1) |
|
|
|
343 | (3) |
|
|
|
346 | (56) |
|
Win32 Console Programming |
|
|
346 | (33) |
|
|
|
347 | (3) |
|
|
|
350 | (2) |
|
|
|
352 | (2) |
|
|
|
354 | (6) |
|
|
|
360 | (1) |
|
Reading and Writing Files |
|
|
361 | (4) |
|
File I/O in the Irvine32 Library |
|
|
365 | (2) |
|
Testing the File I/O Procedures |
|
|
367 | (3) |
|
Console Window Manipulation |
|
|
370 | (3) |
|
|
|
373 | (1) |
|
Controlling the Text Color |
|
|
373 | (2) |
|
|
|
375 | (4) |
|
|
|
379 | (1) |
|
Writing a Graphical Windows Application |
|
|
379 | (8) |
|
|
|
380 | (1) |
|
|
|
381 | (1) |
|
|
|
382 | (1) |
|
|
|
382 | (1) |
|
The ErrorHandler Procedure |
|
|
383 | (1) |
|
|
|
383 | (3) |
|
|
|
386 | (1) |
|
Dynamic Memory Allocation |
|
|
387 | (6) |
|
|
|
390 | (3) |
|
|
|
393 | (1) |
|
|
|
393 | (6) |
|
|
|
394 | (3) |
|
|
|
397 | (1) |
|
|
|
398 | (1) |
|
|
|
399 | (1) |
|
|
|
400 | (2) |
|
High-Level Language Interface |
|
|
402 | (30) |
|
|
|
402 | (2) |
|
|
|
402 | (1) |
|
|
|
403 | (1) |
|
|
|
404 | (5) |
|
__asm Directive in Microsoft Visual C++ |
|
|
404 | (2) |
|
|
|
406 | (3) |
|
|
|
409 | (1) |
|
Linking to C/C++ in Protected Mode |
|
|
409 | (14) |
|
Using Assembly Language to Optimize C++ Code |
|
|
410 | (5) |
|
Calling C and C++ Functions |
|
|
415 | (1) |
|
Multiplication Table Example |
|
|
416 | (3) |
|
Calling C Library Functions |
|
|
419 | (3) |
|
Directory Listing Program |
|
|
422 | (1) |
|
|
|
423 | (1) |
|
Linking to C/C++ in Real-Address Mode |
|
|
423 | (7) |
|
|
|
424 | (1) |
|
|
|
425 | (3) |
|
Example: Large Random Integers |
|
|
428 | (2) |
|
|
|
430 | (1) |
|
|
|
430 | (1) |
|
|
|
431 | (1) |
|
16-Bit MS-DOS Programming |
|
|
432 | (32) |
|
|
|
432 | (6) |
|
|
|
433 | (1) |
|
|
|
434 | (1) |
|
|
|
435 | (1) |
|
|
|
435 | (1) |
|
Coding for 16-Bit Programs |
|
|
436 | (1) |
|
|
|
437 | (1) |
|
MS-DOS Function Calls (INT 21h) |
|
|
438 | (11) |
|
Selected Output Functions |
|
|
439 | (2) |
|
Hello World Program Example |
|
|
441 | (1) |
|
|
|
442 | (4) |
|
|
|
446 | (3) |
|
|
|
449 | (1) |
|
Standard MS-DOS File I/O Services |
|
|
449 | (12) |
|
Create or Open File (716Ch) |
|
|
451 | (1) |
|
|
|
452 | (1) |
|
|
|
452 | (1) |
|
Get File Creation Date and Time |
|
|
453 | (1) |
|
Selected Library Procedures |
|
|
453 | (1) |
|
Example: Read and Copy a Text File |
|
|
454 | (2) |
|
Reading the MS-DOS Command Tail |
|
|
456 | (2) |
|
Example: Creating a Binary File |
|
|
458 | (3) |
|
|
|
461 | (1) |
|
|
|
461 | (2) |
|
|
|
463 | (1) |
|
|
|
464 | (26) |
|
|
|
464 | (4) |
|
Tracks, Cylinders, and Sectors |
|
|
465 | (1) |
|
Disk Partitions (Volumes) |
|
|
466 | (2) |
|
|
|
468 | (1) |
|
|
|
468 | (4) |
|
|
|
469 | (1) |
|
|
|
469 | (1) |
|
|
|
469 | (1) |
|
|
|
470 | (1) |
|
|
|
470 | (1) |
|
|
|
471 | (1) |
|
|
|
472 | (5) |
|
MS-DOS Directory Structure |
|
|
473 | (2) |
|
Long Filenames in MS-Windows |
|
|
475 | (1) |
|
File Allocation Table (FAT) |
|
|
476 | (1) |
|
|
|
477 | (1) |
|
Reading and Writing Disk Sectors (7305h) |
|
|
477 | (5) |
|
|
|
478 | (4) |
|
|
|
482 | (1) |
|
System-Level File Functions |
|
|
482 | (5) |
|
Get Disk Free Space (7303h) |
|
|
483 | (2) |
|
Create Subdirectory (39h) |
|
|
485 | (1) |
|
Remove Subdirectory (3Ah) |
|
|
486 | (1) |
|
Set Current Directory (3Bh) |
|
|
486 | (1) |
|
Get Current Directory (47h) |
|
|
486 | (1) |
|
Get and Set File Attributes (7143h) |
|
|
486 | (1) |
|
|
|
487 | (1) |
|
|
|
487 | (1) |
|
|
|
488 | (2) |
|
|
|
490 | (46) |
|
|
|
490 | (2) |
|
|
|
491 | (1) |
|
Keyboard Input with INT 16h |
|
|
492 | (6) |
|
|
|
492 | (1) |
|
|
|
493 | (4) |
|
|
|
497 | (1) |
|
Video Programming with INT 10h |
|
|
498 | (14) |
|
|
|
498 | (1) |
|
|
|
499 | (2) |
|
|
|
501 | (10) |
|
Library Procedure Examples |
|
|
511 | (1) |
|
|
|
512 | (1) |
|
Drawing Graphics Using INT 10h |
|
|
512 | (7) |
|
INT 10h Pixel-Related Functions |
|
|
513 | (1) |
|
|
|
514 | (1) |
|
Cartesian Coordinates Program |
|
|
515 | (2) |
|
Converting Cartesian Coordinates to Screen Coordinates |
|
|
517 | (1) |
|
|
|
518 | (1) |
|
|
|
519 | (4) |
|
Mode 13h: 320 x 200, 256 Colors |
|
|
519 | (1) |
|
Memory-Mapped Graphics Program |
|
|
520 | (3) |
|
|
|
523 | (1) |
|
|
|
523 | (10) |
|
|
|
523 | (5) |
|
|
|
528 | (4) |
|
|
|
532 | (1) |
|
|
|
533 | (1) |
|
|
|
534 | (2) |
|
Expert MS-DOS Programming |
|
|
536 | (26) |
|
|
|
536 | (1) |
|
|
|
537 | (7) |
|
Simplified Segment Directives |
|
|
537 | (1) |
|
Explicit Segment Definitions |
|
|
538 | (4) |
|
|
|
542 | (1) |
|
|
|
542 | (1) |
|
|
|
543 | (1) |
|
Runtime Program Structure |
|
|
544 | (4) |
|
|
|
544 | (1) |
|
|
|
545 | (1) |
|
|
|
546 | (1) |
|
|
|
547 | (1) |
|
|
|
548 | (10) |
|
|
|
549 | (1) |
|
Interrupt Control Instructions |
|
|
550 | (1) |
|
Writing a Custom Interrupt Handler |
|
|
551 | (2) |
|
Terminate and Stay Resident Programs |
|
|
553 | (1) |
|
Application: The No_Reset Program |
|
|
554 | (3) |
|
|
|
557 | (1) |
|
Hardware Control Using I/O Ports |
|
|
558 | (2) |
|
|
|
558 | (1) |
|
|
|
558 | (2) |
|
|
|
560 | (2) |
|
Floating-Point Processing and Instruction Encoding |
|
|
562 | (38) |
|
Floating-Point Binary Representation |
|
|
562 | (7) |
|
IEEE Binary Floating-Point Representation |
|
|
563 | (1) |
|
|
|
564 | (1) |
|
Normalized Binary Floating-Point Numbers |
|
|
565 | (1) |
|
Creating the IEEE Representation |
|
|
565 | (2) |
|
Converting Decimal Fractions to Binary Reals |
|
|
567 | (1) |
|
|
|
568 | (1) |
|
|
|
569 | (19) |
|
|
|
569 | (2) |
|
|
|
571 | (2) |
|
Floating-Point Exceptions |
|
|
573 | (1) |
|
Floating-Point Instruction Set |
|
|
573 | (3) |
|
|
|
576 | (3) |
|
Comparing Floating-Point Values |
|
|
579 | (3) |
|
Reading and Writing Floating-Point Values |
|
|
582 | (1) |
|
Exception Synchronization |
|
|
583 | (1) |
|
|
|
584 | (1) |
|
|
|
585 | (1) |
|
Masking and Unmasking Exceptions |
|
|
586 | (1) |
|
|
|
587 | (1) |
|
Intel Instruction Encoding |
|
|
588 | (8) |
|
|
|
588 | (1) |
|
|
|
589 | (1) |
|
Move Immediate to Register |
|
|
590 | (1) |
|
Register-Mode Instructions |
|
|
591 | (1) |
|
IA-32 Processor Operand-Size Prefix |
|
|
591 | (1) |
|
|
|
592 | (3) |
|
|
|
595 | (1) |
|
|
|
596 | (1) |
|
|
|
597 | (3) |
| Appendix A MASM Reference |
|
600 | (19) |
| Appendix B The IA-32 Instruction Set |
|
619 | (31) |
| Appendix C BIOS and MS-DOS Interrupts |
|
650 | (9) |
| Appendix D Answers to Review Questions |
|
659 | (46) |
| Index |
|
705 | |