1 通用寄存器
这些的寄存器是程序执行代码最最常用,也最最基础的寄存器,程序执行过程中,绝大部分时间都是在操作这些寄存器来实现指令功能。
所谓通用,即这些寄存器CPU没有特殊的用途,交给应用程序“随意”使用。注意,对于有些寄存器,CPU有一些潜规则,用的时候要注意。
eax
:通常用来执行加法,函数调用的返回值一般也放在这里面
ecx
:通常用来作为计数器,比如for循环
edx
:读写I/O端口时,edx用来存放端口号
esp
:栈顶指针,指向栈的顶部
ebp
:栈底指针,指向栈的底部,通常用ebp+偏移量的形式来定位函数存放在栈中的局部变量
esi
:字符串操作时,用于存放数据源的地址
edi
:字符串操作时,用于存放目的地址的,和esi两个经常搭配一起使用,执行字符串的复制等操作
eip
:指向CPU当前指向的指令
ebx
: 数据存取
2 标志寄存器
CPU内部的寄存器中,有一种特殊的寄存器(对于不同的处理机,个数和结构都可能)具有以下3中作用。
- 用来存储相关指令的某些执行结果。
- 用来为CPU执行相关指令提供行为依据。
- 用来控制CPU的相关工作方式。
8086CPU的flag寄存器的结构如图下所示
D15 |
D14 |
D13 |
D12 |
D11 |
D10 |
D9 |
D8 |
D7 |
D6 |
D5 |
D4 |
D3 |
D2 |
D1 |
D0 |
|
|
|
|
OF |
DF |
IF |
TF |
SF |
ZF |
|
AF |
|
PF |
|
CF |
空出来的说明在8086CPU中没有使用,布局有任何含义。
它反映了CPU运算的状态特征并且存放某些控制标志
2.1 CF 进位标志位
定义:当执行一个加法(减法)运算时,最高位产生进位(或借位)时,CF为1,否则为0。
实例:
1. 修改 eax:FFFFFFFF
2. 写指令
add eax,0x1
3.结果:
eax:00000000
C: 1
A:1
2.2 ZF 零标志位
定义:若当前的运算结果为零,则ZF为1,否则为0。
- flag的第6位是ZF,0标志位。
- 记录相关指令执行后,其结果是否为0,
if = 0; zf = 1
if != 0; zf = 0
eg.mov ax,1
sub ax,1
执行后,结果为0,则zf=1
mov ax,1
add ax,0
执行后,结果为0,则zf=1,表示“结果是0”
mov ax,1
or ax,0
执行后,结果不为0,则zf=0,表示“结果非0”
2.3 SF 符号标志位
定义:该标志位与运算结果的最高位相同。即运算结果为负,则SF为1,否则为0。
2.4 OF 溢出标志位
若运算结果超出机器能搞表示的范围称为溢出,此时OF为1,否则为0。
2.5 PF 奇偶标志位
定义:当运算结果的最低16位中含1的个数位偶数,则PF为1,否则为0。
-
flag的第2位是PF,奇偶标志位。
-
记录相关指令执行后,其结果的所有bit位中1
的个数
是否为偶数
,
if 偶数 则 pf = 1
if 奇数 则 pf = 0
eg.
mov al,1
add al,10
执行后,结果为00001011B,其中3(奇数)个1,则 pf = 0;
mov al,1
or al,2
执行后,结果为00000011B,其中有2(偶数)个1,则 pf = 1;
sub al,al
执行后,结果为00000000B,其中有0(偶数)个1,则 pf = 1;
2.6 AF 辅助进位标志
定义:一个加法(减法)运算结果的低4位想高4位有进位(或借位)时,则AF=1,反之AF=0。
2.7 TF 跟踪标志
定义:该标志位为方便程序调试而设置。若TF=1,8086/8088 CPU处于单步工作方式,即在每条指令执行结束后,产生中断。
2.8 DF 方向标志
定义:该标志位用来控制处理指令的处理方向,若DF=1,则串处理过程中地址自动递减,否则自动递增。
2.8 IF 中断标志
等等
<h2><a id="1__0"></a>1 通用寄存器</h2>
<p>这些的寄存器是程序执行代码最最常用,也最最基础的寄存器,程序执行过程中,绝大部分时间都是在操作这些寄存器来实现指令功能。<br />
所谓通用,即这些寄存器CPU没有特殊的用途,交给应用程序“随意”使用。注意,对于有些寄存器,CPU有一些潜规则,用的时候要注意。</p>
<p><code>eax</code>:通常用来执行加法,函数调用的返回值一般也放在这里面<br />
<code>ecx</code>:通常用来作为计数器,比如for循环<br />
<code>edx</code>:读写I/O端口时,edx用来存放端口号<br />
<strong><code>esp</code>:栈顶指针,指向栈的顶部</strong><br />
<code>ebp</code>:栈底指针,指向栈的底部,通常用ebp+偏移量的形式来定位函数存放在栈中的局部变量<br />
<code>esi</code>:字符串操作时,用于存放数据源的地址<br />
<code>edi</code>:字符串操作时,用于存放目的地址的,和esi两个经常搭配一起使用,执行字符串的复制等操作<br />
<strong><code>eip</code>:指向CPU当前指向的指令</strong><br />
<code>ebx</code>: 数据存取</p>
<h2><a id="2__15"></a>2 标志寄存器</h2>
<p>CPU内部的寄存器中,有一种特殊的寄存器(对于不同的处理机,个数和结构都可能)具有以下3中作用。</p>
<ol>
<li>用来存储相关指令的某些执行结果。</li>
<li>用来为CPU执行相关指令提供行为依据。</li>
<li>用来控制CPU的相关工作方式。</li>
</ol>
<p>8086CPU的flag寄存器的结构如图下所示</p>
<table>
<thead>
<tr>
<th>D15</th>
<th>D14</th>
<th>D13</th>
<th>D12</th>
<th>D11</th>
<th>D10</th>
<th>D9</th>
<th>D8</th>
<th>D7</th>
<th>D6</th>
<th>D5</th>
<th>D4</th>
<th>D3</th>
<th>D2</th>
<th>D1</th>
<th>D0</th>
</tr>
</thead>
<tbody>
<tr>
<td></td>
<td></td>
<td></td>
<td></td>
<td>OF</td>
<td>DF</td>
<td>IF</td>
<td>TF</td>
<td>SF</td>
<td>ZF</td>
<td></td>
<td>AF</td>
<td></td>
<td>PF</td>
<td></td>
<td>CF</td>
</tr>
</tbody>
</table>
<p>空出来的说明在8086CPU中没有使用,布局有任何含义。<br />
它反映了CPU运算的状态特征并且存放某些控制标志</p>
<h3><a id="21_CF__28"></a>2.1 CF 进位标志位</h3>
<p>定义:当执行一个加法(减法)运算时,最高位产生进位(或借位)时,CF为1,否则为0。</p>
<p>实例:</p>
<pre><code class="lang-">1. 修改 eax:FFFFFFFF
2. 写指令
add eax,0x1
3.结果:
eax:00000000
C: 1
A:1
</code></pre>
<h3><a id="22_ZF__44"></a>2.2 ZF 零标志位</h3>
<p>定义:若当前的运算结果为零,则ZF为1,否则为0。</p>
<ol>
<li>flag的第6位是ZF,0标志位。</li>
<li>记录相关指令执行后,其结果是否为0,<br />
if = 0; zf = 1<br />
if != 0; zf = 0<br />
eg.<pre><div class="hljs"><code class="lang-c">mov ax,<span class="hljs-number">1</span>
sub ax,<span class="hljs-number">1</span>
执行后,结果为<span class="hljs-number">0</span>,则zf=<span class="hljs-number">1</span>
</code></div></pre>
<pre><div class="hljs"><code class="lang-c">mov ax,<span class="hljs-number">1</span>
add ax,<span class="hljs-number">0</span>
执行后,结果为<span class="hljs-number">0</span>,则zf=<span class="hljs-number">1</span>,表示“结果是<span class="hljs-number">0</span>”
</code></div></pre>
<pre><div class="hljs"><code class="lang-c">mov ax,<span class="hljs-number">1</span>
or ax,<span class="hljs-number">0</span>
执行后,结果不为<span class="hljs-number">0</span>,则zf=<span class="hljs-number">0</span>,表示“结果非<span class="hljs-number">0</span>”
</code></div></pre>
</li>
</ol>
<h3><a id="23_SF__68"></a>2.3 SF 符号标志位</h3>
<p>定义:该标志位与运算结果的最高位相同。即运算结果为负,则SF为1,否则为0。</p>
<h3><a id="24_OF__71"></a>2.4 OF 溢出标志位</h3>
<p>若运算结果超出机器能搞表示的范围称为溢出,此时OF为1,否则为0。</p>
<h3><a id="25_PF__74"></a>2.5 PF 奇偶标志位</h3>
<p>定义:当运算结果的最低16位中含1的个数位偶数,则PF为1,否则为0。</p>
<ol>
<li>
<p>flag的第2位是PF,奇偶标志位。</p>
</li>
<li>
<p>记录相关指令执行后,其结果的所有bit位中<code>1</code>的<code>个数</code>是否为<code>偶数</code>,<br />
if 偶数 则 pf = 1<br />
if 奇数 则 pf = 0<br />
eg.</p>
<pre><div class="hljs"><code class="lang-c">mov al,<span class="hljs-number">1</span>
add al,<span class="hljs-number">10</span>
执行后,结果为<span class="hljs-number">00001011B</span>,其中<span class="hljs-number">3</span>(奇数)个<span class="hljs-number">1</span>,则 pf = <span class="hljs-number">0</span>;
</code></div></pre>
<pre><div class="hljs"><code class="lang-c">mov al,<span class="hljs-number">1</span>
or al,<span class="hljs-number">2</span>
执行后,结果为<span class="hljs-number">00000011B</span>,其中有<span class="hljs-number">2</span>(偶数)个<span class="hljs-number">1</span>,则 pf = <span class="hljs-number">1</span>;
</code></div></pre>
<pre><div class="hljs"><code class="lang-c">sub al,al
执行后,结果为<span class="hljs-number">00000000B</span>,其中有<span class="hljs-number">0</span>(偶数)个<span class="hljs-number">1</span>,则 pf = <span class="hljs-number">1</span>;
</code></div></pre>
</li>
</ol>
<h3><a id="26_AF__98"></a>2.6 AF 辅助进位标志</h3>
<p>定义:一个加法(减法)运算结果的低4位想高4位有进位(或借位)时,则AF=1,反之AF=0。</p>
<h3><a id="27_TF__101"></a>2.7 TF 跟踪标志</h3>
<p>定义:该标志位为方便程序调试而设置。若TF=1,8086/8088 CPU处于单步工作方式,即在每条指令执行结束后,产生中断。</p>
<h3><a id="28_DF__103"></a>2.8 DF 方向标志</h3>
<p>定义:该标志位用来控制处理指令的处理方向,若DF=1,则串处理过程中地址自动递减,否则自动递增。</p>
<h3><a id="28_IF__106"></a>2.8 IF 中断标志</h3>
<p>等等</p>
留言