diff --git a/20-codegen.tex b/20-codegen.tex index fb31e57..ef0aeec 100644 --- a/20-codegen.tex +++ b/20-codegen.tex @@ -1119,7 +1119,7 @@ \subsection{RISC-V 汇编}\label{RV-asm-intro} 下面的代码是一个基础的 RISC-V 汇编程序:(我们会对每个语法逐一进行解释) \begin{lstlisting} - .section text + .text .globl print .type print,@function print: @@ -1132,18 +1132,19 @@ \subsection{RISC-V 汇编}\label{RV-asm-intro} .Lfunc_end0: .size print, .Lfunc_end0-print - .section data + .section .data .globl a + .p2align 2 a: .word 1 - .section rodata + .section .rodata .L.str: .asciz "%s" .size .L.str, 3 \end{lstlisting} \begin{itemize} - \item \texttt{.section } 表示从此处开始到下一个 + \item \texttt{.section .} 或者 \texttt{.} 允许 label 在全局被访问(其他汇编文件可以使用全局的标签), 通常用于函数及变量。 + \item \texttt{.p2align } 表示下一个数据的对齐方式,保证对齐到 2 的 alignment 次幂。 + 其一般放在一个 label 之前,通常用于全局变量的对齐,RISC-V 汇编中存在等价写法 \texttt{.align }。 + RISC-V CPU 在访问内存的时候,要求内存地址是对齐的。例如 \texttt{lw} 指令要求 + 内存地址是 4 的倍数,\texttt{lh} 指令要求内存地址是 2 的倍数。 + 一般来说,load/store 指令的对齐要求与数据大小一致。 \item \texttt{.type , } 是可选的,用于表明符号的类型。 通常会利用 \texttt{.type} 来提升代码可读性。 \item \texttt{