<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet type="text/xsl" href="/assets/rss-20b3285f.xsl"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>标签: cod - ouuan's blog</title>
        <link>https://ouuan.moe/tag/cod</link>
        <description>标签为 cod 的文章 - ouuan 的博客</description>
        <lastBuildDate>Tue, 10 Oct 2023 15:35:55 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>zh-CN</language>
        <copyright>Copyright © 2022 - 2026 ouuan
Licensed under CC BY-SA 4.0</copyright>
        <atom:link href="https://ouuan.moe/tag/cod/feed.xml" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[Computer Organization and Design 第二章学习笔记]]></title>
            <link>https://ouuan.moe/post/2023/09/cod-2</link>
            <guid>https://ouuan.moe/post/2023/09/cod-2</guid>
            <pubDate>Tue, 10 Oct 2023 15:35:55 GMT</pubDate>
            <description><![CDATA[<p><span class="mojikumi-line-start">《</span>Computer Organization and Design RISC-V Edition: The Hardware/Software Interface (2nd Edition)<span class="mojikumi-line-end">》</span>第二章 <span class="mojikumi">“</span>Instructions: Language of the Computer<span class="mojikumi">”</span> 的学习笔记<span class="mojikumi-line-end">。</span></p>
]]></description>
            <content:encoded><![CDATA[<p><span class="mojikumi-line-start">《</span>Computer Organization and Design RISC-V Edition: The Hardware/Software Interface (2nd Edition)<span class="mojikumi-line-end">》</span>第二章 <span class="mojikumi">“</span>Instructions: Language of the Computer<span class="mojikumi">”</span> 的学习笔记<span class="mojikumi-line-end">。</span></p>

<p>主要是在讲 RISC-V<span class="mojikumi-line-end">。</span>可以参考 <a href="https://riscv.org/technical/specifications/">Specifications – RISC-V International</a><span class="mojikumi-line-start">（</span>比 x86 短多了<span class="mojikumi">）</span><span class="mojikumi-line-end">。</span></p>
<p><span class="mojikumi-line-start">（</span>P.S. 其他书我是认真看了第一章但懒得写<span class="mojikumi-line-end">，</span>这本<span class="mojikumi-line-start">（</span>如果看过 CS:APP 的话<span class="mojikumi-line-end">）</span>建议直接跳过第一章<span class="mojikumi-line-start">（</span></p>
<h2 id="registers" class="heading"><a href="#registers" class="heading-anchor" aria-label="章节： Registers" tabindex="-1"></a><span>Registers</span></h2>
<p>RISC-V (RV32) 的 register 是 32-bit 的<span class="mojikumi-line-end">，</span>而 32-bit 称作一个 word<span class="mojikumi-line-start">（</span>与 x86 不同<span class="mojikumi">）</span><span class="mojikumi-line-end">。</span></p>
<p>有 32 个 register<span class="mojikumi-line-end">，</span>用 <code>x0</code>~<code>x31</code> 来标识<span class="mojikumi-line-end">，</span>每个 register 根据其功能还有一个<span class="mojikumi-line-start">（</span>或多个<span class="mojikumi-line-end">）</span>别名<span class="mojikumi-line-end">。</span></p>
<p><code>x0</code> / <code>zero</code> 的值固定为 0<span class="mojikumi-line-end">，</span>能起到很多作用<span class="mojikumi-line-end">，</span>例如在 <code>sub</code> 中作为被减数来取负<span class="mojikumi-line-end">、</span>作为 destination 来丢弃结果<span class="mojikumi-line-end">、</span>在 conditional branch<span class="mojikumi-line-start">（</span>不接受 immediate<span class="mojikumi-line-end">）</span>中作为比较的参数<span class="mojikumi-line-end">。</span></p>
<p>其他寄存器在硬件层面上没有区别<span class="mojikumi-line-end">，</span>但有用于 procedure 的 convention<span class="mojikumi-line-end">：</span></p>
<ul>
<li>
<p><code>x1</code> / <code>ra</code> 是 return address<span class="mojikumi-line-start">（</span>call 是 <code>jal x1, foo</code><span class="mojikumi-line-end">，</span>return 是 <code>jalr x0, 0(x1)</code><span class="mojikumi">）</span><span class="mojikumi-line-end">。</span></p>
</li>
<li>
<p><code>x2</code> / <code>sp</code> 是 stack pointer<span class="mojikumi-line-end">。</span></p>
</li>
<li>
<p><code>x3</code> / <code>gp</code> 是 global pointer<span class="mojikumi-line-start">（</span>指向 static variable 的位置<span class="mojikumi">）</span><span class="mojikumi-line-end">。</span></p>
</li>
<li>
<p><code>x4</code> / <code>tp</code> 是 thread pointer<span class="mojikumi-line-end">。</span></p>
</li>
<li>
<p><code>x8</code> / <code>fp</code> 可以用作 frame pointer<span class="mojikumi-line-end">。</span></p>
</li>
<li>
<p><code>x10</code>-<code>x17</code> (<code>a0</code>-<code>a7</code>) 用来存放前 8 个参数或返回值<span class="mojikumi-line-start">（</span>一般单个返回值就是 <code>x10</code><span class="mojikumi">）</span><span class="mojikumi-line-end">。</span></p>
</li>
<li>
<p><code>x8</code>-<code>x9</code> (<code>s0</code>-<code>s1</code>), <code>x18</code>-<code>x27</code> (<code>s2</code>-<code>s11</code>) 是 (callee-)saved<span class="mojikumi-line-end">。</span></p>
</li>
<li>
<p><code>x5</code>-<code>x7</code> (<code>t0</code>-<code>t2</code>), <code>x28</code>-<code>x31</code> (<code>t3</code>-<code>t6</code>) 是 temporary (caller-saved)<span class="mojikumi-line-end">。</span></p>
</li>
</ul>
<a id="register-那么快，怎么不多来点（" name="register-那么快，怎么不多来点（" aria-hidden="true"></a>
<aside role="note" data-v-a2ab257f><div class="shadow-md rd-1 b-l-6 my-6 bg-blue-1 dark:bg-blue-9 b-blue" data-v-a2ab257f><div class="p-3 flex justify-between items-center" data-v-a2ab257f><h3 class="flex items-center gap-1 font-bold" data-v-a2ab257f><span class="text-5 i-mdi-pencil text-blue" data-v-a2ab257f></span><span class="sr-only" data-v-a2ab257f>Note: </span><span data-v-a2ab257f>register 那么快，怎么不多来点（</span></h3><!--v-if--></div><div class="overflow-auto rd-br-1 bg-card px-6 dark:bg-bghover" data-v-a2ab257f><p>限制 register 的数量有助于在硬件实现时加快电路<span class="mojikumi-line-end">，</span>从而提升 clock frequency<span class="mojikumi-line-end">。</span></p><p>并且<span class="mojikumi-line-end">，</span>register 的编号需要被编码在 instruction 中<span class="mojikumi-line-end">，</span>限制 register 的数量也可以缩短 instruction 的长度<span class="mojikumi-line-end">。</span></p></div></div></aside>
<h2 id="basic-instructions" class="heading"><a href="#basic-instructions" class="heading-anchor" aria-label="章节： Basic Instructions" tabindex="-1"></a><span>Basic Instructions</span></h2>
<h3 id="op1-op2-op-op3" class="heading"><a href="#op1-op2-op-op3" class="heading-anchor" aria-label="章节： op1 = op2 op op3" tabindex="-1"></a><span>op1 = op2 op op3</span></h3>
<p><code>add</code>, <code>sub</code>, <code>addi</code>, <code>and</code>, <code>or</code>, <code>xor</code>, <code>andi</code>, <code>ori</code>, <code>xori</code>, <code>sll</code>, <code>srl</code>, <code>sra</code>, <code>slli</code>, <code>srli</code>, <code>srai</code>, <code>slt</code>, <code>sltu</code>, <code>slti</code>, <code>sltiu</code></p>
<ul>
<li><code>add x5, x6, x7</code>: <code>x5 = x6 + x7</code></li>
<li><code>addi x5, x6, 20</code>: <code>x5 = x6 + 20</code><span class="mojikumi-line-end">，</span>其中 immediate 是 12-bit signed integer<span class="mojikumi-line-end">。</span></li>
<li><code>slt x5, x6, x7</code>: <code>x5 = x6 &#x3C; x7 ? 1 : 0</code></li>
</ul>
<a id="immediate-的妙用" name="immediate-的妙用" aria-hidden="true"></a>
<aside role="note" data-v-a2ab257f><div class="shadow-md rd-1 b-l-6 my-6 bg-blue-1 dark:bg-blue-9 b-blue" data-v-a2ab257f><div class="p-3 flex justify-between items-center" data-v-a2ab257f><h4 class="flex items-center gap-1 font-bold" data-v-a2ab257f><span class="text-5 i-mdi-pencil text-blue" data-v-a2ab257f></span><span class="sr-only" data-v-a2ab257f>Note: </span><span data-v-a2ab257f>immediate 的妙用</span></h4><!--v-if--></div><div class="overflow-auto rd-br-1 bg-card px-6 dark:bg-bghover" data-v-a2ab257f><ul>
<li><code>addi</code> 在 immediate 为负时可以做减法</li>
<li><code>addi</code> 在 immediate 为 0 时相当于 register 间的 move</li>
<li><code>xori</code> 以 -1 为 operand 可以起到 NOT 的效果</li>
</ul></div></div></aside>
<h3 id="data-transfer" class="heading"><a href="#data-transfer" class="heading-anchor" aria-label="章节： Data Transfer" tabindex="-1"></a><span>Data Transfer</span></h3>
<p>load word: <code>lw x5, 40(x6)</code>: <code>x5 = Memory[x6 + 40]</code></p>
<p>store word: <code>sw x5, 40(x6)</code>: <code>Memory[x6 + 40] = x5</code></p>
<p>half word<span class="mojikumi-line-end">、</span>byte: <code>lh</code>, <code>lhu</code>, <code>sh</code>, <code>lb</code>, <code>lbu</code>, <code>sb</code><span class="mojikumi-line-end">，</span>其中 <code>u</code> 用来决定高位补零还是符号位<span class="mojikumi-line-end">。</span></p>
<h3 id="conditional-branch" class="heading"><a href="#conditional-branch" class="heading-anchor" aria-label="章节： Conditional Branch" tabindex="-1"></a><span>Conditional Branch</span></h3>
<p><code>beq</code>, <code>bne</code>, <code>blt</code>, <code>bltu</code>, <code>bge</code>, <code>bgeu</code></p>
<p><code>blt x5, x6, 100</code>: <code>if (x5 &#x3C; x6) goto PC+100</code></p>
<a id="剩下的比较函数？" name="剩下的比较函数？" aria-hidden="true"></a>
<aside role="note" data-v-a2ab257f><div class="shadow-md rd-1 b-l-6 my-6 bg-blue-1 dark:bg-blue-9 b-blue" data-v-a2ab257f><div class="p-3 flex justify-between items-center" data-v-a2ab257f><h4 class="flex items-center gap-1 font-bold" data-v-a2ab257f><span class="text-5 i-mdi-pencil text-blue" data-v-a2ab257f></span><span class="sr-only" data-v-a2ab257f>Note: </span><span data-v-a2ab257f>剩下的比较函数？</span></h4><!--v-if--></div><div class="overflow-auto rd-br-1 bg-card px-6 dark:bg-bghover" data-v-a2ab257f><p>lt 和 gt<span class="mojikumi-line-end">、</span>ge 和 le 只需将操作数互换即可<span class="mojikumi-line-end">，</span>所以不需要额外的 instruction<span class="mojikumi-line-start">（</span>但可以有额外的 <a href="#pseudoinstructions">pseudoinstruction</a><span class="mojikumi">）</span><span class="mojikumi-line-end">。</span></p><p>lt 和 ge 结果是相反的<span class="mojikumi-line-end">，</span>在硬件上容易实现<span class="mojikumi-line-end">，</span>所以不是 lt 和 le / gt 和 ge<span class="mojikumi-line-end">。</span></p><p><code>slt</code> 则不需要 <code>sge</code><span class="mojikumi-line-end">，</span>因为将结果存下来一般只需和 0 比较 eq / ne 即可<span class="mojikumi-line-end">。</span></p></div></div></aside>
<h3 id="unconditional-branch" class="heading"><a href="#unconditional-branch" class="heading-anchor" aria-label="章节： Unconditional Branch" tabindex="-1"></a><span>Unconditional Branch</span></h3>
<p><code>jal x1, 100</code>: <code>x1 = PC+4; goto PC+100</code></p>
<p><code>jalr x1, 100(x5)</code>: <code>x1 = PC+4; goto x5+100</code></p>
<h2 id="instruction-format" class="heading"><a href="#instruction-format" class="heading-anchor" aria-label="章节： Instruction Format" tabindex="-1"></a><span>Instruction Format</span></h2>
<p>RISC-V 的 instruction 都是 32 bits 长<span class="mojikumi-line-end">，</span>有若干种不同的 instruction format<span class="mojikumi-line-end">。</span></p>
<p>其中 <span class="mojikumi">“</span>rs<span class="mojikumi">”</span> 是 register source<span class="mojikumi">，</span><wbr><span class="mojikumi-line-start">“</span>rd<span class="mojikumi">”</span> 是 register destination<span class="mojikumi">，</span><wbr><span class="mojikumi-line-start">“</span>funct<span class="mojikumi">”</span> 用作 additional opcode<span class="mojikumi-line-end">。</span></p>
<p>R-type:</p>
<div class="overflow-auto"><div class="grid grid-cols-32 min-w-150 [&amp;&gt;div]:b-footer [&amp;&gt;div]:b-2 [&amp;&gt;div]:b-r-0 [&amp;&gt;div:last-child]:b-r-2 [&amp;&gt;div]:grid [&amp;&gt;div]:justify-items-center"><div class="col-span-7"><span>funct7</span>
<span>(7 bits)</span></div><div class="col-span-5"><span>rs2</span>
<span>(5 bits)</span></div><div class="col-span-5"><span>rs1</span>
<span>(5 bits)</span></div><div class="col-span-3"><span>funct3</span>
<span>(3 bits)</span></div><div class="col-span-5"><span>rd</span>
<span>(5 bits)</span></div><div class="col-span-7"><span>opcode</span>
<span>(7 bits)</span></div></div></div>
<p>I-type<span class="mojikumi-line-end">：</span></p>
<div class="overflow-auto"><div class="grid grid-cols-32 min-w-150 [&amp;&gt;div]:b-footer [&amp;&gt;div]:b-2 [&amp;&gt;div]:b-r-0 [&amp;&gt;div:last-child]:b-r-2 [&amp;&gt;div]:grid [&amp;&gt;div]:justify-items-center"><div class="col-span-12"><span>imm[11:0]</span>
<span>(12 bits)</span></div><div class="col-span-5"><span>rs1</span>
<span>(5 bits)</span></div><div class="col-span-3"><span>funct3</span>
<span>(3 bits)</span></div><div class="col-span-5"><span>rd</span>
<span>(5 bits)</span></div><div class="col-span-7"><span>opcode</span>
<span>(7 bits)</span></div></div></div>
<p>S-type<span class="mojikumi-line-end">：</span></p>
<div class="overflow-auto"><div class="grid grid-cols-32 min-w-150 [&amp;&gt;div]:b-footer [&amp;&gt;div]:b-2 [&amp;&gt;div]:b-r-0 [&amp;&gt;div:last-child]:b-r-2 [&amp;&gt;div]:grid [&amp;&gt;div]:justify-items-center"><div class="col-span-7"><span>imm[11:5]</span>
<span>(7 bits)</span></div><div class="col-span-5"><span>rs2</span>
<span>(5 bits)</span></div><div class="col-span-5"><span>rs1</span>
<span>(5 bits)</span></div><div class="col-span-3"><span>funct3</span>
<span>(3 bits)</span></div><div class="col-span-5"><span>imm[4:0]</span>
<span>(5 bits)</span></div><div class="col-span-7"><span>opcode</span>
<span>(7 bits)</span></div></div></div>
<p>可以看出<span class="mojikumi-line-end">，</span>在不同的 format 中<span class="mojikumi-line-end">，</span>会尽量保留 rs<span class="mojikumi-line-end">、</span>rd<span class="mojikumi-line-end">、</span>opcode<span class="mojikumi-line-end">、</span>funct3 的位置不变<span class="mojikumi-line-end">，</span>以简化电路<span class="mojikumi-line-start">（</span>其中保持 opcode 位置不变对于识别 instruction format 是必要的<span class="mojikumi">）</span><span class="mojikumi-line-end">。</span></p>
<h2 id="wide-immediates-and-addresses" class="heading"><a href="#wide-immediates-and-addresses" class="heading-anchor" aria-label="章节： Wide Immediates and Addresses" tabindex="-1"></a><span>Wide Immediates and Addresses</span></h2>
<h3 id="wide-immediates" class="heading"><a href="#wide-immediates" class="heading-anchor" aria-label="章节： Wide Immediates" tabindex="-1"></a><span>Wide Immediates</span></h3>
<p>超过 12 bits 的 immediate 可以通过两条 instruction <code>lui</code> (load upper immediate) 和 <code>addi</code> load 到 register<span class="mojikumi-line-end">，</span>其中 <code>lui</code> 是 U-type<span class="mojikumi-line-end">：</span></p>
<div class="overflow-auto"><div class="grid grid-cols-32 min-w-150 [&amp;&gt;div]:b-footer [&amp;&gt;div]:b-2 [&amp;&gt;div]:b-r-0 [&amp;&gt;div:last-child]:b-r-2 [&amp;&gt;div]:grid [&amp;&gt;div]:justify-items-center"><div class="col-span-20"><span>imm[31:12]</span>
<span>(20 bits)</span></div><div class="col-span-5"><span>rd</span>
<span>(5 bits)</span></div><div class="col-span-7"><span>opcode</span>
<span>(7 bits)</span></div></div></div>
<p><code>auipc</code> 可以用来进行更大范围的 PC-relative branch<span class="mojikumi-line-end">，</span>和 <code>lui</code> 类似<span class="mojikumi-line-end">，</span>会将 PC 加上一个只有高位的 immediate 存于 register<span class="mojikumi-line-end">。</span></p>
<a id="lui-和-addi-不一定恰好是高位和低位" name="lui-和-addi-不一定恰好是高位和低位" aria-hidden="true"></a>
<aside role="note" data-v-a2ab257f><div class="shadow-md rd-1 b-l-6 my-6 bg-blue-1 dark:bg-blue-9 b-blue" data-v-a2ab257f><div class="p-3 flex justify-between items-center" data-v-a2ab257f><h4 class="flex items-center gap-1 font-bold" data-v-a2ab257f><span class="text-5 i-mdi-pencil text-blue" data-v-a2ab257f></span><span class="sr-only" data-v-a2ab257f>Note: </span><span data-v-a2ab257f><code>lui</code> 和 <code>addi</code> 不一定恰好是高位和低位</span></h4><!--v-if--></div><div class="overflow-auto rd-br-1 bg-card px-6 dark:bg-bghover" data-v-a2ab257f><p>由于 immediate 是 signed 的<span class="mojikumi-line-end">，</span>如果 <code>addi</code> 的 sign bit 是 1<span class="mojikumi-line-end">，</span>实际上是在做减法<span class="mojikumi-line-end">，</span>需要将 <code>lui</code> 的参数加一<span class="mojikumi-line-end">。</span></p></div></div></aside>
<h3 id="addressing-in-branches" class="heading"><a href="#addressing-in-branches" class="heading-anchor" aria-label="章节： Addressing in Branches" tabindex="-1"></a><span>Addressing in Branches</span></h3>
<p>branch 使用的 address 必须是偶数<span class="mojikumi-line-end">，</span>而且 branch instruction 使用了特殊的编码格式<span class="mojikumi-line-end">。</span></p>
<p>unconditional branch 使用 B-type<span class="mojikumi-line-end">，</span>和 S-type 类似<span class="mojikumi-line-end">：</span></p>
<div class="overflow-auto"><div class="grid grid-cols-32 min-w-150 [&amp;&gt;div]:b-footer [&amp;&gt;div]:b-2 [&amp;&gt;div]:b-r-0 [&amp;&gt;div:last-child]:b-r-2 [&amp;&gt;div]:grid [&amp;&gt;div]:justify-items-center"><div class="col-span-7"><span>imm[12],[10:5]</span>
<span>(7 bits)</span></div><div class="col-span-5"><span>rs2</span>
<span>(5 bits)</span></div><div class="col-span-5"><span>rs1</span>
<span>(5 bits)</span></div><div class="col-span-3"><span>funct3</span>
<span>(3 bits)</span></div><div class="col-span-5"><span>imm[4:1],[11]</span>
<span>(5 bits)</span></div><div class="col-span-7"><span>opcode</span>
<span>(7 bits)</span></div></div></div>
<p><code>jal</code> 使用 J-type<span class="mojikumi-line-end">，</span>和 U-type 类似<span class="mojikumi-line-end">：</span></p>
<div class="overflow-auto"><div class="grid grid-cols-32 min-w-150 [&amp;&gt;div]:b-footer [&amp;&gt;div]:b-2 [&amp;&gt;div]:b-r-0 [&amp;&gt;div:last-child]:b-r-2 [&amp;&gt;div]:grid [&amp;&gt;div]:justify-items-center"><div class="col-span-7"><span>imm[20],[10:5]</span>
<span>(7 bits)</span></div><div class="col-span-5"><span>imm[4:1],[11]</span>
<span>(5 bits)</span></div><div class="col-span-8"><span>imm[19:12]</span>
<span>(8 bits)</span></div><div class="col-span-5"><span>rd</span>
<span>(5 bits)</span></div><div class="col-span-7"><span>opcode</span>
<span>(7 bits)</span></div></div></div>
<p><code>jalr</code> 使用 I-type<span class="mojikumi-line-end">。</span></p>
<p>通过对 immediate 的重排<span class="mojikumi-line-end">：</span></p>
<ul>
<li>所有格式中 immediate 的符号位都在同一位<span class="mojikumi-line-end">。</span></li>
<li>I<span class="mojikumi-line-end">、</span>S<span class="mojikumi-line-end">、</span>B<span class="mojikumi-line-end">、</span>U 中 <code>imm[10:5]</code> 位置相同<span class="mojikumi-line-end">。</span></li>
<li>S<span class="mojikumi-line-end">、</span>B 中 <code>imm[4:1]</code> 位置相同<span class="mojikumi-line-end">。</span></li>
<li>I<span class="mojikumi-line-end">、</span>J 中 <code>imm[4:1]</code> 位置相同<span class="mojikumi-line-end">，</span>U<span class="mojikumi-line-end">、</span>J 中 <code>imm[19:12]</code> 位置相同<span class="mojikumi-line-end">。</span></li>
</ul>
<a id="jalr-的-format" name="jalr-的-format" aria-hidden="true"></a>
<aside role="note" data-v-a2ab257f><div class="shadow-md rd-1 b-l-6 my-6 bg-blue-1 dark:bg-blue-9 b-blue" data-v-a2ab257f><div class="p-3 flex justify-between items-center" data-v-a2ab257f><h4 class="flex items-center gap-1 font-bold" data-v-a2ab257f><span class="text-5 i-mdi-pencil text-blue" data-v-a2ab257f></span><span class="sr-only" data-v-a2ab257f>Note: </span><span data-v-a2ab257f><code>jalr</code> 的 format</span></h4><!--v-if--></div><div class="overflow-auto rd-br-1 bg-card px-6 dark:bg-bghover" data-v-a2ab257f><p><code>jalr</code> 需要读取 register<span class="mojikumi-line-end">，</span>所以当然不是 J-type<span class="mojikumi-line-end">。</span>而 RISC-V 的设计选择了不为其单独再引入一种 instruction format<span class="mojikumi-line-end">：</span></p><blockquote>
<p>Note that the JALR instruction does not treat the 12-bit immediate as multiples of 2 bytes,
unlike the conditional branch instructions. This avoids one more immediate format in hardware.
In practice, most uses of JALR will have either a zero immediate or be paired with a LUI or
AUIPC, so the slight reduction in range is not significant.<sup><a href="#user-content-fn-jalr-format" id="user-content-fnref-jalr-format" data-footnote-ref aria-describedby="footnote-label">1</a></sup></p>
</blockquote></div></div></aside>
<a id="16-bit-instructions" name="16-bit-instructions" aria-hidden="true"></a>
<aside role="note" data-v-a2ab257f><div class="shadow-md rd-1 b-l-6 my-6 bg-blue-1 dark:bg-blue-9 b-blue" data-v-a2ab257f><div class="p-3 flex justify-between items-center" data-v-a2ab257f><h4 class="flex items-center gap-1 font-bold" data-v-a2ab257f><span class="text-5 i-mdi-pencil text-blue" data-v-a2ab257f></span><span class="sr-only" data-v-a2ab257f>Note: </span><span data-v-a2ab257f>16-bit instructions</span></h4><!--v-if--></div><div class="overflow-auto rd-br-1 bg-card px-6 dark:bg-bghover" data-v-a2ab257f><p>instruction address 必须是偶数<span class="mojikumi-line-end">，</span>但不一定是 4 的倍数<span class="mojikumi-line-end">。</span>这是因为<span class="mojikumi-line-end">，</span>RISC-V 有允许 16-bit instruction 的 <span class="mojikumi">“</span><span class="mojikumi">‘</span>C<span class="mojikumi-narrow-left">’</span> Standard Extension for Compressed Instructions<span class="mojikumi">”</span><span class="mojikumi-line-end">。</span></p><blockquote>
<p>The base RISC-V ISA has fixed-length 32-bit instructions that must be naturally aligned on 32-bit
boundaries. However, the standard RISC-V encoding scheme is designed to support ISA extensions
with variable-length instructions, where each instruction can be any number of 16-bit instruction
parcels in length and parcels are naturally aligned on 16-bit boundaries. The standard compressed
ISA extension described in Chapter 16 reduces code size by providing compressed 16-bit instructions
and relaxes the alignment constraints to allow all instructions (16 bit and 32 bit) to be aligned on
any 16-bit boundary to improve code density. <sup><a href="#user-content-fn-rvc" id="user-content-fnref-rvc" data-footnote-ref aria-describedby="footnote-label">2</a></sup></p>
</blockquote></div></div></aside>
<h2 id="synchronization-in-parallelism" class="heading"><a href="#synchronization-in-parallelism" class="heading-anchor" aria-label="章节： Synchronization in Parallelism" tabindex="-1"></a><span>Synchronization in Parallelism</span></h2>
<p>在 parallel execution 中<span class="mojikumi-line-end">，</span>需要 processor 支持 atomic operation 来实现各种 synchronization<span class="mojikumi-line-end">，</span>例如 lock<span class="mojikumi-line-end">。</span></p>
<p>RISC-V 提供一对命令 <code>lr.w</code> (load-reserved word) 和 <code>sc.w</code> (store-conditional word) 来实现 <span class="mojikumi">“</span>atomically read and modify a memory location<span class="mojikumi">”</span><span class="mojikumi-line-end">：</span></p>
<ol>
<li><code>lr.w</code> 接受两个 register 作为 operand<span class="mojikumi-line-end">，</span>分别是 destination 和 address<span class="mojikumi-line-end">，</span>它单独一个命令自身的效果和 <code>lw</code> 类似<span class="mojikumi-line-end">；</span></li>
<li><code>sc.w</code> 接受三个 register 作为 operand<span class="mojikumi-line-end">，</span>后两个是 source 和 address<span class="mojikumi-line-end">，</span>若在 <code>lr.w</code> 和 <code>sc.w</code> 之间 address 处被修改过则 store 会失败<span class="mojikumi-line-end">。</span>第一个 operand 用来存放结果<span class="mojikumi-line-start">（</span>0 表示成功<span class="mojikumi-line-end">，</span>非零表示失败<span class="mojikumi">）</span><span class="mojikumi-line-end">、</span><span class="mojikumi-line-end">。</span></li>
</ol>
<p>实现 atomic swap<span class="mojikumi">：</span><wbr><span class="mojikumi-line-start">（</span>交换 <code>(x20)</code> 和 <code>x23</code><span class="mojikumi-line-end">）</span></p>
<section class="code-block relative my-6 shadow" itemprop="hasPart" itemscope itemtype="https://schema.org/SoftwareSourceCode" data-v-c675dba6><div class="h-6 items-center rd-t-1 bg-area px-4 dark:bg-#2A313A media-screen:important-flex" style="display:none;" data-v-c675dba6><h3 class="text-3 text-footer" itemprop="programmingLanguage" aria-label="RISC-V 代码块" data-v-c675dba6>RISC-V</h3><ile-root id="ile-1"><button title="复制到剪贴板" class="copy-button b-footer text-footer" data-v-63dfb2af><span class="i-mdi-content-copy" data-v-63dfb2af></span><span class="sr-only" role="status" data-v-63dfb2af></span></button></ile-root><!--ISLAND_HYDRATION_PLACEHOLDER_ile-1--></div><div class="dark:hidden" itemprop="text" data-v-c675dba6><pre class="shiki light" style="background-color: #FBFBFB" tabindex="0"><code><span><span style="color: #4876D6">again</span><span style="color: #403F53">:</span></span>
<span><span style="color: #403F53">    </span><span style="color: #4876D6">lr.w</span><span style="color: #403F53"> </span><span style="color: #4876D6">x10</span><span style="color: #403F53">, (</span><span style="color: #4876D6">x20</span><span style="color: #403F53">)</span></span>
<span><span style="color: #403F53">    </span><span style="color: #4876D6">sc.w</span><span style="color: #403F53"> </span><span style="color: #4876D6">x11</span><span style="color: #403F53">, </span><span style="color: #4876D6">x23</span><span style="color: #403F53">, (</span><span style="color: #4876D6">x20</span><span style="color: #403F53">)</span></span>
<span><span style="color: #403F53">    </span><span style="color: #4876D6">bne</span><span style="color: #403F53">  </span><span style="color: #4876D6">x11</span><span style="color: #403F53">, </span><span style="color: #4876D6">x0</span><span style="color: #403F53">, again</span></span>
<span><span style="color: #403F53">    </span><span style="color: #4876D6">addi</span><span style="color: #403F53"> </span><span style="color: #4876D6">x23</span><span style="color: #403F53">, </span><span style="color: #4876D6">x10</span><span style="color: #403F53">, </span><span style="color: #AA0982">0</span></span></code></pre></div><div class="dark:important-block" style="display:none;" data-v-c675dba6><pre class="shiki dark" style="background-color: #011627" tabindex="0"><code><span><span style="color: #82AAFF">again</span><span style="color: #D6DEEB">:</span></span>
<span><span style="color: #D6DEEB">    </span><span style="color: #C5E478">lr.w</span><span style="color: #D6DEEB"> </span><span style="color: #C5E478">x10</span><span style="color: #D6DEEB">, (</span><span style="color: #C5E478">x20</span><span style="color: #D6DEEB">)</span></span>
<span><span style="color: #D6DEEB">    </span><span style="color: #C5E478">sc.w</span><span style="color: #D6DEEB"> </span><span style="color: #C5E478">x11</span><span style="color: #D6DEEB">, </span><span style="color: #C5E478">x23</span><span style="color: #D6DEEB">, (</span><span style="color: #C5E478">x20</span><span style="color: #D6DEEB">)</span></span>
<span><span style="color: #D6DEEB">    </span><span style="color: #C5E478">bne</span><span style="color: #D6DEEB">  </span><span style="color: #C5E478">x11</span><span style="color: #D6DEEB">, </span><span style="color: #C5E478">x0</span><span style="color: #D6DEEB">, again</span></span>
<span><span style="color: #D6DEEB">    </span><span style="color: #C5E478">addi</span><span style="color: #D6DEEB"> </span><span style="color: #C5E478">x23</span><span style="color: #D6DEEB">, </span><span style="color: #C5E478">x10</span><span style="color: #D6DEEB">, </span><span style="color: #F78C6C">0</span></span></code></pre></div></section>
<p>实现 lock<span class="mojikumi">：</span><wbr><span class="mojikumi-line-start">（</span><code>(x20)</code> 为 0/1 表示 lock free/acquired<span class="mojikumi-line-end">）</span></p>
<section class="code-block relative my-6 shadow" itemprop="hasPart" itemscope itemtype="https://schema.org/SoftwareSourceCode" data-v-c675dba6><div class="h-6 items-center rd-t-1 bg-area px-4 dark:bg-#2A313A media-screen:important-flex" style="display:none;" data-v-c675dba6><h3 class="text-3 text-footer" itemprop="programmingLanguage" aria-label="RISC-V 代码块" data-v-c675dba6>RISC-V</h3><ile-root id="ile-2"><button title="复制到剪贴板" class="copy-button b-footer text-footer" data-v-63dfb2af><span class="i-mdi-content-copy" data-v-63dfb2af></span><span class="sr-only" role="status" data-v-63dfb2af></span></button></ile-root><!--ISLAND_HYDRATION_PLACEHOLDER_ile-2--></div><div class="dark:hidden" itemprop="text" data-v-c675dba6><pre class="shiki light" style="background-color: #FBFBFB" tabindex="0"><code><span><span style="color: #4876D6">acquire</span><span style="color: #403F53">:</span></span>
<span><span style="color: #403F53">    </span><span style="color: #4876D6">addi</span><span style="color: #403F53"> </span><span style="color: #4876D6">x12</span><span style="color: #403F53">, </span><span style="color: #4876D6">x0</span><span style="color: #403F53">, </span><span style="color: #AA0982">1</span></span>
<span><span style="color: #4876D6">again</span><span style="color: #403F53">:</span></span>
<span><span style="color: #403F53">    </span><span style="color: #4876D6">lr.w</span><span style="color: #403F53"> </span><span style="color: #4876D6">x10</span><span style="color: #403F53">, (</span><span style="color: #4876D6">x20</span><span style="color: #403F53">)</span></span>
<span><span style="color: #403F53">    </span><span style="color: #4876D6">bne</span><span style="color: #403F53">  </span><span style="color: #4876D6">x10</span><span style="color: #403F53">, </span><span style="color: #4876D6">x0</span><span style="color: #403F53">, again</span></span>
<span><span style="color: #403F53">    </span><span style="color: #4876D6">sc.w</span><span style="color: #403F53"> </span><span style="color: #4876D6">x11</span><span style="color: #403F53">, </span><span style="color: #4876D6">x12</span><span style="color: #403F53">, (</span><span style="color: #4876D6">x20</span><span style="color: #403F53">)</span></span>
<span><span style="color: #403F53">    </span><span style="color: #4876D6">bne</span><span style="color: #403F53">  </span><span style="color: #4876D6">x11</span><span style="color: #403F53">, </span><span style="color: #4876D6">x0</span><span style="color: #403F53">, again</span></span>
<span></span>
<span><span style="color: #4876D6">release</span><span style="color: #403F53">:</span></span>
<span><span style="color: #403F53">    </span><span style="color: #4876D6">sw</span><span style="color: #403F53">   </span><span style="color: #4876D6">x0</span><span style="color: #403F53">, </span><span style="color: #AA0982">0</span><span style="color: #403F53">(</span><span style="color: #4876D6">x20</span><span style="color: #403F53">)</span></span></code></pre></div><div class="dark:important-block" style="display:none;" data-v-c675dba6><pre class="shiki dark" style="background-color: #011627" tabindex="0"><code><span><span style="color: #82AAFF">acquire</span><span style="color: #D6DEEB">:</span></span>
<span><span style="color: #D6DEEB">    </span><span style="color: #C5E478">addi</span><span style="color: #D6DEEB"> </span><span style="color: #C5E478">x12</span><span style="color: #D6DEEB">, </span><span style="color: #C5E478">x0</span><span style="color: #D6DEEB">, </span><span style="color: #F78C6C">1</span></span>
<span><span style="color: #82AAFF">again</span><span style="color: #D6DEEB">:</span></span>
<span><span style="color: #D6DEEB">    </span><span style="color: #C5E478">lr.w</span><span style="color: #D6DEEB"> </span><span style="color: #C5E478">x10</span><span style="color: #D6DEEB">, (</span><span style="color: #C5E478">x20</span><span style="color: #D6DEEB">)</span></span>
<span><span style="color: #D6DEEB">    </span><span style="color: #C5E478">bne</span><span style="color: #D6DEEB">  </span><span style="color: #C5E478">x10</span><span style="color: #D6DEEB">, </span><span style="color: #C5E478">x0</span><span style="color: #D6DEEB">, again</span></span>
<span><span style="color: #D6DEEB">    </span><span style="color: #C5E478">sc.w</span><span style="color: #D6DEEB"> </span><span style="color: #C5E478">x11</span><span style="color: #D6DEEB">, </span><span style="color: #C5E478">x12</span><span style="color: #D6DEEB">, (</span><span style="color: #C5E478">x20</span><span style="color: #D6DEEB">)</span></span>
<span><span style="color: #D6DEEB">    </span><span style="color: #C5E478">bne</span><span style="color: #D6DEEB">  </span><span style="color: #C5E478">x11</span><span style="color: #D6DEEB">, </span><span style="color: #C5E478">x0</span><span style="color: #D6DEEB">, again</span></span>
<span></span>
<span><span style="color: #82AAFF">release</span><span style="color: #D6DEEB">:</span></span>
<span><span style="color: #D6DEEB">    </span><span style="color: #C5E478">sw</span><span style="color: #D6DEEB">   </span><span style="color: #C5E478">x0</span><span style="color: #D6DEEB">, </span><span style="color: #F78C6C">0</span><span style="color: #D6DEEB">(</span><span style="color: #C5E478">x20</span><span style="color: #D6DEEB">)</span></span></code></pre></div></section>
<a id="lr-w-的-format" name="lr-w-的-format" aria-hidden="true"></a>
<aside role="note" data-v-a2ab257f><div class="shadow-md rd-1 b-l-6 my-6 bg-blue-1 dark:bg-blue-9 b-blue" data-v-a2ab257f><div class="p-3 flex justify-between items-center" data-v-a2ab257f><h3 class="flex items-center gap-1 font-bold" data-v-a2ab257f><span class="text-5 i-mdi-pencil text-blue" data-v-a2ab257f></span><span class="sr-only" data-v-a2ab257f>Note: </span><span data-v-a2ab257f><code>lr.w</code> 的 format</span></h3><!--v-if--></div><div class="overflow-auto rd-br-1 bg-card px-6 dark:bg-bghover" data-v-a2ab257f><p>单看 <code>lr.w</code> 的话<span class="mojikumi-line-end">，</span>似乎可以和 <code>lw</code> 一样使用 I-type 而接受一个 address offset<span class="mojikumi-line-end">。</span>但是<span class="mojikumi-line-end">，</span><code>sc.w</code> 需要三个 register<span class="mojikumi-line-end">，</span>只能用 R-type<span class="mojikumi-line-end">，</span>而 <code>lr.w</code> 和 <code>sc.w</code> 一定是挨在一起用的<span class="mojikumi-line-end">，</span>没道理只给一个提供 offset<span class="mojikumi-line-end">，</span>所以它们使用了同样的 R-type<span class="mojikumi-line-end">。</span></p></div></div></aside>
<h2 id="pseudoinstructions" class="heading"><a href="#pseudoinstructions" class="heading-anchor" aria-label="章节： Pseudoinstructions" tabindex="-1"></a><span>Pseudoinstructions</span></h2>
<p>为了方便编写汇编<span class="mojikumi-line-end">，</span>汇编中可以使用一些在 hardware 上不存在的 <i>pseudoinstruction</i><span class="mojikumi-line-end">。</span>例如<span class="mojikumi-line-end">：</span></p>
<ul>
<li><code>nop</code>: <code>addi x0, x0, 0</code></li>
<li><code>mv rd, rs</code>: <code>addi rd, rs, 0</code></li>
<li><code>not rd, rs</code>: <code>xori rd, rs, -1</code></li>
<li><code>neg rd, rs</code>: <code>sub rd, x0, rs</code></li>
<li><code>bgt rs, rt, offset</code>: <code>blt rt, rs, offset</code></li>
<li><code>bnez rs, offset</code>: <code>bne rs, x0, offset</code></li>
<li><code>ble rs, rt, offset</code>: <code>bge rt, rs, offset</code></li>
<li><code>jal offset</code>: <code>jal x1, offset</code></li>
<li><code>ret</code>: <code>jalr x0, 0(x1)</code></li>
</ul>
<p>详见<span class="mojikumi-line-start">《</span>The RISC-V Instruction Set Manual Volume I: Unprivileged ISA<span class="mojikumi-line-end">》</span>Chapter 25 RISC-V Assembly Programmer<span class="mojikumi-narrow-left">’</span>s Handbook<span class="mojikumi-line-end">。</span></p>
<section data-footnotes class="footnotes"><h2 class="sr-only" id="footnote-label">Footnotes</h2>
<ol>
<li id="user-content-fn-jalr-format">
<p><span class="mojikumi-line-start">《</span>The RISC-V Instruction Set Manual Volume I: Unprivileged ISA (20191213)<span class="mojikumi-line-end">》</span>2.5 Control Transfer Instructions <a href="#user-content-fnref-jalr-format" data-footnote-backref class="data-footnote-backref" aria-label="Back to content">↩</a></p>
</li>
<li id="user-content-fn-rvc">
<p><span class="mojikumi-line-start">《</span>The RISC-V Instruction Set Manual Volume I: Unprivileged ISA (20191213)<span class="mojikumi-line-end">》</span>1.5 Base Instruction-Length Encoding <a href="#user-content-fnref-rvc" data-footnote-backref class="data-footnote-backref" aria-label="Back to content">↩</a></p>
</li>
</ol>
</section>]]></content:encoded>
            <category domain="https://ouuan.moe/tag/cod">cod</category>
            <category domain="https://ouuan.moe/tag/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0">学习笔记</category>
        </item>
    </channel>
</rss>