5. "Binary executable" code sometimes isn't. Consider th e DECSS.EXE
file that is the subject of the instant litigation. This file
contains a program expressed as machine instructions directly
executable by a Pentium processor. It also includes "system calls",
specific to the Microsoft Windows operating system , to perform
input/output operations. If this file were downloaded to a Sun SPARC
workstation running Unix, or a PowerPC running the Macintosh operating
system, it would not be directly executable. But all is not lost.
The SPARC or PowerPC owner could c onstruct a Pentium emulator program
to simulate the operation of the Pentium processor. Such programs are
commonplace; in fact they are a necessary step in the development of
any new processor architecture. He or she would also need to build a
small portion of a Windows emulator in order to handle the Windows
system calls. At that point, DECSS.EXE could be executed by the
emulator program. An alternative approach would be to build a
translator program to convert Pentium instructions to SPARC or Pow erPC
native instructions. Again, this is a well -known technique in
computer science and not technically difficult. DECSS.EXE would then
be the input, or source code, for the emulator or translator program.
6. Executable binary code has much of the same expressive content as
code written in a symbolic language, be it assembly language or a
higher level language such as C or Lisp. Appendix A shows a small C
program for computing 5 factorial (the product of the integers from 1
to 5). Appendix B shows the assembler language output produced by gcc
version 2.95.3 on a Sun UltraSparc 170 running the Solaris operating
system. Appendix C is a dump of the binary output file produced by
the assembler. (The values are actually displayed in hexadecimal,
which is a more compact form of binary.) Appendix D is the result of
disassembling the binary file, going back to symbolic assembler
language code. Note that line number 20 in Appendix D contains an
integer compare instruction, "cmp %o0, 5". The equivalent hexade cimal
form is also shown: it is 80a22005. Appendix C shows this same
sequence in the binary file, mid -way through the line labeled 0000220.
The same instruction, "cmp %o0, 5", also appears in Appendix B, two
lines after the label .LL3. And the equivalent in the C code of
Appendix A is the sequence "i<6". The fact that the constant is 6 in
the C code and 5 in the assembly language code is the sort of thing
one can learn only by looking at the assembly language cod e, or the
binary file that results from it. (The reason for the difference, 5
vs. 6, has to do with the particular strategy used by the gcc compiler
to implement the FOR loop.)
The lessons that should be drawn from the above are:
1) All computer code is human readable. Some forms are simply more
convenient to read than others.
2. All computer code is expressive. Many of the ideas expressed in C
code are also expressed in the assembly language code that results
from compiling that C code, and again in the binary machine language
that is the output of the assembler. Some content may be lost, e.g.,
source code comments are typically not preserved in object code,
although variable names may be. But some ideas that are only implicit
in the source code may be made more apparent in the object code, such