Write Great Code Understanding the Machine 2nd Edition Randall Hyde pdf download
Write Great Code Understanding the Machine 2nd Edition Randall Hyde pdf download
https://textbookfull.com/product/write-great-code-understanding-
the-machine-2nd-edition-randall-hyde/
https://textbookfull.com/product/write-great-code-volume-1-2nd-
edition-randall-hyde/
https://textbookfull.com/product/write-great-code-
volume-3-engineering-software-1st-edition-randall-hyde/
https://textbookfull.com/product/thinking-low-level-writing-high-
level-2nd-edition-randall-hyde/
https://textbookfull.com/product/understanding-human-
sexuality-13th-edition-janet-hyde/
The Art Science Craft of Great Landscape Photography
1st Edition Randall
https://textbookfull.com/product/the-art-science-craft-of-great-
landscape-photography-1st-edition-randall/
https://textbookfull.com/product/functional-programming-in-c-how-
to-write-better-c-code-1st-edition-enrico-buonanno/
https://textbookfull.com/product/core-blender-development-
understanding-the-essential-source-code-brad-e-hollister/
https://textbookfull.com/product/modern-systems-programming-with-
scala-native-write-lean-high-performance-code-without-the-
jvm-1st-edition-richard-whaling/
https://textbookfull.com/product/core-blender-development-
understanding-the-essential-source-code-1st-edition-brad-e-
hollister/
2ND EDITION
UNDERSTANDING
THE MACHINE
R ANDALL HYDE
PRAISE FOR THE FIRST EDITION OF
WRITE GREAT CODE, VOLUME 1
“Today’s programmers can hardly keep up with the race against inhumane
deadlines and new technologies; therefore, they rarely have a chance to learn
the basics of computer architectures and the inner workings of their program-
ming languages. This book fills in the gaps. I strongly recommend it.”
—InformIT.com
“[Write Great Code] isn’t your typical ‘teach yourself to program’ book. . .
It’s relevant to all languages, and all levels of programming experience. . .
Run, don’t walk, to buy and read this book.”
—Bay A rea L arge Installation S ystem A dministrators (BayLISA)
5/5 stars: “[Write Great Code] fills in the blanks nicely and really could be
part of a computer science degree required reading set. . . . Once this book
is read, you will have a greater understanding and appreciation for code that
is written efficiently—and you may just know enough to do that yourself. At
least you will have a great start at the art of crafting efficient software.”
—M acCompanion
by Randall Hyde
San Francisco
WRITE GREAT CODE, Volume 1: Understanding the Machine, 2nd Edition.
Copyright © 2020 by Randall Hyde.
All rights reserved. No part of this work may be reproduced or transmitted in any form or by any means,
electronic or mechanical, including photocopying, recording, or by any information storage or retrieval
system, without the prior written permission of the copyright owner and the publisher.
ISBN-10: 1-71850-036-X
ISBN-13: 978-1-71850-036-5
For information on distribution, translations, or bulk sales, please contact No Starch Press, Inc. directly:
No Starch Press, Inc.
245 8th Street, San Francisco, CA 94103
phone: 1.415.863.9900; info@nostarch.com
www.nostarch.com
The Library of Congress issued the following Cataloging-in-Publication Data for the first edition of Volume 1:
Hyde, Randall.
Write great code : understanding the machine / Randall Hyde.
p. cm.
ISBN 1-59327-003-8
1. Computer programming. 2. Computer architecture. I. Title.
QA76.6.H94 2004
005.1--dc22
2003017502
No Starch Press and the No Starch Press logo are registered trademarks of No Starch Press, Inc. Other
product and company names mentioned herein may be the trademarks of their respective owners. Rather
than use a trademark symbol with every occurrence of a trademarked name, we are using the names only
in an editorial fashion and to the benefit of the trademark owner, with no intention of infringement of
the trademark.
The information in this book is distributed on an “As Is” basis, without warranty. While every precaution
has been taken in the preparation of this work, neither the author nor No Starch Press, Inc. shall have any
liability to any person or entity with respect to any loss or damage caused or alleged to be caused directly
or indirectly by the information contained in it.
About the Author
Randall Hyde is the author of The Art of Assembly Language and
Write Great Code, Volumes 1, 2, and 3 (all from No Starch Press), as
well as Using 6502 Assembly Language and P-Source (Datamost). He is
also the coauthor of Microsoft Macro Assembler 6.0 Bible (The Waite
Group). Over the past 40 years, Hyde has worked as an embedded
software/hardware engineer developing instrumentation for
nuclear reactors, traffic control systems, and other consumer elec-
tronics devices. He has also taught computer science at California
State Polytechnic University, Pomona, and at the University of
California, Riverside. His website is www.randallhyde.com/.
Acknowledgments . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xvii
Glossary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 431
Index . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 443
CONTE NT S IN DE TA IL
ACKNOWLEDGMENTS XVII
1
WHAT YOU NEED TO KNOW TO WRITE GREAT CODE 1
1.1 The Write Great Code Series . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
1.2 What This Book Covers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
1.3 Assumptions This Book Makes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
1.4 Characteristics of Great Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
1.5 The Environment for This Book . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
1.6 Additional Tips . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
1.7 For More Information . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
2
NUMERIC REPRESENTATION 9
2.1 What Is a Number? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
2.2 Numbering Systems . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
2.2.1 The Decimal Positional Numbering System . . . . . . . . . . . . . . . . . . . . . 11
2.2.2 Radix (Base) Values . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
2.2.3 The Binary Numbering System . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
2.2.4 The Hexadecimal Numbering System . . . . . . . . . . . . . . . . . . . . . . . . 15
2.2.5 The Octal Numbering System . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
2.3 Numeric/String Conversions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
2.4 Internal Numeric Representation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
2.4.1 Bits . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
2.4.2 Bit Strings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
2.5 Signed and Unsigned Numbers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
2.6 Useful Properties of Binary Numbers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
2.7 Sign Extension, Zero Extension, and Contraction . . . . . . . . . . . . . . . . . . . . . . . . 26
2.8 Saturation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
2.9 Binary-Coded Decimal Representation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
2.10 Fixed-Point Representation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
2.11 Scaled Numeric Formats . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
2.12 Rational Representation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
2.13 For More Information . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
3
BINARY ARITHMETIC AND BIT OPERATIONS 37
3.1 Arithmetic Operations on Binary and Hexadecimal Numbers . . . . . . . . . . . . . . . . 37
3.1.1 Adding Binary Values . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
3.1.2 Subtracting Binary Values . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
3.1.3 Multiplying Binary Values . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
3.1.4 Dividing Binary Values . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
3.2 Logical Operations on Bits . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
3.3 Logical Operations on Binary Numbers and Bit Strings . . . . . . . . . . . . . . . . . . . . 44
3.4 Useful Bit Operations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
3.4.1 Testing Bits in a Bit String Using AND . . . . . . . . . . . . . . . . . . . . . . . . 45
3.4.2 Testing a Set of Bits for Zero/Not Zero Using AND . . . . . . . . . . . . . . . 45
3.4.3 Comparing a Set of Bits Within a Binary String . . . . . . . . . . . . . . . . . 46
3.4.4 Creating Modulo-n Counters Using AND . . . . . . . . . . . . . . . . . . . . . . 47
3.5 Shifts and Rotates . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
3.6 Bit Fields and Packed Data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
3.7 Packing and Unpacking Data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
3.8 For More Information . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
4
FLOATING-POINT REPRESENTATION 61
4.1 Introduction to Floating-Point Arithmetic . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
4.2 IEEE Floating-Point Formats . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66
4.2.1 Single-Precision Floating-Point Format . . . . . . . . . . . . . . . . . . . . . . . . 67
4.2.2 Double-Precision Floating-Point Format . . . . . . . . . . . . . . . . . . . . . . . . 69
4.2.3 Extended-Precision Floating-Point Format . . . . . . . . . . . . . . . . . . . . . . 69
4.2.4 Quad-Precision Floating-Point Format . . . . . . . . . . . . . . . . . . . . . . . . . 70
4.3 Normalization and Denormalized Values . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70
4.4 Rounding . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71
4.5 Special Floating-Point Values . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
4.6 Floating-Point Exceptions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74
4.7 Floating-Point Operations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75
4.7.1 Floating-Point Representation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75
4.7.2 Floating-Point Addition and Subtraction . . . . . . . . . . . . . . . . . . . . . . . 75
4.7.3 Floating-Point Multiplication and Division . . . . . . . . . . . . . . . . . . . . . . 86
4.8 For More Information . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93
5
CHARACTER REPRESENTATION 95
5.1 Character Data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96
5.1.1 The ASCII Character Set . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96
5.1.2 The EBCDIC Character Set . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99
5.1.3 Double-Byte Character Sets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100
5.1.4 The Unicode Character Set . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101
5.1.5 Unicode Code Points . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101
5.1.6 Unicode Code Planes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102
5.1.7 Surrogate Code Points . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102
5.1.8 Glyphs, Characters, and Grapheme Clusters . . . . . . . . . . . . . . . . . . 103
5.1.9 Unicode Normals and Canonical Equivalence . . . . . . . . . . . . . . . . . 105
5.1.10 Unicode Encodings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107
5.1.11 Unicode Combining Characters . . . . . . . . . . . . . . . . . . . . . . . . . . 108
5.2 Character Strings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110
5.2.1 Character String Formats . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110
5.2.2 Types of Strings: Static, Pseudo-Dynamic, and Dynamic . . . . . . . . . . . 116
5.2.3 Reference Counting for Strings . . . . . . . . . . . . . . . . . . . . . . . . . . . . 117
5.2.4 Delphi Strings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 118
5.2.5 Custom String Formats . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119
x
5.3 Character Set Data Types . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119
5.3.1 Powerset Representation of Character Sets . . . . . . . . . . . . . . . . . . . . 119
5.3.2 List Representation of Character Sets . . . . . . . . . . . . . . . . . . . . . . . . 120
5.4 Designing Your Own Character Set . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121
5.4.1 Designing an Efficient Character Set . . . . . . . . . . . . . . . . . . . . . . . . 122
5.4.2 Grouping the Character Codes for Numeric Digits . . . . . . . . . . . . . . 123
5.4.3 Grouping Alphabetic Characters . . . . . . . . . . . . . . . . . . . . . . . . . . 123
5.4.4 Comparing Alphabetic Characters . . . . . . . . . . . . . . . . . . . . . . . . . 125
5.4.5 Grouping Other Characters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 127
5.5 For More Information . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 130
6
MEMORY ORGANIZATION AND ACCESS 131
6.1 The Basic System Components . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 131
6.1.1 The System Bus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132
6.2 Physical Organization of Memory . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 135
6.2.1 8-Bit Data Buses . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 137
6.2.2 16-Bit Data Buses . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 138
6.2.3 32-Bit Data Buses . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 140
6.2.4 64-Bit Data Buses . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 141
6.2.5 Small Accesses on Non-80x86 Processors . . . . . . . . . . . . . . . . . . . . 141
6.3 Big-Endian vs. Little-Endian Organization . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 142
6.4 The System Clock . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 147
6.4.1 Memory Access and the System Clock . . . . . . . . . . . . . . . . . . . . . . . 148
6.4.2 Wait States . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 150
6.4.3 Cache Memory . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 151
6.5 CPU Memory Access . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 154
6.5.1 The Direct Memory Addressing Mode . . . . . . . . . . . . . . . . . . . . . . . 155
6.5.2 The Indirect Addressing Mode . . . . . . . . . . . . . . . . . . . . . . . . . . . . 155
6.5.3 The Indexed Addressing Mode . . . . . . . . . . . . . . . . . . . . . . . . . . . . 156
6.5.4 The Scaled-Index Addressing Modes . . . . . . . . . . . . . . . . . . . . . . . . 157
6.6 For More Information . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 157
7
COMPOSITE DATA TYPES AND MEMORY OBJECTS 159
7.1 Pointer Types . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 159
7.1.1 Pointer Implementation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 160
7.1.2 Pointers and Dynamic Memory Allocation . . . . . . . . . . . . . . . . . . . . 161
7.1.3 Pointer Operations and Pointer Arithmetic . . . . . . . . . . . . . . . . . . . . 162
7.2 Arrays . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 166
7.2.1 Array Declarations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 167
7.2.2 Array Representation in Memory . . . . . . . . . . . . . . . . . . . . . . . . . . . 170
7.2.3 Accessing Elements of an Array . . . . . . . . . . . . . . . . . . . . . . . . . . . 171
7.2.4 Multidimensional Arrays . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 172
7.3 Records/Structures . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 181
7.3.1 Records in Pascal/Delphi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 181
7.3.2 Records in C/C++ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 182
7.3.3 Records in HLA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 183
7.3.4 Records (Tuples) in Swift . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 183
7.3.5 Memory Storage of Records . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 184
xi
7.4 Discriminant Unions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 187
7.4.1 Unions in C/C++ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 187
7.4.2 Unions in Pascal/Delphi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 187
7.4.3 Unions in Swift . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 189
7.4.4 Unions in HLA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 190
7.4.5 Memory Storage of Unions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 190
7.4.6 Other Uses of Unions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 191
7.5 Classes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 192
7.5.1 Inheritance . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 194
7.5.2 Class Constructors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 198
7.5.3 Polymorphism . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 201
7.5.4 Abstract Methods and Abstract Base Classes . . . . . . . . . . . . . . . . . . 202
7.6 Classes in C++ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 205
7.6.1 Abstract Member Functions and Classes in C++ . . . . . . . . . . . . . . . . 206
7.6.2 Multiple Inheritance in C++ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 206
7.7 Classes in Java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 208
7.8 Classes in Swift . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 209
7.9 Protocols and Interfaces . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 210
7.10 Generics and Templates . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 213
7.11 For More Information . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 215
8
BOOLEAN LOGIC AND DIGITAL DESIGN 217
8.1 Boolean Algebra . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 218
8.1.1 The Boolean Operators . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 218
8.1.2 Boolean Postulates . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 218
8.1.3 Boolean Operator Precedence . . . . . . . . . . . . . . . . . . . . . . . . . . . . 220
8.2 Boolean Functions and Truth Tables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 220
8.3 Function Numbers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 222
8.4 Algebraic Manipulation of Boolean Expressions . . . . . . . . . . . . . . . . . . . . . . . . 223
8.5 Canonical Forms . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 224
8.5.1 Sum-of-Minterms Canonical Form and Truth Tables . . . . . . . . . . . . . . 225
8.5.2 Algebraically Derived Sum-of-Minterms Canonical Form . . . . . . . . . . 227
8.5.3 Product-of-Maxterms Canonical Form . . . . . . . . . . . . . . . . . . . . . . . . 228
8.6 Simplification of Boolean Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 229
8.7 What Does This Have to Do with Computers, Anyway? . . . . . . . . . . . . . . . . . . . 237
8.7.1 Correspondence Between Electronic Circuits and Boolean Functions . . 238
8.7.2 Combinatorial Circuits . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 239
8.7.3 Sequential and Clocked Logic . . . . . . . . . . . . . . . . . . . . . . . . . . . . 245
8.8 For More Information . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 249
9
CPU ARCHITECTURE 251
9.1 Basic CPU Design . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 252
9.2 Decoding and Executing Instructions: Random Logic vs. Microcode . . . . . . . . . . . 254
9.3 Executing Instructions, Step by Step . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 255
9.3.1 The mov Instruction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 256
9.3.2 The add Instruction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 257
xii
9.3.3 The jnz Instruction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 258
9.3.4 The loop Instruction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 259
9.4 RISC vs. CISC: Improving Performance by Executing More, Faster, Instructions . . . 259
9.5 Parallelism: The Key to Faster Processing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 260
9.5.1 Functional Units . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 263
9.5.2 The Prefetch Queue . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 265
9.5.3 Conditions That Hinder the Performance of the Prefetch Queue . . . . . . 267
9.5.4 Pipelining: Overlapping the Execution of Multiple Instructions . . . . . . . 267
9.5.5 Instruction Caches: Providing Multiple Paths to Memory . . . . . . . . . . . 272
9.5.6 Pipeline Hazards . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 273
9.5.7 Superscalar Operation: Executing Instructions in Parallel . . . . . . . . . . 275
9.5.8 Out-of-Order Execution . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 277
9.5.9 Register Renaming . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 277
9.5.10 VLIW Architecture . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 278
9.5.11 Parallel Processing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 279
9.5.12 Multiprocessing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 280
9.6 For More Information . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 281
10
INSTRUCTION SET ARCHITECTURE 283
10.1 The Importance of Instruction Set Design . . . . . . . . . . . . . . . . . . . . . . . . . . . . 284
10.2 Basic Instruction Design Goals . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 285
10.2.1 Choosing Opcode Length . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 287
10.2.2 Planning for the Future . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 289
10.2.3 Choosing Instructions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 289
10.2.4 Assigning Opcodes to Instructions . . . . . . . . . . . . . . . . . . . . . . . . . 290
10.3 The Y86 Hypothetical Processor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 291
10.3.1 Y86 Limitations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 291
10.3.2 Y86 Instructions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 291
10.3.3 Operand Types and Addressing Modes on the Y86 . . . . . . . . . . . . 293
10.3.4 Encoding Y86 Instructions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 293
10.3.5 Examples of Encoding Y86 Instructions . . . . . . . . . . . . . . . . . . . . . 296
10.3.6 Extending the Y86 Instruction Set . . . . . . . . . . . . . . . . . . . . . . . . . 300
10.4 Encoding 80x86 Instructions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 301
10.4.1 Encoding Instruction Operands . . . . . . . . . . . . . . . . . . . . . . . . . . . 303
10.4.2 Encoding the add Instruction . . . . . . . . . . . . . . . . . . . . . . . . . . . . 310
10.4.3 Encoding Immediate (Constant) Operands on the x86 . . . . . . . . . . . 314
10.4.4 Encoding 8-, 16-, and 32-Bit Operands . . . . . . . . . . . . . . . . . . . . . 315
10.4.5 Encoding 64-Bit Operands . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 316
10.4.6 Alternate Encodings for Instructions . . . . . . . . . . . . . . . . . . . . . . . . 316
10.5 Implications of Instruction Set Design to the Programmer . . . . . . . . . . . . . . . . . 317
10.6 For More Information . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 317
11
MEMORY ARCHITECTURE AND ORGANIZATION 319
11.1 The Memory Hierarchy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 319
11.2 How the Memory Hierarchy Operates . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 322
11.3 Relative Performance of Memory Subsystems . . . . . . . . . . . . . . . . . . . . . . . . . 324
xiii
11.4 Cache Architecture . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 326
11.4.1 Direct-Mapped Cache . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 326
11.4.2 Fully Associative Cache . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 327
11.4.3 n-Way Set Associative Cache . . . . . . . . . . . . . . . . . . . . . . . . . . . . 328
11.4.4 Cache-Line Replacement Policies . . . . . . . . . . . . . . . . . . . . . . . . . . 329
11.4.5 Cache Write Policies . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 330
11.4.6 Cache Use and Software . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 331
11.5 NUMA and Peripheral Devices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 332
11.6 Virtual Memory, Memory Protection, and Paging . . . . . . . . . . . . . . . . . . . . . . 332
11.7 Writing Software That Is Cognizant of the Memory Hierarchy . . . . . . . . . . . . . 336
11.8 Runtime Memory Organization . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 338
11.8.1 Static and Dynamic Objects, Binding, and Lifetime . . . . . . . . . . . . . 339
11.8.2 The Code, Read-Only, and Constant Sections . . . . . . . . . . . . . . . . . 340
11.8.3 The Static Variables Section . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 341
11.8.4 The Storage Variables Section . . . . . . . . . . . . . . . . . . . . . . . . . . . 341
11.8.5 The Stack Section . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 342
11.8.6 The Heap Section and Dynamic Memory Allocation . . . . . . . . . . . . 342
11.9 For More Information . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 348
12
INPUT AND OUTPUT 349
12.1 Connecting a CPU to the Outside World . . . . . . . . . . . . . . . . . . . . . . . . . . . . 350
12.2 Other Ways to Connect Ports to the System . . . . . . . . . . . . . . . . . . . . . . . . . . 353
12.3 I/O Mechanisms . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 354
12.3.1 Memory-Mapped I/O . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 354
12.3.2 I/O-Mapped Input/Output . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 355
12.3.3 Direct Memory Access . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 355
12.4 I/O Speed Hierarchy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 356
12.5 System Buses and Data Transfer Rates . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 357
12.5.1 Performance of the PCI Bus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 359
12.5.2 Performance of the ISA Bus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 359
12.5.3 The AGP Bus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 360
12.6 Buffering . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 360
12.7 Handshaking . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 361
12.8 Timeouts on an I/O Port . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 362
12.9 Interrupts and Polled I/O . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 363
12.10 Protected-Mode Operation and Device Drivers . . . . . . . . . . . . . . . . . . . . . . . 364
12.10.1 The Device Driver Model . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 365
12.10.2 Communication with Device Drivers . . . . . . . . . . . . . . . . . . . . . . 365
12.11 For More Information . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 366
13
COMPUTER PERIPHERAL BUSES 367
13.1 The Small Computer System Interface . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 367
13.1.1 Limitations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 368
13.1.2 Improvements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 369
13.1.3 SCSI Protocol . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 370
13.1.4 SCSI Advantages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 372
xiv
13.2 The IDE/ATA Interface . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 372
13.2.1 The SATA Interface . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 374
13.2.2 Fibre Channel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 374
13.3 The Universal Serial Bus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 374
13.3.1 USB Design . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 374
13.3.2 USB Performance . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 376
13.3.3 Types of USB Transmissions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 377
13.3.4 USB-C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 379
13.3.5 USB Device Drivers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 380
13.4 For More Information . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 380
14
MASS STORAGE DEVICES AND FILESYSTEMS 381
14.1 Disk Drives . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 381
14.1.1 Floppy Disk Drives . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 382
14.1.2 Hard Drives . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 382
14.1.3 RAID Systems . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 388
14.1.4 Optical Drives . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 389
14.1.5 CD, DVD, and Blu-ray Drives . . . . . . . . . . . . . . . . . . . . . . . . . . . . 390
14.2 Tape Drives . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 392
14.3 Flash Storage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 393
14.4 RAM Disks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 395
14.5 Solid-State Drives . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 395
14.6 Hybrid Drives . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 396
14.7 Filesystems on Mass Storage Devices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 396
14.7.1 Sequential Filesystems . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 397
14.7.2 Efficient File Allocation Strategies . . . . . . . . . . . . . . . . . . . . . . . . . 399
14.8 Writing Software That Manipulates Data on a Mass Storage Device . . . . . . . . . 407
14.8.1 File Access Performance . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 407
14.8.2 Synchronous and Asynchronous I/O . . . . . . . . . . . . . . . . . . . . . . . 409
14.8.3 The Implications of I/O Type . . . . . . . . . . . . . . . . . . . . . . . . . . . . 409
14.8.4 Memory-Mapped Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 410
14.9 For More Information . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 411
15
MISCELLANEOUS INPUT AND OUTPUT DEVICES 413
15.1 Exploring Specific PC Peripheral Devices . . . . . . . . . . . . . . . . . . . . . . . . . . . . 413
15.1.1 The Keyboard . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 414
15.1.2 The Standard PC Parallel Port . . . . . . . . . . . . . . . . . . . . . . . . . . . . 415
15.1.3 Serial Ports . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 417
15.2 Mice, Trackpads, and Other Pointing Devices . . . . . . . . . . . . . . . . . . . . . . . . 417
15.3 Joysticks and Game Controllers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 419
15.4 Sound Cards . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 419
15.4.1 How Audio Interface Peripherals Produce Sound . . . . . . . . . . . . . . 420
15.4.2 The Audio and MIDI File Formats . . . . . . . . . . . . . . . . . . . . . . . . . 422
15.4.3 Programming Audio Devices . . . . . . . . . . . . . . . . . . . . . . . . . . . . 423
15.5 For More Information . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 424
xv
AFTERWORD: THINKING LOW-LEVEL, WRITING HIGH-LEVEL 425
A
ASCII CHARACTER SET 427
GLOSSARY 431
INDEX 443
xvi
ACKNOWLEDGMENTS
Many people have read and reread every word, symbol, and punctuation
mark in this book in order to produce a better result. Kudos to the follow-
ing people for their careful work on the second edition: development editor
Athabasca Witschi, copyeditor/production editor Rachel Monaghan, and
proofreader James Fraleigh.
I would like to take the opportunity to graciously thank Anthony
Tribelli, a longtime friend, who went well beyond the call of duty when
doing a technical review of this book. He pulled every line of code out
of this book (including snippets) and compiled and ran it to make sure it
worked properly. His suggestions and opinions throughout the technical
review process have dramatically improved the quality of this work.
Of course, I would also like to thank all the countless readers over the
years who’ve emailed suggestions and corrections, many of which have
found their way into this second edition.
2 Chapter 1
assembly language involves learning two related subjects: machine organi-
zation, and programming in assembly language. The real benefits of learn-
ing assembly language come from the machine organization component.
Thus, this book focuses solely on machine organization so you can learn to
write great code without the overhead of also learning assembly language.
Machine organization is a subset of computer architecture that covers
low-level data types, internal CPU organization, memory organization and
access, low-level machine operations, mass storage organization, peripher-
als, and how computers communicate with the rest of the world. This book
concentrates on those parts of computer architecture and machine organi-
zation that are visible to the programmer or are helpful for understanding
why system architects chose a particular system design. The goal of learning
machine organization, and of this book, is not to enable you to design your
own CPU or computer system, but to equip you to make the most efficient
use of existing computer designs. Let’s do a quick run-through of the spe-
cific topics we’ll cover.
Chapters 2, 4, and 5 deal with basic computer data representation—
how computers represent signed and unsigned integer values, characters,
strings, character sets, real values, fractional values, and other numeric and
non-numeric quantities. Without a solid grasp of how computers represent
these various data types internally, it’ll be difficult for you to understand
why some operations that use these data types are so inefficient.
Chapter 3 discusses binary arithmetic and bit operations used by most
modern computer systems. It also offers several insights into how you can
write better code by using arithmetic and logical operations in ways not
normally taught in beginning programming courses. Learning these kinds
of standard “tricks” is part of how you become a great programmer.
Chapter 6 introduces memory, discussing how the computer accesses
its memory and describing characteristics of memory performance. This
chapter also covers various machine code addressing modes, which CPUs use
to access different types of data structures in memory. In modern applica-
tions, poor performance often occurs because the programmer, unaware of
the ramifications of memory access in their programs, creates bottlenecks.
Chapter 6 addresses many of these ramifications.
Chapter 7 returns to data types and representation by covering compos-
ite data types and memory objects: pointers, arrays, records, structures, and
unions. All too often, programmers use large composite data structures
without even considering the memory and performance impact of doing so.
The low-level description of these high-level composite data types will make
clear their inherent costs, so you can use them sparingly and wisely.
Chapter 8 discusses Boolean logic and digital design. This chapter
provides the mathematical and logical background you’ll need to under-
stand the design of CPUs and other computer system components. In par-
ticular, this chapter discusses how to optimize Boolean expressions, such
as those found in common high-level programming language statements
like if and while.
4 Chapter 1
At the same time, this book is not language specific; its concepts tran-
scend whatever programming language(s) you’re using. Furthermore, this
book does not assume that you use or know any particular language. To
help make the examples more accessible, the programming examples rotate
among several languages. This book explains exactly how the example code
operates so that even if you’re unfamiliar with the specific programming
language, you’ll be able to understand its operation by reading the accom-
panying description.
This book uses the following languages and compilers in various examples:
We could easily add dozens of items to this list. Some programmers, for
example, may feel that great code must be portable, must follow a given set
of programming style guidelines, or must be written in a certain language
(or not be written in a certain language). Some may feel that great code
must be written as simply as possible, while others believe that it must be
Two different programs do not have to follow the same set of rules (that
is, they need not possess the same set of characteristics) in order for both
to be great. In one environment, the priority might be producing code
that’s portable across different CPUs and operating systems. In a different
environment, efficiency (speed) might be the primary goal, and portability
might not be an issue. Neither program would qualify as great according
to the rules of the other, but as long as the software consistently follows the
guidelines established for that particular program, you can argue that it is
an example of great code.
6 Chapter 1
learn 80x86 assembly language on a PC, because there are lots of great
software tools for learning Intel Architecture assembly language (for
example, HLA) that simply don’t exist on other platforms. The point
of learning assembly language here is not to write assembly code, but
to learn the assembly paradigm. If you know 80x86 assembly language,
you’ll have a good idea of how other CPUs (such as the ARM or the
IA-64 family) operate.
Study advanced computer architecture. Machine organization is
a subset of computer architecture, but space limitations prevent full
coverage of both in this book. While you may not need to know how to
design your own CPUs, studying computer architecture might teach you
something omitted here.
And Zaide:—
The music totters under the weight of such words as these. The
songs, which follow one after the other, are indeed well conceived
and carefully executed, and even for the most part characteristic;
but their characterisation is all external, and when suggested by
different touches in the text it is rarely happy. There is a want of
harmony and balance, as well as of impulse and warmth, so that the
really beautiful separate ideas have no proportionate effect. It is
remarkable that these songs are all too long, and their cadenzas are
especially tedious, as if quantity was to make up for quality. Further
adherence to the antiquated aria form is particularly noticeable; as if,
when the musical construction no longer proceeded directly from the
ZAIDE—QUARTET. impulse of the dramatic situation, the old forms
involuntarily asserted their sway. The quartet (16) in which the
musical and dramatic interest is, as it were, concentrated, contrasts
very favourably with the solo songs. The dramatis personæ are all
happily characterised; the Sultan, implacable in his anger, Gomaz
seeking to console Zaide, who, in her turn, strives to purchase his
life by the sacrifice of her own, and Aiazim, overcome with grief at
being unable to see a way out of the complications that he himself
has brought about. Here too we have a conflict of opposing
emotions faithfully and accurately delineated, and all directed to one
central point; it is, in fact, a situation which fulfils all the essential
conditions of musical representation. Here then Mozart is in his
element. The different characters are drawn with a steady hand,
every emotion is definitely and accurately expressed, and the
elements thus gained are employed as materials for a construction
which is as faithful to the laws of musical organisation as to the
requirements of the dramatic situation. The quartet thus fulfils the
two essential conditions of dramatic music, and reveals itself as a
consistent and harmonious piece of work, the separate motifs of
which are beautiful and expressive, while the interest is kept alive by
alternation and climax, and a vivid dramatic picture is produced by
the artistic treatment of musical forms. The grouping of the voices in
manifold variety of combination displays, as if on a ground plan, a
symmetrical, well-disposed musical edifice. As they proceed they
develop out of the simplest situations the most varied shades of
sentiment, so that the music carries into the innermost recesses of
the mind and heart what the words have merely hinted at. Even the
actual musical formulas, such as the entry of the voices in imitation,
produce, in the right place, such a direct and vivid effect that they
appear to have been invented for the special case. As to the main
conception on which the construction of the quartet rests, it might, if
the violent rage of the Sultan were considered as the chief point,
have been made more passionate and agitated without overstepping
truth of expression; but Mozart has in preference emphasised the
COURT SERVICE IN more fervid and reserved emotions of the other
SALZBURG.
characters, to which the expression of anger must
be subordinated. This conception has perhaps been suggested by
the greater ease which it afforded for the introduction of the
necessary reconciliation of the characters; partly, also, a more quiet
and contained piece might appear to be of better effect after so
many lively and agitated songs; it is certain, however, that it was the
conception most in accordance with Mozart's nature as an artist.
Equally in accord with the situation, but not by any means so deep
and expressive, is the terzet (8) which brings the first act to a
conclusion. In this there is no conflict of sentiment; Zaide, Gomaz
and Alazim are happy in the feeling of mutual love and friendship,
and in the hope of a speedy deliverance; the fear lest their plan of
escape should fail casts only a passing shadow on their cheerful
frame of mind. 31 The music therefore expresses content and
happiness with great tenderness and the purest melody, especially in
the first movement. The duet between Zaide and Gomaz (5), whose
love is not a stormy passion, but the devotion of two noble beings,
expresses in the most delightful manner the purity and openness of
a happy affection.
There are not wanting, either such delicate features of detail as
characterise the genuine musical dramatist. For instance, in Gomaz'
song (6), when he is divided between gratitude to Alazim and
impatience to hasten to Zaide, there is charming humour in his
confusion, particularly at the words "doch ich muss dich schnell
verlassen," and "lass dich küssen, lass dich drücken," which in no
way interferes with the more serious sentiment of the song as a
whole. The union of humour and sentiment at the close is excellent.
While the accompaniment continues the last subject, Gomaz, who
had rushed off in hot haste, turns back, and sings once more with
heartfelt emotion: "Herr und Freund, wie dank' ich dir!" There is a
pretty touch in Osmin's air (11) where the purely musical return to
the theme is used to express recurring bursts of hearty laughter.
The workmanship of the opera, both as regards the treatment of
ZAIDE— the voices and of the orchestra, is, as might be
ORCHESTRA.
expected, thorough and sure. The orchestra
deserves special notice. We find only the instruments in use at
Salzburg, and the wind instruments are sparingly employed. The
flutes and oboes generally alternate, but they are together and in
conjunction with bassoons and horns in the quartet(16) and in one
of the Sultan's airs (12); trumpets and drums are only used in the
Sultan's raging scene (9). Many songs (1, 11, 13) are accompanied
by stringed instruments alone. The hand of a master is recognisable
throughout, in the life and movement which we follow with
unflagging interest, in the force and beauty of the sound effects, and
in the delicacy of the lights and shades. Many touches recall later
works of Mozart; but these for the most part consist in turns of
expression, in the treatment of the accompaniment, &c. One decided
reminiscence is not without interest. The quartet is introduced by a
short passage for the wind instruments, which recurs several times
in the course of the piece, whereupon the voices enter as follows:—
COURT SERVICE IN [See Page Image] where it appears in the song of
SALZBURG.
Constanze, "Traurigkeit ward mir zum Loose" (10)
in the following form:—[See Page Imge]
The alternate rendering of the subject by the voices and
accompaniment, and the alternation between the wind instruments,
give it a new charm; and it is not without intention that the
instrumentation here is less full than in the former case.
One peculiarity of this operetta is the introduction of melodrama.
J. J. Rousseau, in his production of "Pygmalion" at Lyons in 1770 and
Paris in 1775, gave the first example of a dramatic piece in which
spoken dialogue was interspersed with music in the nature of
obbligato recitatives. 32 The attempt thus to render music effective
as a means of dramatic expression was successful, although the
critics raised objections to the union of music and speech. 33
ZAIDE Independently of Rousseau's experiment, it had
MELODRAMA.
occurred to Brandes in 1772 at Weimar to adapt
Gerstenberg's cantate "Ariadne" as a melodrama for his wife, who
was an excellent actress, but no musician. Schweitzer undertook the
composition, but owing to the interruption caused by his "Alceste"
he did not finish it. 34 When Brandes removed to Gotha in 1775, he
transferred "Ariadne" to Georg Benda, with whose music it was then
produced. 35 The extraordinary success it met with suggested to
Gotter the idea of writing the melodrama "Medea" for Madame
Seyler, the rival of Madame Brandes; this also was composed by
Benda. 36 The success of the melodramas was universal and
extraordinary. 37 Critics might object to the principle as they
pleased, 38 the public was not to be reasoned out of its enthusiasm,
which was shared even by many connoisseurs. 39 That the success
wras mainly due to Benda's expressive music, which all joined in
praising, admits of no doubt, and none of his successors have been
able to produce a similar effect. 40
Mozart's idea of substituting melodrama for accompanied
recitative in German opera was a kindred one (Vol. II., p. 74), and
the same idea is evident in other directions. 41 It is put into practice
in "Zaide." Two important monologues are melodramatically treated;
one by Gomaz at the beginning of the first, and another by Soliman
COURT SERVICE IN at the beginning of the second act. 42 Benda's
SALZBURG.
composition has evidently been taken as a model;
the music in short periods, often only in detached chords, follows
each turn of the monologue, and seeks to give expression to the
lightest shades of sentiment. The musical treatment is essentially
different from that of obbligato recitative, where the independent
instrumental passages are connected partly by the recitative itself,
which is always sung, partly by the harmonies of the
accompaniment; in the melodrama, on the other hand, every
passage, even the smallest, is treated as distinctly apart. In the
recitatives, again, which are sung, the lighter shades of sentiment
may be rendered by cadence, rhythm, or harmony, without the
intervention of any instrumental passages. In the melodrama this is
impossible, and in order to accentuate details, the continuity of the
dialogue must be sacrificed; another decided and almost inevitable
drawback is the dependence upon details for characterisation, which
is thereby often out of proportion. In this way, spoken dialogue loses
its chief means of effect—that is, its continuity of idea—while
nothing is gained for musical unity, which ought to make up for all
deficiencies by the steady maintenance of a sustained mood. For,
impelled as Mozart might be by his nature to gather into a whole the
shattered members of this musical representation by means of
rhythmical combinations and harmonic progressions, this was only
possible to a limited degree, and musical construction in its proper
sense can only exist in those few places where the music is
independent of the melodrama. The main point, however, cannot be
denied, which is that the words and the music are not here so
blended that each part is richly repaid for what it sacrifices by its
union with the other, but that each is continually asserting itself in
opposition to the other, so that both are in fact the losers. To
It is particularly to be regretted that the original words for these
melodramatic scenes have not been printed. The alterations in
Soliman's monologue are not so essential, but Gomaz's monologue is
entirely transformed. In the original text he was absorbed by his
unpleasant position; when he prays for refreshing slumber, and the
music represents his repeated starting up from rest, the altered
version puts love-ravings for Zaide into his mouth.
ZAIDE— To this may be added the great difficulty of
MELODRAMA.
satisfying the requirements of music, together
with those of declamatory speech, and of filling the pauses with
suitable gestures and movements, the amount of histrionic art
necessary being rarely possessed by singers. Benda's melodramas
were written for distinguished actresses, whose forte lay in their
declamation and action; the situations were selected with this view,
the dialogue was constructed in accordance with it; in fact, each
scene was self-contained, not incorporated as a component part of a
greater whole. Objections of this kind must have acted upon Mozart
at a later time; at all events, he never again employed melodrama,
not even in the "Zauberflote," when the occasion seemed ready to
hand. It was nevertheless often introduced into operas—and partially
also into plays—with very good effect. But the effect relies chiefly
either on the material impressions of sound or upon the delicate and
intellectual treatment of the musical interludes, suggesting familiar
ideas, sentiments, or fancies, which exist in the minds of the
speakers, though they are incapable of expression in speech. 43
These are certainly admirable points in their place, but they can
scarcely serve as organising principles in a work of art; the
melodrama must be content to take its place as a subordinate and
connecting member if it is to have its true effect.
Mozart never took up this opera again, and he was right. It could
only have been rendered fit for the stage by complete
reconstruction. The first act, however graceful the music may be,
has too little variety in its treatment and tone to gain favour on the
stage; the second is, as we have seen, barely tolerable. After the
composition of the "Entführung," "Zaide" was heard of no more,
partly on account of the similarity of subject and accessories, partly
because it was so far surpassed in every respect that it could not fail
to fall henceforth into oblivion. 44
CHAPTER XXII. "IDOMENEO."
ALTHOUGH in his earlier years Mozart's career had, as we have
IDOMENEO. seen, been hindered by the circumstances to
which he was forced to succumb at Salzburg, yet the severe
discipline to which he was subjected must have been in many
respects useful during his period of education. Since his return from
his travels, however, his Salzburg surroundings were utterly
oppressive and distasteful to him. His time of training was over;
what he now required was freedom, work worthy of his powers, and
the means of producing all that he was able and willing to produce.
But of all this Salzburg could give nothing, and want of appreciation
and mistrust, in addition to external obstacles, almost caused Mozart
to lose heart and spirit, and throw up his post. His longing looks
were naturally turned in whatever direction deliverance might seem
to lie, and he considered it a fortunate circumstance when he was
commissioned to write the opera for the Carnival of 1781 at Munich.
The interest he had excited in Karl Theodor and his consort rendered
it comparatively easy for Mozart's friends among the court singers
and musicians to direct the choice so that it should fall on him; the
Archbishop had promised leave of absence too distinctly to be able
to draw back, nor would his many obligations to the Bavarian court
have rendered a refusal possible. An entirely new opera was desired
on this occasion, and the Abbot Giambatt. Varesco, who had been
court chaplain at Salzburg since 1766, was commissioned to write
the libretto; he could take counsel with Mozart, who knew the
Munich company well, and by obeying his suggestions make the text
quite according to his mind, so that a work not unworthy of the
brilliant fame of the Munich Opera might be expected. When a
translation of the text was called for later, Mozart proposed his old
CHARACTERS AND friend Schachtner, who was employed to do it;
PLOT.
and Leopold Mozart could write with some pride
to Breitkopf (August 10,1781): "It is remarkable that every part of
the work is by persons residing in Salzburg: the poetry by the court
chaplain, Abbate Varesco, the music by my son, and the German
translation by Herr Schachtner."
Varesco's "Idomeneo" was modelled on the opera "Idomenée,"
written by Danchet and composed by Campra, first performed in
1712 and revived in 1731. 1
The dramatis personæ are as follows:—[See Page Images]
The plot is briefly as follows:—
Idomeneo, King of Crete, after the siege of Troy, has wandered a
long way from his home, where his son, Idamante, grown to man's
estate during his absence, awaits him in filial love. Electra, daughter
of Agamemnon, banished by the people of Argus on account of the
matricide of Orestes, has taken refuge with Idamante, and becomes
deeply enamoured of him. But Ilia, daughter of Priam, who, with
other Trojan captives, has been sent to Crete by Idomeneo, has
conceived a passion for Idamante, which he returns. At the opening
of the opera we find Ilia struggling with her love for the enemy of
her fatherland (aria, 2). Idamante approaches her joyfully. He has
received tidings that his father's fleet is in sight, and has sent his old
confidant, Arbace, to bring more exact intelligence. On this joyful
day he gives freedom to all the Trojan captives, and declares his love
for Ilia, which she, although reluctantly, rejects; whereupon he
bewails himself in an aria (3). The captive Trojans are led in and
IDOMENEO. loosed from their fetters, giving occasion for a
joyful chorus. Electra comes and expresses dissatisfaction at the
liberation of so many enemies. Then follows Arbace with intelligence
(which is mistaken) of the shipwreck of Idomeneo. Idamante departs
overwhelmed with grief. Electra remains behind and gives vent to
her jealousy and despair in a song (aria, 5). The scene changes to
the sea-coast, and the fleet of Idomeneo is seen threatened by a
storm, and driven on to the rocks, the mariners lamenting and
beseeching aid. Neptune appears and commands the winds to
depart. Idomeneo prays for his help, but the god casts threatening
glances on him, and disappears. The sea being calmed, Idomeneo
lands and declares that, during the storm, he has vowed to sacrifice
to Neptune the first person who shall meet him on shore. He
trembles at the rashness of his vow, and anxiously looks for the
sacrifice he is to make (aria, 6). Idamante enters, having sought
solitude as ease to his grief. He offers shelter to the stranger, whom
he fails to recognise. In the course of conversation it transpires that
he is mourning for his father Idomeneo. Whereupon Idomeneo
makes himself known, but overcome by the horror of his situation,
he departs, forbidding Idamante to follow him. The latter, ignorant of
the cause, is inconsolable at his father's rejection of his proffered
love and services (aria, 8). An intermezzo of suitable character
follows the first act. The warriors of Idomeneo disembark to a march
(9), are welcomed by their wives and children, and "express their joy
in a grand figure-dance, ending with a chorus (10)."
At the beginning of the second act Idomeneo is in conversation
with Arbace. He communicates to him his fearful vow, from the
fulfilment of which he wishes to escape. Arbace represents to him
that this is impossible. But when he hears that Idamante is to be the
sacrifice, he counsels his being sent to a distant country, and that
during his banishment they should seek to appease the wrath of
Neptune. Idomeneo decides upon commanding Idamante to
accompany Electra to Argos, and there ascend the throne, and
commissions Arbace to bid him prepare for the journey. Arbace
promises obedience (aria, 11), and departs. Ilia now appears,
expresses delight at Idomeneo's safety, and, while extolling
Idamante's goodness, declares her own gratitude and submission
(aria, 12). Her warmth causes Idomeneo to suspect their love, and
his grief and confusion are thereby augmented (aria, 13). Electra,
entering, thanks him for his care. He leaves her alone, and she
expresses her joy at the fulfilment of her dearest wishes (aria, 14).
The warriors assemble in the harbour to the sound of a march (15).
Electra appears with her followers, the sea is calm, and all look
forward to a fortunate voyage (chorus, 16). Idomeneo dismisses
Idamante, who sees in this command a fresh proof of his father's
inexplicable displeasure. They express their opposing sentiments in a
terzet (17). As they prepare to embark, a terrific storm arises, and a
huge sea-monster rises from the waves. This convinces Idomeneo
IDOMENEO—PLOT. that his disobedience has offended Neptune, and
he determines to die himself, and not to sacrifice the innocent. "The
storm continues to rage, the Cretans fly, and the act closes with the
expression of their fear and horror by singing and pantomimic
dancing."
Ilia opens the third act, bewailing her unhappy love (aria, 19).
Idamante surprises her, and declares his resolve to seek death in
combat with the monster who is laying waste the land; this leads to
a disclosure of her love, and the two express their happiness in a
duet (20). Idomeneo, entering with Electra, discovers them; he
cannot bring himself to acknowledge to Idamante the true cause of
his mysterious behaviour, but commands him anew to leave Crete at
once, and seek an asylum in a distant land. The various emotions of
those present are expressed in a quartet (21). Idamante having
departed, Arbace enters and announces that the people are hurrying
with the high priest at their head to demand deliverance from the
monster; Idomeneo goes to meet them, and Arbace expresses his
earnest wish for the happiness of his ruler (aria, 22). On an open
space in front of the castle the high priest appears with the
multitude; he describes the ravages of the monster, which can only
be terminated by the fulfilment of Idomeneo's vow, and demands to
know the name of the promised victim (23). When Idomeneo names
his son as the sacrifice, horror seizes the people (chorus, 24). During
a march (25) Idomeneo with his subjects enters the temple of
Neptune, and while the priests prepare for the sacrifice they offer
their solemn prayers to the god (26); cries of joy are heard from
afar, and Arbace hastens in and announces that Idamante has slain
the monster in heroic combat. Idamante is presently borne in by
priests and warriors, crowned and in white robes; he now knows his
father's vow, and satisfied as to his feelings towards him, he is ready
to fall a joyful sacrifice to the angry god (aria, 27). As Idomeneo is
in the act of striking the fatal blow, Ilia hastens in and restrains him;
she insists upon taking the place of her lover, and a tender strife
arises between them, which Idomeneo listens to with emotion,
Electra with rage and jealousy. As Ilia kneels before the altar, "a
great subterranean disturbance is heard, the statue of Neptune
totters, the high priest stands entranced before the altar, all are
amazed and motionless from fear, while a deep and majestic voice
declares the will of the gods": Idomeneo is to renounce the throne,
which Idamante is to ascend, and to be united to Ilia (28). At this
unexpected issue, Electra breaks into violent anger, and "goes off
raging"; Idomeneo arranges everything according to the divine will
(30), and expresses his grateful joy (aria, 31); Idamante is crowned
in a pantomimic ballet, during which the chorus sing a joyful
conclusion to the opera (32). 2
IDOMENEO. Varesco omitted the prologue of his original,
and reduced the five acts to the customary three. He also left out
altogether the divinities and allegorical personages, which were
somewhat prominent in the French text; and of three confidants he
retained only Arbace. For the rest he follows the progress of the plot
pretty closely, only judiciously omitting the love of Idomeneo for Ilia,
and altering the conclusion. In the original, Idomeneo, after
voluntarily raising his son to the throne, and bestowing on him the
hand of Ilia, is stricken with madness by Nemesis, and slays
Idamante with the sacrificial axe. He is then prevented from
committing suicide, but Ilia falls by her own hand. Metastasio had
weaned Italian opera from such horrors. Varesco naturally looked to
opera seria as the foundation of his adaptation, 3 but he
endeavoured at the same time to make use of the distinctive
features of French opera. This is evident in his care for variety of
scenery and machinery, in the marches and processions which occur
in every act, and in the pantomimic dances which are made
subservient to the plot. Further, the frequent introduction of the
chorus was evidently suggested by French opera, and a marked
progress displayed in the fact that the chorus was not employed
merely to heighten the pomp of the piece, but took part in the action
at critical moments, and expressed important dramatic situations.
The ensembles, too, are not placed in regular succession at the end
of the acts, without reference to the plot; they occur naturally as the
piece proceeds, and have a dramatic signification of their own. Such
movements are indeed rarely introduced, and not all the suitable
points are made use of for them; no attempt is made either to unite
the several connected points of the plot into a musical whole in the
finale, but rather each separate situation has its own independent
VARESCO'S musical treatment. 4 On the other hand, there is
LIBRETTO.
an evident intention to give the piece a tragic
tone rather than that of the then prevalent effeminate tenderness,
and to invest the characters with a psychological interest, and the
plot with natural development and climax. It must be admitted that
the success is but partial. Varesco was no poet, and the spirit of
French tragedy was not calculated to raise him to a higher sphere
than that of Italian opera. Conventionality predominates, passion
and emotion find but unnatural expression, pedantry and
exaggeration, both alike untrue, jostle each other; and the plot
hangs on such slender threads that, in spite of the strong passions
which are set in motion, it awakens no lively interest. The weak
points both of French and Italian opera are here combined; but
there are other faults belonging more especially to the latter. Such,
for example, is the giving of the part of Idamante to a male soprano,
and employing the bass voice only for the subordinate part of the
Oracle. Idomeneo is tenor, according to traditional usage, and stands
almost alone against three soprano voices, for Arbaces as second
tenor acts only as a stop-gap, and the high priest only appears once
in an obbligato recitative. Generally speaking the airs do not form
the culminating point of a dramatic situation, but only close it with a
kind of point. Frequently they have only a commonplace phrase or
an elaborated image for their subject, and all their individuality is
bestowed upon them by the music. Varesco is nevertheless a
practised verse-maker, who has employed, not without skill, the
materials he found ready to hand, but is far removed from
Metastasio's delicacy and grace.
With all its drawbacks the advantage of a settled tradition is very
visible, the external arrangements, such as the distribution among
the characters of the different pieces being carefully carried out. In
short, if "Idomeneo" is compared with Mozart's earlier operas, the
progress in the choice and treatment of material is very marked.
Such an absolute blending of the essential features of French and
Italian opera as is aimed at does not indeed take place; a
compromise between the two had first to be made. It can scarcely
be doubted that Mozart had a share in the construction of the
IDOMENEO. libretto in its more important parts, and that his
experiences in Mannheim and Paris had qualified him for the task;
but his influence was not felt in the details of the work.
When the libretto was ready, and part of the music composed,
Mozart repaired to Munich, according to custom, to finish the opera
on the spot. After a journey in the postcarriage, "which shook the
soul out of one's body," and gave him not an instant's sleep, he
wrote to his father (November 8, 1780), "Joyful and glad was my
arrival!" There was plenty to be done: the opera was to be
rehearsed, to be put on the stage, and the greater part of it was still
unwritten. How much of it he took with him ready to Munich is not
precisely known; probably the majority of the recitatives, the first
act, and perhaps part of the second; at all events his first letters
mention some of the songs as already composed.
He was able to set to work with a good heart, for he was met with
goodwill on all sides. Count Seeau was altogether at his service; and
when they sometimes fell out, and Mozart was provoked to be rude,
it was always the Count who gave way. The Elector received him
very graciously. "I had almost forgotten the best!" he writes
(November 15, 1780); "Count Seeau presented me en passant to the
Elector last Sunday, after mass; he was very gracious, and said, 'I
am glad to see you here again.' And when I said that I would
endeavour to deserve the approbation of his highness, he patted me
on the shoulder and said, 'Oh, I have no doubt it will all go very well
indeed.' A piano piano si va lontano!" The nobility, too, were
favourably disposed towards him. Cannabich introduced him to the
Countess Baumgarten, who was then the favourite of the Elector.
"My friend is everything in this house," he writes (November 13,
1780), "and I, too, now; it is the best and most useful house here
for me, and so far all has gone, and by God's help will go, well with
me." He was able, therefore, to satisfy his father as to the success of
the opera (November 24, 1780): "Have no care as to my opera, dear
father; I hope there will be no hitch. A little cabal is opposed to it,
but it will certainly come to grief, for all the best and most powerful
THE MUNICH houses of the nobility are in my favour, as well as
SINGERS.
the principal musicians, especially Cannabich." 5
There was, at all events, no opposition to be feared on the part of
the singers or the orchestra; they and Mozart were mutually anxious
to satisfy each other. But their joint labours and the requirements of
the stage showed many alterations in the text to be necessary, and
Varesco must have been often appealed to to undertake these, or to
sanction proposed changes. Among the performers for whom he
wrote, Dal Prato gave him some real trouble. Soon after his arrival
he had "a piece of roguery" to narrate (November 8, 1780): "I have
not indeed the honour of knowing the heroic Dal Prato, but
according to the description Ceccarelli must be better than he; for
sometimes his breath fails in the middle of a song, and, nota bene,
he was never on the stage, and Raaff is like a statue. Now, you may
imagine the scene in the first act, the meeting of Idomeneo and
Idamante." Further acquaintance with Dal Prato justified the reports
concerning him. "My molto amato Castrato dal Prato," he writes
(November 15,1780), "requires teaching the whole opera"; "he has
to learn his part like a child, and has not a pennyworth of method"
(November 22, 1780). He was the stumbling block also in the
quartet, which had to be rehearsed six times before it went right.
"The fellow can do nothing," complains Mozart (December 30,
1780); "his voice would not be so bad if he did not sing in his throat
and head, but he is absolutely without intonation or method or
sentiment, and sings like the best among the boys who come to be
heard when they seek admission to a choir."
He had trouble of quite another kind with his "dear old friend"
Raaff. He was exceedingly fanciful, and Mozart made many
alterations out of love for him and consideration for his gray hairs
(December 27, 1780):—
IDOMENEO. Let me tell you that Raaff is the best and
honestest man in the world, but so wedded to his old jog-trot ideas
that it is enough to drive one crazy. Consequently it is very difficult
to write for him; very easy, too, I grant you, if one is content to
write songs such as, for example, the first, "Vedrommi intorno," &c.
If you could only hear it—it is good, and it is pretty; but if I had
written it for Zonca I should have made it much better fitted to the
words. I had a good deal of trouble with him about the quartet. The
oftener I hear this quartet the more effective it appears to me, and
every one that has heard it likes it. Only Raaff thinks it will be
wanting in effect; he said to me, "Non c' è da spianar la voce." As if
there should not be more speaking than singing in a quartet! But he
knows nothing about these things. I only said, "My dear friend! if
there was only one note in this quartet that I thought should be
altered, I would do it; but I am better satisfied with it than with any
other piece in the opera, and when you have once heard it together,
you will alter your mind. I have done my best to please you with
your two songs, and so I will with the third, with good hopes of
succeeding; but as far as regards the terzets and quartets, the
composer should be allowed his own way." That satisfied him.
After the rehearsal Raaff "gladly acknowledged himself in the
wrong, and had no more doubt as to the good effect of the quartet"
(December 30, 1780). When Mozart had "shown him the paces" of
his first air, he was quite satisfied with it (November 15, 1780); and
equally so with the air in the second act (December 1, 1780):—
He is as much in love with his song as a younger man might be
with his fair lady: he sings it at night before he goes to sleep, and in
the morning as soon as he wakes. He said to Baron Viereck and Herr
von Castel, "I have always been used to have a hand in my own
part, in the recitatives as well as the songs; but I have left this just
as it was. There is not a note that does not suit me exactly." Enfin,
he is as happy as a king over it.
Some ill-natured speeches were made in spite of all this, as
Mozart writes to his father (December 27, 1780):—
À propos! Becke tells me that he wrote to you again after the last
rehearsal but one, and told you among other things that Raaffs song
in the second act is not written for the words. "They tell me," he
said, "that you know too little of Italian. Is it so?" "You should have
asked me, and then written! I can assure you that he who told you
this knows very little Italian himself." The song goes exceedingly well
with the words. One hears the "mare" and the "mare funesto;" and
THE MUNICH the passages lead up to "minacciar" in a way that
SINGERS.
thoroughly expresses "minacciar"—a threatening;
in fact, it is the finest song in the opera, and meets with universal
approval.
The two other male vocalists belonged to the old Munich opera.
"Honest old Panzacchi" had been an excellent singer and a good
actor in his time, but his best days were over; and Valesi, too, who
had a well-deserved reputation as a tenor, had almost given up the
stage, and devoted himself to teaching. L. Mozart had reason,
therefore, to write (November 11,1780): "What you tell me of your
vocalists is sad, and shows that everything must depend on the
composition."
There were no difficulties this time with the female vocalists. Both
the Wendlings were friendly and amenable—they went Mozart's way,
and were contented with everything he did. "Madame Dorothea
Wendling is arci-contentissima with her scena, and wanted to hear it
three times over,', he wrote home (November 8,1780), and they
were quite in accord about the second song. "Lisel Wendling," he
wrote soon after (November 15, 1780), "sang her two songs half-a-
dozen times; she is thoroughly pleased; I have it from a third person
that both the Wendlings have praised their songs very highly."
Mozart kept up with great industry the work of rehearsing and
composing (a song for Schikaneder was composed meanwhile, Vol.
II., p. 102), although he was suffering from a severe cold. The
homely remedies which his father ordered brought some alleviation
Welcome to our website – the ideal destination for book lovers and
knowledge seekers. With a mission to inspire endlessly, we offer a
vast collection of books, ranging from classic literary works to
specialized publications, self-development books, and children's
literature. Each book is a new journey of discovery, expanding
knowledge and enriching the soul of the reade
Our website is not just a platform for buying books, but a bridge
connecting readers to the timeless values of culture and wisdom. With
an elegant, user-friendly interface and an intelligent search system,
we are committed to providing a quick and convenient shopping
experience. Additionally, our special promotions and home delivery
services ensure that you save time and fully enjoy the joy of reading.
textbookfull.com