ia32-64/x86/bndcu.bndcn.html

165 lines
6 KiB
HTML
Raw Normal View History

2025-07-08 02:23:29 -03:00
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:svg="http://www.w3.org/2000/svg" xmlns:x86="http://www.felixcloutier.com/x86"><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><link rel="stylesheet" type="text/css" href="style.css"></link><title>BNDCU/BNDCN
— Check Upper Bound</title></head><body><header><nav><ul><li><a href='index.html'>Index</a></li><li>December 2023</li></ul></nav></header><h1>BNDCU/BNDCN
— Check Upper Bound</h1>
<table>
<tr>
<th>Opcode/Instruction</th>
<th>Op/En</th>
<th>64/32 bit Mode Support</th>
<th>CPUID Feature Flag</th>
<th>Description</th></tr>
<tr>
<td>F2 0F 1A /r BNDCU bnd, r/m32</td>
<td>RM</td>
<td>N.E./V</td>
<td>MPX</td>
<td>Generate a #BR if the address in r/m32 is higher than the upper bound in bnd.UB (bnb.UB in 1's complement form).</td></tr>
<tr>
<td>F2 0F 1A /r BNDCU bnd, r/m64</td>
<td>RM</td>
<td>V/N.E.</td>
<td>MPX</td>
<td>Generate a #BR if the address in r/m64 is higher than the upper bound in bnd.UB (bnb.UB in 1's complement form).</td></tr>
<tr>
<td>F2 0F 1B /r BNDCN bnd, r/m32</td>
<td>RM</td>
<td>N.E./V</td>
<td>MPX</td>
<td>Generate a #BR if the address in r/m32 is higher than the upper bound in bnd.UB (bnb.UB not in 1's complement form).</td></tr>
<tr>
<td>F2 0F 1B /r BNDCN bnd, r/m64</td>
<td>RM</td>
<td>V/N.E.</td>
<td>MPX</td>
<td>Generate a #BR if the address in r/m64 is higher than the upper bound in bnd.UB (bnb.UB not in 1's complement form).</td></tr></table>
<h2 id="instruction-operand-encoding">Instruction Operand Encoding<a class="anchor" href="#instruction-operand-encoding">
</a></h2>
<table>
<tr>
<th>Op/En</th>
<th>Operand 1</th>
<th>Operand 2</th>
<th>Operand 3</th></tr>
<tr>
<td>RM</td>
<td>ModRM:reg (w)</td>
<td>ModRM:r/m (r)</td>
<td>N/A</td></tr></table>
<h2 id="description">Description<a class="anchor" href="#description">
</a></h2>
<p>Compare the address in the second operand with the upper bound in bnd. The second operand can be either a register or a memory operand. If the address is higher than the upper bound in bnd.UB, it will set BNDSTATUS to 01H and signal a #BR exception.</p>
<p>BNDCU perform 1s complement operation on the upper bound of bnd first before proceeding with address comparison. BNDCN perform address comparison directly using the upper bound in bnd that is already reverted out of 1s complement form.</p>
<p>This instruction does not cause any memory access, and does not read or write any flags.</p>
<p>Effective address computation of m32/64 has identical behavior to LEA</p>
<h2 id="operation">Operation<a class="anchor" href="#operation">
</a></h2>
<h3 id="bndcu-bnd--reg">BNDCU BND, reg<a class="anchor" href="#bndcu-bnd--reg">
</a></h3>
<pre>IF reg &gt; NOT(BND.UB) Then
BNDSTATUS := 01H;
#BR;
FI;
</pre>
<h3 id="bndcu-bnd--mem">BNDCU BND, mem<a class="anchor" href="#bndcu-bnd--mem">
</a></h3>
<pre>TEMP := LEA(mem);
IF TEMP &gt; NOT(BND.UB) Then
BNDSTATUS := 01H;
#BR;
FI;
</pre>
<h3 id="bndcn-bnd--reg">BNDCN BND, reg<a class="anchor" href="#bndcn-bnd--reg">
</a></h3>
<pre>IF reg &gt; BND.UB Then
BNDSTATUS := 01H;
#BR;
FI;
</pre>
<h3 id="bndcn-bnd--mem">BNDCN BND, mem<a class="anchor" href="#bndcn-bnd--mem">
</a></h3>
<pre>TEMP := LEA(mem);
IF TEMP &gt; BND.UB Then
BNDSTATUS := 01H;
#BR;
FI;
</pre>
<h2 id="intel-c-c++-compiler-intrinsic-equivalent">Intel C/C++ Compiler Intrinsic Equivalent<a class="anchor" href="#intel-c-c++-compiler-intrinsic-equivalent">
</a></h2>
<pre>BNDCU .void _bnd_chk_ptr_ubounds(const void *q)
</pre>
<h2 id="flags-affected">Flags Affected<a class="anchor" href="#flags-affected">
</a></h2>
<p>None</p>
<h2 class="exceptions" id="protected-mode-exceptions">Protected Mode Exceptions<a class="anchor" href="#protected-mode-exceptions">
</a></h2>
<table>
<tr>
<td>#BR</td>
<td>If upper bound check fails.</td></tr>
<tr>
<td rowspan="4">#UD</td>
<td>If the LOCK prefix is used.</td></tr>
<tr>
<td>If ModRM.r/m encodes BND4-BND7 when Intel MPX is enabled.</td></tr>
<tr>
<td>If 67H prefix is not used and CS.D=0.</td></tr>
<tr>
<td>If 67H prefix is used and CS.D=1.</td></tr></table>
<h2 class="exceptions" id="real-address-mode-exceptions">Real-Address Mode Exceptions<a class="anchor" href="#real-address-mode-exceptions">
</a></h2>
<table>
<tr>
<td>#BR</td>
<td>If upper bound check fails.</td></tr>
<tr>
<td rowspan="3">#UD</td>
<td>If the LOCK prefix is used.</td></tr>
<tr>
<td>If ModRM.r/m encodes BND4-BND7 when Intel MPX is enabled.</td></tr>
<tr>
<td>If 16-bit addressing is used.</td></tr></table>
<h2 class="exceptions" id="virtual-8086-mode-exceptions">Virtual-8086 Mode Exceptions<a class="anchor" href="#virtual-8086-mode-exceptions">
</a></h2>
<table>
<tr>
<td>#BR</td>
<td>If upper bound check fails.</td></tr>
<tr>
<td rowspan="3">#UD</td>
<td>If the LOCK prefix is used.</td></tr>
<tr>
<td>If ModRM.r/m encodes BND4-BND7 when Intel MPX is enabled.</td></tr>
<tr>
<td>If 16-bit addressing is used.</td></tr></table>
<h2 class="exceptions" id="compatibility-mode-exceptions">Compatibility Mode Exceptions<a class="anchor" href="#compatibility-mode-exceptions">
</a></h2>
<p>Same exceptions as in protected mode.</p>
<h2 class="exceptions" id="64-bit-mode-exceptions">64-Bit Mode Exceptions<a class="anchor" href="#64-bit-mode-exceptions">
</a></h2>
<table>
<tr>
<td>#UD</td>
<td>If ModRM.r/m and REX encodes BND4-BND15 when Intel MPX is enabled.</td></tr></table>
<p>Same exceptions as in protected mode.</p><footer><p>
This UNOFFICIAL, mechanically-separated, non-verified reference is provided for convenience, but it may be
inc<span style="opacity: 0.2">omp</span>lete or b<sub>r</sub>oke<sub>n</sub> in various obvious or non-obvious
ways. Refer to <a href="https://software.intel.com/en-us/download/intel-64-and-ia-32-architectures-sdm-combined-volumes-1-2a-2b-2c-2d-3a-3b-3c-3d-and-4">Intel® 64 and IA-32 Architectures Software Developers Manual</a> for anything serious.
</p></footer></body></html>