瀏覽代碼

finished update to ch. 2

Jeremy Siek 4 年之前
父節點
當前提交
6bfdcdcb55
共有 1 個文件被更改,包括 35 次插入36 次删除
  1. 35 36
      book.tex

+ 35 - 36
book.tex

@@ -2045,8 +2045,8 @@ $\Rightarrow$
 &
 &
 \begin{minipage}{0.4\textwidth}
 \begin{minipage}{0.4\textwidth}
 \begin{lstlisting}
 \begin{lstlisting}
-movq $10 x
-addq $32 x
+movq $10, x
+addq $32, x
 \end{lstlisting}
 \end{lstlisting}
 \end{minipage}
 \end{minipage}
 \end{tabular} \\
 \end{tabular} \\
@@ -2068,7 +2068,7 @@ $\Rightarrow$
 &
 &
 \begin{minipage}{0.4\textwidth}
 \begin{minipage}{0.4\textwidth}
 \begin{lstlisting}
 \begin{lstlisting}
-addq $10 x
+addq $10, x
 \end{lstlisting}
 \end{lstlisting}
 \end{minipage}
 \end{minipage}
 \end{tabular} \\
 \end{tabular} \\
@@ -2099,7 +2099,7 @@ $\Rightarrow$
 \begin{minipage}{0.4\textwidth}
 \begin{minipage}{0.4\textwidth}
 \begin{lstlisting}
 \begin{lstlisting}
 callq read_int
 callq read_int
-movq %rax |$\itm{lhs}$|
+movq %rax, |$\itm{lhs}$|
 \end{lstlisting}
 \end{lstlisting}
 \end{minipage}
 \end{minipage}
 \end{tabular} \\
 \end{tabular} \\
@@ -2121,6 +2121,7 @@ interesting code in this pass. Use the \key{interp-tests} function
 your passes on the example programs.
 your passes on the example programs.
 \end{exercise}
 \end{exercise}
 
 
+
 \section{Assign Homes}
 \section{Assign Homes}
 \label{sec:assign-r1}
 \label{sec:assign-r1}
 
 
@@ -2129,18 +2130,18 @@ $\text{x86}^{*}_0$ programs that no longer use program variables.
 Thus, the \key{assign-homes} pass is responsible for placing all of
 Thus, the \key{assign-homes} pass is responsible for placing all of
 the program variables in registers or on the stack. For runtime
 the program variables in registers or on the stack. For runtime
 efficiency, it is better to place variables in registers, but as there
 efficiency, it is better to place variables in registers, but as there
-are only 16 registers, some programs must necessarily place some
-variables on the stack. In this chapter we focus on the mechanics of
-placing variables on the stack. We study an algorithm for placing
-variables in registers in Chapter~\ref{ch:register-allocation-r1}.
+are only 16 registers, some programs must necessarily resort to
+placing some variables on the stack. In this chapter we focus on the
+mechanics of placing variables on the stack. We study an algorithm for
+placing variables in registers in
+Chapter~\ref{ch:register-allocation-r1}.
 
 
 Consider again the following $R_1$ program.
 Consider again the following $R_1$ program.
 % s0_20.rkt
 % s0_20.rkt
 \begin{lstlisting}
 \begin{lstlisting}
-(program ()
-  (let ([a 42])
-    (let ([b a])
-      b)))
+(let ([a 42])
+  (let ([b a])
+    b))
 \end{lstlisting}
 \end{lstlisting}
 For reference, we repeat the output of \code{select-instructions} on
 For reference, we repeat the output of \code{select-instructions} on
 the left and show the output of \code{assign-homes} on the right.
 the left and show the output of \code{assign-homes} on the right.
@@ -2152,32 +2153,30 @@ this example, we assign variable \code{a} to stack location
 \begin{tabular}{l}
 \begin{tabular}{l}
   \begin{minipage}{0.4\textwidth}
   \begin{minipage}{0.4\textwidth}
 \begin{lstlisting}[basicstyle=\ttfamily\footnotesize]
 \begin{lstlisting}[basicstyle=\ttfamily\footnotesize]
