mirror of https://github.com/Nonannet/pyladoc.git
44 lines
1.7 KiB
HTML
44 lines
1.7 KiB
HTML
<p>Below is an in-depth explanation of the AArch64 (ARM64)
|
||
unconditional branch instruction—often simply called the
|
||
“B” instruction—and how its 26‐bit immediate field (imm26)
|
||
is laid out and later relocated during linking.</p>
|
||
<hr></hr>
|
||
<h2>Instruction Layout</h2>
|
||
<p>The unconditional branch in AArch64 is encoded in a 32‑bit
|
||
instruction. Its layout is as follows:</p>
|
||
<pre><code>Bits: 31 26 25 0
|
||
+-------------+------------------------------+
|
||
| Opcode | imm26 |
|
||
+-------------+------------------------------+
|
||
</code></pre>
|
||
<ul>
|
||
<li><strong>Opcode (bits 31:26):</strong></li>
|
||
<li>For a plain branch (<code>B</code>), the opcode is <code>000101</code>.</li>
|
||
<li>
|
||
<p>For a branch with link (<code>BL</code>), which saves the return
|
||
address (i.e., a call), the opcode is <code>100101</code>.
|
||
These 6 bits determine the instruction type.</p>
|
||
</li>
|
||
<li>
|
||
<p><strong>Immediate Field (imm26, bits 25:0):</strong></p>
|
||
</li>
|
||
<li>This 26‑bit field holds a signed immediate value.</li>
|
||
<li>
|
||
<p><strong>Offset Calculation:</strong> At runtime, the processor:</p>
|
||
<ol>
|
||
<li><strong>Shifts</strong> the 26‑bit immediate left by 2 bits.
|
||
(Because instructions are 4-byte aligned,
|
||
the two least-significant bits are always zero.)</li>
|
||
<li><strong>Sign-extends</strong> the resulting 28‑bit value to
|
||
the full register width (typically 64 bits).</li>
|
||
<li><strong>Adds</strong> this value to the program counter
|
||
(PC) to obtain the branch target.</li>
|
||
</ol>
|
||
</li>
|
||
<li>
|
||
<p><strong>Reach:</strong></p>
|
||
</li>
|
||
<li>With a 26‑bit signed field that’s effectively 28 bits
|
||
after the shift, the branch can cover a range
|
||
of approximately ±128 MB from the current instruction.</li>
|
||
</ul> |