| Introduction: ``Why Would You Want to Do That?'' |
|
xxvii | |
|
Another Pleasant Valley Saturday |
|
|
1 | (14) |
|
|
|
1 | (3) |
|
|
|
2 | (1) |
|
|
|
3 | (1) |
|
|
|
4 | (1) |
|
Had This Been the Real Thing... |
|
|
4 | (1) |
|
|
|
5 | (4) |
|
|
|
6 | (2) |
|
|
|
8 | (1) |
|
Assembly Language Programming As a Board Game |
|
|
9 | (6) |
|
|
|
10 | (1) |
|
|
|
11 | (1) |
|
|
|
12 | (3) |
|
|
|
15 | (30) |
|
The Return of the New Math Monster |
|
|
15 | (1) |
|
|
|
16 | (4) |
|
Dissecting a Martian Number |
|
|
18 | (2) |
|
The Essence of a Number Base |
|
|
20 | (1) |
|
Octal: How the Grinch Stole Eight and Nine |
|
|
20 | (4) |
|
Who Stole Eight and Nine? |
|
|
21 | (3) |
|
Hexadecimal: Solving the Digit Shortage |
|
|
24 | (4) |
|
From Hex to Decimal and from Decimal to Hex |
|
|
28 | (4) |
|
|
|
28 | (1) |
|
|
|
29 | (2) |
|
Practice. Practice! Practice! |
|
|
31 | (1) |
|
|
|
32 | (6) |
|
|
|
35 | (1) |
|
|
|
35 | (2) |
|
Borrows across Multiple Columns |
|
|
37 | (1) |
|
|
|
38 | (1) |
|
|
|
38 | (5) |
|
|
|
40 | (2) |
|
|
|
42 | (1) |
|
Hexadecimal As Shorthand for Binary |
|
|
43 | (2) |
|
|
|
44 | (1) |
|
|
|
45 | (32) |
|
RAXie, We Hardly Knew Ye... |
|
|
45 | (2) |
|
|
|
46 | (1) |
|
Switches, Transistors, and Memory |
|
|
47 | (10) |
|
|
|
48 | (1) |
|
|
|
48 | (2) |
|
The Incredible Shrinking Bit |
|
|
50 | (2) |
|
|
|
52 | (1) |
|
|
|
53 | (1) |
|
Bytes, Words, Double Words, and Quad Words |
|
|
54 | (1) |
|
Pretty Chips All in a Row |
|
|
55 | (2) |
|
The Shop Foreman and the Assembly Line |
|
|
57 | (4) |
|
|
|
58 | (1) |
|
|
|
59 | (1) |
|
|
|
60 | (1) |
|
|
|
61 | (1) |
|
The Box That Follows a Plan |
|
|
61 | (5) |
|
|
|
63 | (1) |
|
|
|
64 | (1) |
|
|
|
65 | (1) |
|
What vs. How: Architecture and Microarchitecture |
|
|
66 | (4) |
|
|
|
67 | (1) |
|
The Secret Machinery in the Basement |
|
|
68 | (2) |
|
|
|
70 | (7) |
|
Operating Systems: The Corner Office |
|
|
70 | (1) |
|
BIOS: Software, Just Not as Soft |
|
|
71 | (1) |
|
|
|
71 | (2) |
|
|
|
73 | (1) |
|
|
|
73 | (1) |
|
|
|
74 | (3) |
|
Location, Location, Location |
|
|
77 | (32) |
|
|
|
77 | (8) |
|
|
|
79 | (3) |
|
|
|
82 | (1) |
|
Backward Compatibility and Virtual 86 Mode |
|
|
83 | (1) |
|
|
|
83 | (2) |
|
|
|
85 | (5) |
|
|
|
88 | (1) |
|
Making 20-Bit Addresses out of 16-Bit Registers |
|
|
88 | (2) |
|
16-Bit and 32-Bit Registers |
|
|
90 | (6) |
|
General-Purpose Registers |
|
|
91 | (2) |
|
|
|
93 | (2) |
|
|
|
95 | (1) |
|
|
|
96 | (1) |
|
The Three Major Assembly Programming Models |
|
|
96 | (8) |
|
|
|
97 | (2) |
|
Real Mode Segmented Model |
|
|
99 | (2) |
|
Protected Mode Flat Model |
|
|
101 | (3) |
|
What Protected Mode Won't Let Us Do Anymore |
|
|
104 | (2) |
|
|
|
104 | (1) |
|
Direct Access to Port Hardware |
|
|
105 | (1) |
|
Direct Calls into the BIOS |
|
|
106 | (1) |
|
Looking Ahead: 64-Bit ``Long Mode'' |
|
|
106 | (3) |
|
64-Bit Memory: What May Be Possible Someday vs. What We Can Do Now |
|
|
107 | (2) |
|
|
|
109 | (46) |
|
Files and What's Inside Them |
|
|
110 | (11) |
|
Binary Files vs. Text Files |
|
|
111 | (1) |
|
Looking at File Internals with the Bless Editor |
|
|
112 | (4) |
|
|
|
116 | (1) |
|
|
|
117 | (4) |
|
|
|
121 | (7) |
|
|
|
121 | (3) |
|
|
|
124 | (1) |
|
Beware ``Write-Only'' Source Code! |
|
|
124 | (1) |
|
|
|
125 | (3) |
|
|
|
128 | (1) |
|
The Assembly Language Development Process |
|
|
128 | (11) |
|
The Discipline of Working Directories |
|
|
129 | (2) |
|
Editing the Source Code File |
|
|
131 | (1) |
|
Assembling the Source Code File |
|
|
131 | (1) |
|
|
|
132 | (1) |
|
|
|
133 | (1) |
|
|
|
134 | (1) |
|
Linking the Object Code File |
|
|
135 | (1) |
|
|
|
136 | (1) |
|
|
|
136 | (1) |
|
|
|
137 | (1) |
|
|
|
138 | (1) |
|
|
|
138 | (1) |
|
Taking a Trip Down Assembly Lane |
|
|
139 | (16) |
|
|
|
139 | (3) |
|
Edit the Program in an Editor |
|
|
142 | (1) |
|
Assemble the Program with NASM |
|
|
143 | (3) |
|
|
|
146 | (1) |
|
|
|
147 | (1) |
|
Watch It Run in the Debugger |
|
|
147 | (6) |
|
|
|
153 | (2) |
|
A Place to Stand, with Access to Tools |
|
|
155 | (46) |
|
|
|
157 | (19) |
|
|
|
157 | (1) |
|
|
|
158 | (2) |
|
|
|
160 | (2) |
|
|
|
162 | (1) |
|
|
|
162 | (1) |
|
Opening an Existing Session |
|
|
163 | (1) |
|
Deleting or Renaming Sessions |
|
|
163 | (1) |
|
|
|
164 | (1) |
|
Filesystem Browser Navigation |
|
|
165 | (1) |
|
Adding a File to the Current Session |
|
|
165 | (1) |
|
Dropping a File from the Current Session |
|
|
166 | (1) |
|
Switching Between Session Files in the Editor |
|
|
166 | (1) |
|
Creating a Brand-New File |
|
|
166 | (1) |
|
Creating a Brand-New Folder on Disk |
|
|
166 | (1) |
|
Deleting a File from Disk (Move File to Trash) |
|
|
166 | (1) |
|
Reloading a File from Disk |
|
|
167 | (1) |
|
Saving All Unsaved Changes in Session Files |
|
|
167 | (1) |
|
Printing the File in the Editor Window |
|
|
167 | (1) |
|
|
|
167 | (1) |
|
Adding Items to the Toolbar |
|
|
167 | (1) |
|
|
|
168 | (1) |
|
|
|
169 | (1) |
|
|
|
169 | (1) |
|
|
|
170 | (1) |
|
|
|
171 | (1) |
|
|
|
172 | (1) |
|
Using Kate While Programming |
|
|
172 | (1) |
|
Creating and Using Project Directories |
|
|
173 | (2) |
|
|
|
175 | (1) |
|
|
|
176 | (10) |
|
|
|
176 | (1) |
|
Character Encoding in Konsole |
|
|
177 | (1) |
|
The Three Standard Unix Files |
|
|
178 | (2) |
|
|
|
180 | (2) |
|
|
|
182 | (1) |
|
Terminal Control with Escape Sequences |
|
|
183 | (2) |
|
|
|
185 | (1) |
|
|
|
186 | (8) |
|
|
|
187 | (2) |
|
When a File Is Up to Date |
|
|
189 | (1) |
|
|
|
189 | (2) |
|
Invoking Make from Inside Kate |
|
|
191 | (2) |
|
Using Touch to Force a Build |
|
|
193 | (1) |
|
|
|
194 | (7) |
|
|
|
195 | (1) |
|
|
|
195 | (2) |
|
A Quick Insight Run-Through |
|
|
197 | (3) |
|
|
|
200 | (1) |
|
Following Your Instructions |
|
|
201 | (36) |
|
|
|
201 | (3) |
|
|
|
202 | (2) |
|
Instructions and Their Operands |
|
|
204 | (8) |
|
Source and Destination Operands |
|
|
204 | (1) |
|
|
|
205 | (2) |
|
|
|
207 | (2) |
|
|
|
209 | (1) |
|
Confusing Data and Its Address |
|
|
210 | (1) |
|
|
|
211 | (1) |
|
|
|
211 | (1) |
|
Rally Round the Flags, Boys! |
|
|
212 | (9) |
|
|
|
215 | (1) |
|
Adding and Subtracting One with INC and DEC |
|
|
215 | (1) |
|
Watching Flags from Insight |
|
|
216 | (2) |
|
How Flags Change Program Execution |
|
|
218 | (3) |
|
Signed and Unsigned Values |
|
|
221 | (4) |
|
|
|
221 | (3) |
|
|
|
224 | (1) |
|
Implicit Operands and MUL |
|
|
225 | (5) |
|
|
|
227 | (1) |
|
Unsigned Division with DIV |
|
|
228 | (1) |
|
|
|
229 | (1) |
|
Reading and Using an Assembly Language Reference |
|
|
230 | (3) |
|
Memory Joggers for Complex Memories |
|
|
230 | (1) |
|
An Assembly Language Reference for Beginners |
|
|
231 | (1) |
|
|
|
232 | (1) |
|
NEG: Negate (Two's Complement;i.e., Multiply by -1) |
|
|
233 | (4) |
|
|
|
233 | (1) |
|
|
|
233 | (1) |
|
|
|
233 | (1) |
|
|
|
233 | (1) |
|
|
|
234 | (1) |
|
|
|
234 | (1) |
|
|
|
235 | (1) |
|
|
|
235 | (1) |
|
|
|
235 | (2) |
|
|
|
237 | (42) |
|
The Bones of an Assembly Language Program |
|
|
237 | (9) |
|
The Initial Comment Block |
|
|
239 | (1) |
|
|
|
240 | (1) |
|
|
|
240 | (1) |
|
|
|
241 | (1) |
|
|
|
241 | (1) |
|
Variables for Initialized Data |
|
|
242 | (1) |
|
|
|
242 | (2) |
|
Deriving String Length with EQU |
|
|
244 | (2) |
|
Last In, First Out via the Stack |
|
|
246 | (8) |
|
Five Hundred Plates per Hour |
|
|
246 | (2) |
|
Stacking Things Upside Down |
|
|
248 | (1) |
|
|
|
249 | (2) |
|
|
|
251 | (2) |
|
Storage for the Short Term |
|
|
253 | (1) |
|
Using Linux Kernel Services Through INT80 |
|
|
254 | (10) |
|
An Interrupt That Doesn't Interrupt Anything |
|
|
254 | (5) |
|
|
|
259 | (1) |
|
Exiting a Program via INT 80h |
|
|
260 | (1) |
|
Software Interrupts versus Hardware Interrupts |
|
|
261 | (1) |
|
INT 80h and the Portability Fetish |
|
|
262 | (2) |
|
Designing a Non-Trivial Program |
|
|
264 | (15) |
|
|
|
264 | (1) |
|
Starting with Pseudo-code |
|
|
265 | (1) |
|
|
|
266 | (4) |
|
Those Inevitable ``Whoops!'' Moments |
|
|
270 | (1) |
|
|
|
271 | (2) |
|
|
|
273 | (4) |
|
|
|
277 | (2) |
|
Bits, Flags, Branches, and Tables |
|
|
279 | (48) |
|
Bits Is Bits (and Bytes Is Bits) |
|
|
279 | (7) |
|
|
|
280 | (1) |
|
``It's the Logical Thing to Do, Jim...'' |
|
|
280 | (1) |
|
|
|
281 | (1) |
|
|
|
282 | (1) |
|
|
|
283 | (1) |
|
|
|
284 | (1) |
|
|
|
285 | (1) |
|
Segment Registers Don't Respond to Logic! |
|
|
285 | (1) |
|
|
|
286 | (3) |
|
|
|
286 | (1) |
|
|
|
287 | (1) |
|
Bumping Bits into the Carry Flag |
|
|
287 | (1) |
|
|
|
288 | (1) |
|
Setting a Known Value into the Carry Flag |
|
|
289 | (1) |
|
|
|
289 | (9) |
|
Splitting a Byte into Two Nybbles |
|
|
292 | (1) |
|
Shifting the High Nybble into the Low Nybble |
|
|
293 | (1) |
|
|
|
293 | (2) |
|
Multiplying by Shifting and Adding |
|
|
295 | (3) |
|
Flags, Tests, and Branches |
|
|
298 | (9) |
|
|
|
298 | (1) |
|
|
|
299 | (1) |
|
Jumping on the Absence of a Condition |
|
|
300 | (1) |
|
|
|
301 | (1) |
|
|
|
301 | (1) |
|
A Jungle of Jump Instructions |
|
|
302 | (1) |
|
``Greater Than'' Versus ``Above'' |
|
|
303 | (1) |
|
Looking for 1-Bits with Test |
|
|
304 | (2) |
|
Looking for 0 Bits with BT |
|
|
306 | (1) |
|
Protected Mode Memory Addressing in Detail |
|
|
307 | (11) |
|
Effective Address Calculations |
|
|
308 | (1) |
|
|
|
309 | (1) |
|
Base + Displacement Addressing |
|
|
310 | (1) |
|
|
|
310 | (2) |
|
Index x Scale + Displacement Addressing |
|
|
312 | (1) |
|
|
|
313 | (2) |
|
LEA: The Top-Secret Math Machine |
|
|
315 | (2) |
|
The Burden of 16-Bit Registers |
|
|
317 | (1) |
|
Character Table Translation |
|
|
318 | (7) |
|
|
|
318 | (2) |
|
Translating with MOV or XLAT |
|
|
320 | (5) |
|
Tables Instead of Calculations |
|
|
325 | (2) |
|
|
|
327 | (66) |
|
|
|
328 | (8) |
|
Procedures As Boxes for Code |
|
|
329 | (7) |
|
|
|
336 | (14) |
|
|
|
338 | (2) |
|
The Dangers of Accidental Recursion |
|
|
340 | (1) |
|
A Flag Etiquette Bug to Beware Of |
|
|
341 | (1) |
|
Procedures and the Data They Need |
|
|
342 | (1) |
|
Saving the Caller's Registers |
|
|
343 | (3) |
|
|
|
346 | (1) |
|
|
|
347 | (2) |
|
Placing Constant Data in Procedure Definitions |
|
|
349 | (1) |
|
Local Labels and the Lengths of Jumps |
|
|
350 | (5) |
|
``Forcing'' Local Label Access |
|
|
353 | (1) |
|
Short, Near, and Far Jumps |
|
|
354 | (1) |
|
Building External Procedure Libraries |
|
|
355 | (12) |
|
Global and External Declarations |
|
|
356 | (1) |
|
The Mechanics of Globals and Externals |
|
|
357 | (8) |
|
Linking Libraries into Your Programs |
|
|
365 | (1) |
|
The Dangers of Too Many Procedures and Too Many Libraries |
|
|
366 | (1) |
|
The Art of Crafting Procedures |
|
|
367 | (4) |
|
Maintainability and Reuse |
|
|
367 | (1) |
|
Deciding What Should Be a Procedure |
|
|
368 | (2) |
|
|
|
370 | (1) |
|
Simple Cursor Control in the Linux Console |
|
|
371 | (7) |
|
|
|
377 | (1) |
|
Creating and Using Macros |
|
|
378 | (15) |
|
The Mechanics of Macro Definition |
|
|
379 | (6) |
|
Defining Macros with Parameters |
|
|
385 | (1) |
|
The Mechanics of Invoking Macros |
|
|
386 | (1) |
|
Local Labels Within Macros |
|
|
387 | (1) |
|
Macro Libraries As Include Files |
|
|
388 | (1) |
|
Macros versus Procedures: Pros and Cons |
|
|
389 | (4) |
|
|
|
393 | (46) |
|
The Notion of an Assembly Language String |
|
|
393 | (9) |
|
Turning Your ``String Sense'' Inside-Out |
|
|
394 | (1) |
|
Source Strings and Destination Strings |
|
|
395 | (1) |
|
A Text Display Virtual Screen |
|
|
395 | (7) |
|
REP STOSB, the Software Machine Gun |
|
|
402 | (5) |
|
Machine-Gunning the Virtual Display |
|
|
403 | (1) |
|
Executing the STOSB Instruction |
|
|
404 | (1) |
|
STOSB and the Direction Flag (DF) |
|
|
405 | (1) |
|
Defining Lines in the Display Buffer |
|
|
406 | (1) |
|
Sending the Buffer to the Linux Console |
|
|
406 | (1) |
|
The Semiautomatic Weapon: STOSB without REP |
|
|
407 | (7) |
|
|
|
407 | (1) |
|
|
|
408 | (1) |
|
Displaying a Ruler on the Screen |
|
|
409 | (1) |
|
|
|
410 | (1) |
|
|
|
411 | (2) |
|
Adjusting AAA's Adjustments |
|
|
413 | (1) |
|
|
|
414 | (1) |
|
16-bit and 32-bit Versions of STOS |
|
|
414 | (1) |
|
|
|
414 | (5) |
|
DF and Overlapping Block Moves |
|
|
416 | (2) |
|
Single-Stepping REP String Instructions with Insight |
|
|
418 | (1) |
|
Storing Data to Discontinuous Strings |
|
|
419 | (5) |
|
Displaying an ASCII Table |
|
|
419 | (1) |
|
|
|
420 | (1) |
|
Jumping When ECX Goes to O |
|
|
421 | (1) |
|
|
|
421 | (1) |
|
|
|
422 | (1) |
|
|
|
423 | (1) |
|
Command-Line Arguments and Examining the Stack |
|
|
424 | (8) |
|
Virtual Memory in Two Chunks |
|
|
424 | (3) |
|
Anatomy of the Linux Stack |
|
|
427 | (2) |
|
Why Stack Addresses Aren't Predictable |
|
|
429 | (1) |
|
Setting Command-Line Arguments with Insight |
|
|
429 | (1) |
|
Examining the Stack with Insight's Memory View |
|
|
430 | (2) |
|
String Searches with SCASB |
|
|
432 | (7) |
|
|
|
435 | (1) |
|
Pop the Stack or Address It? |
|
|
436 | (2) |
|
|
|
438 | (1) |
|
|
|
439 | (64) |
|
|
|
440 | (5) |
|
|
|
441 | (1) |
|
Building Code the GNU Way |
|
|
441 | (2) |
|
How to Use gcc in Assembly Work |
|
|
443 | (1) |
|
|
|
444 | (1) |
|
Linking to the Standard C Library |
|
|
445 | (7) |
|
|
|
446 | (1) |
|
|
|
447 | (1) |
|
Saving and Restoring Registers |
|
|
447 | (1) |
|
|
|
448 | (2) |
|
|
|
450 | (1) |
|
Characters Out via puts() |
|
|
451 | (1) |
|
Formatted Text Output with printf() |
|
|
452 | (4) |
|
Passing Parameters to printf() |
|
|
454 | (2) |
|
Data In with fgets() and scanf() |
|
|
456 | (6) |
|
Using scanf() for Entry of Numeric Values |
|
|
458 | (4) |
|
|
|
462 | (8) |
|
The C Library's Time Machine |
|
|
462 | (2) |
|
Fetching time_t Values from the System Clock |
|
|
464 | (1) |
|
Converting a time_t Value to a Formatted String |
|
|
464 | (1) |
|
Generating Separate Local Time Values |
|
|
465 | (1) |
|
Making a Copy of glibc's tm Struct with MOVSD |
|
|
466 | (4) |
|
Understanding AT&T Instruction Mnemonics |
|
|
470 | (5) |
|
AT&T Mnemonic Conventions |
|
|
470 | (1) |
|
Examining gas Source Files Created by gcc |
|
|
471 | (3) |
|
AT&T Memory Reference Syntax |
|
|
474 | (1) |
|
Generating Random Numbers |
|
|
475 | (9) |
|
Seeding the Generator with srand() |
|
|
476 | (1) |
|
Generating Pseudorandom Numbers |
|
|
477 | (5) |
|
Some Bits Are More Random Than Others |
|
|
482 | (1) |
|
Calls to Addresses in Registers |
|
|
483 | (1) |
|
How C Sees Command-Line Arguments |
|
|
484 | (3) |
|
|
|
487 | (16) |
|
Converting Strings into Numbers with sscanf() |
|
|
487 | (2) |
|
Creating and Opening Files |
|
|
489 | (1) |
|
Reading Text from Files with fgets() |
|
|
490 | (3) |
|
Writing Text to Files with fprintf() |
|
|
493 | (1) |
|
Notes on Gathering Your Procedures into Libraries |
|
|
494 | (9) |
|
Conclusion: Not the End, But Only the Beginning |
|
|
503 | (4) |
|
|
|
504 | (2) |
|
|
|
506 | (1) |
|
Appendix A Partial x86 Instruction Set Reference |
|
|
507 | (76) |
|
Notes on the Instruction Set Reference |
|
|
510 | (2) |
|
AAA: Adjust AL after BCD Addition |
|
|
512 | (1) |
|
ADC: Arithmetic Addition with Carry |
|
|
513 | (2) |
|
|
|
515 | (2) |
|
|
|
517 | (2) |
|
|
|
519 | (2) |
|
|
|
521 | (2) |
|
CLC: Clear Carry Flag (CF) |
|
|
523 | (1) |
|
CLD: Clear Direction Flag (DF) |
|
|
524 | (1) |
|
CMP: Arithmetic Comparison |
|
|
525 | (2) |
|
|
|
527 | (1) |
|
DIV: Unsigned Integer Division |
|
|
528 | (1) |
|
|
|
529 | (1) |
|
|
|
530 | (1) |
|
IRET: Return from Interrupt |
|
|
531 | (1) |
|
|
|
532 | (2) |
|
|
|
534 | (1) |
|
|
|
535 | (1) |
|
|
|
536 | (1) |
|
LEA: Load Effective Address |
|
|
537 | (1) |
|
LOOP: Loop until CX/ECX=O |
|
|
538 | (2) |
|
LOOPNZ/LOOPNE: Loop While CX/ECX > 0 and ZF=0 |
|
|
540 | (1) |
|
LOOPZ/LOOPE: Loop While CX/ECX > 0 and ZF=1 |
|
|
541 | (1) |
|
MOV: Move (Copy) Right Operand into Left Operand |
|
|
542 | (2) |
|
|
|
544 | (2) |
|
MOVSX: Move (Copy) with Sign Extension |
|
|
546 | (1) |
|
MUL: Unsigned Integer Multiplication |
|
|
547 | (2) |
|
NEG: Negate (Two's Complement; i.e., Multiply by -1) |
|
|
549 | (1) |
|
|
|
550 | (1) |
|
NOT: Logical NOT (One's Complement) |
|
|
551 | (1) |
|
|
|
552 | (2) |
|
POP: Pop Top of Stack into Operand |
|
|
554 | (1) |
|
POPA/POPAD: Pop All GP Registers |
|
|
555 | (1) |
|
POPF: Pop Top of Stack into 16-Bit Flags |
|
|
556 | (1) |
|
POPFD: Pop Top of Stack into EFlags |
|
|
557 | (1) |
|
PUSH: Push Operand onto Top of Stack |
|
|
558 | (1) |
|
PUSHA: Push All 16-Bit GP Registers |
|
|
559 | (1) |
|
PUSHAD: Push All 32-Bit GP Registers |
|
|
560 | (1) |
|
PUSHF: Push 16-Bit Flags onto Stack |
|
|
561 | (1) |
|
PUSHFD: Push 32-Bit EFlags onto Stack |
|
|
562 | (1) |
|
RET: Return from Procedure |
|
|
563 | (1) |
|
|
|
564 | (2) |
|
|
|
566 | (2) |
|
SBB: Arithmetic Subtraction with Borrow |
|
|
568 | (2) |
|
|
|
570 | (2) |
|
|
|
572 | (2) |
|
|
|
574 | (1) |
|
STD: Set Direction Flag (DF) |
|
|
575 | (1) |
|
|
|
576 | (1) |
|
SUB: Arithmetic Subtraction |
|
|
577 | (2) |
|
|
|
579 | (1) |
|
XLAT: Translate Byte via Table |
|
|
580 | (1) |
|
|
|
581 | (2) |
|
Appendix B Character Set Charts |
|
|
583 | (4) |
| Index |
|
587 | |