-(program ((locals . (a b)))
- ((start . 
-   (block ()
-    (movq (int 42) (var a))
-    (movq (var a) (var b))
-    (movq (var b) (reg rax))
-    (jmp conclusion)))))
+locals: a b
+start: 
+    movq $42, a
+    movq a, b
+    movq b, %rax
+    jmp conclusion
 \end{lstlisting}
 \end{lstlisting}
 \end{minipage}
 \end{minipage}
 {$\Rightarrow$}
 {$\Rightarrow$}
 \begin{minipage}{0.4\textwidth}
 \begin{minipage}{0.4\textwidth}
 \begin{lstlisting}[basicstyle=\ttfamily\footnotesize]
 \begin{lstlisting}[basicstyle=\ttfamily\footnotesize]
-(program ((stack-space . 16))
- ((start .
-   (block ()
-    (movq (int 42) (deref rbp -8))
-    (movq (deref rbp -8) (deref rbp -16))
-    (movq (deref rbp -16) (reg rax))
-    (jmp conclusion)))))
+stack-space: 16
+start:
+    movq $42, -8(%rbp)
+    movq -8(%rbp), -16(%rbp)
+    movq -16(%rbp), %rax
+    jmp conclusion
 \end{lstlisting}
 \end{lstlisting}
 \end{minipage}
 \end{minipage}
 \end{tabular} \\
 \end{tabular} \\
 
 
 In the process of assigning variables to stack locations, it is
 In the process of assigning variables to stack locations, it is
 convenient to compute and store the size of the frame (in bytes) in
 convenient to compute and store the size of the frame (in bytes) in
-the $\itm{info}$ field of the \key{program} node, with the key
+the $\itm{info}$ field of the \key{Program} node, with the key
 \code{stack-space}, which will be needed later to generate the
 \code{stack-space}, which will be needed later to generate the
 procedure conclusion.  Some operating systems place restrictions on
 procedure conclusion.  Some operating systems place restrictions on
 the frame size. For example, Mac OS X requires the frame size to be a
 the frame size. For example, Mac OS X requires the frame size to be a
@@ -2192,6 +2191,7 @@ mapping of variable names to homes (stack locations for now).  Use the
 \key{utilities.rkt} to test your passes on the example programs.
 \key{utilities.rkt} to test your passes on the example programs.
 \end{exercise}
 \end{exercise}
 
 
+
 \section{Patch Instructions}
 \section{Patch Instructions}
 \label{sec:patch-s0}
 \label{sec:patch-s0}
 
 
@@ -2212,13 +2212,12 @@ After the \key{assign-homes} pass, the above program has been translated to
 the following. \\
 the following. \\
 \begin{minipage}{0.5\textwidth}
 \begin{minipage}{0.5\textwidth}
 \begin{lstlisting}
 \begin{lstlisting}
-(program ((stack-space . 16))
- ((start .
-   (block ()
-     (movq (int 42) (deref rbp -8))
-     (movq (deref rbp -8) (deref rbp -16))
-     (movq (deref rbp -16) (reg rax))
-     (jmp conclusion)))))
+stack-space: 16
+start:
+    movq $42, -8(%rbp)
+    movq -8(%rbp), -16(%rbp)
+    movq -16(%rbp), %rax
+    jmp conclusion
 \end{lstlisting}
 \end{lstlisting}
 \end{minipage}\\
 \end{minipage}\\
 The second \key{movq} instruction is problematic because both
 The second \key{movq} instruction is problematic because both
@@ -2226,8 +2225,8 @@ arguments are stack locations. We suggest fixing this problem by
 moving from the source location to the register \key{rax} and then
 moving from the source location to the register \key{rax} and then
 from \key{rax} to the destination location, as follows.
 from \key{rax} to the destination location, as follows.
 \begin{lstlisting}
 \begin{lstlisting}
-   (movq (deref rbp -8) (reg rax))
-   (movq (reg rax) (deref rbp -16))
+   movq -8(%rbp), %rax
+   movq %rax, -16(%rbp)
 \end{lstlisting}
 \end{lstlisting}
 
 
 \begin{exercise}
 \begin{exercise}