8086汇编语言基础学习(一)——8086微机基础
<h1 style="text-align: center">8086微机基础</h1><h2><strong><span style="color: rgba(0, 0, 0, 1); font-size: 18pt">寄存器(Register)</span></strong></h2>
<ul>
<li><span style="font-size: 18pt; color: rgba(0, 0, 0, 1)">CPU内部的高速存储单元</span></li>
<li><span style="font-size: 18pt; color: rgba(0, 0, 0, 1)">为CPU提供<span style="background-color: rgba(204, 255, 255, 1)">数据</span>和<span style="background-color: rgba(204, 255, 255, 1)">地址</span>信息</span></li>
</ul>
<h2><strong><span style="font-size: 18pt; color: rgba(0, 0, 0, 1)">存储器地址(Address)</span></strong></h2>
<ul>
<li><span style="font-size: 18pt; color: rgba(0, 0, 0, 1)">由大量存储单元组成,用<span style="background-color: rgba(204, 255, 255, 1)">编号</span>区分每个存储单元</span></li>
<li><span style="font-size: 18pt; color: rgba(0, 0, 0, 1)">存储器的<span style="background-color: rgba(204, 255, 255, 1)">地址</span> = 存储器中存储单元的<span style="background-color: rgba(204, 255, 255, 1)">编号</span></span></li>
<li><span style="font-size: 18pt; color: rgba(0, 0, 0, 1)">每个存储单元存放<span style="background-color: rgba(204, 255, 255, 1)">一个字节</span>的数据(1Byte=8bit)</span></li>
<li><span style="font-size: 18pt; color: rgba(0, 0, 0, 1)">地址采用<span style="background-color: rgba(204, 255, 255, 1)">十六进制</span>表达</span>
<ul>
<li><span style="font-size: 18pt">Inter8086有1MB的存储器容量(1MB=210KB=220B)</span></li>
<li><span style="font-size: 18pt">存储器地址表示为:00000H~FFFFFH</span></li>
</ul>
</li>
</ul>
<h2><strong><span style="font-size: 18pt; color: rgba(0, 0, 0, 1)">端口(Port)</span></strong></h2>
<ul>
<li><span style="font-size: 18pt; color: rgba(0, 0, 0, 1)">是<span style="background-color: rgba(204, 255, 255, 1)">I/O地址</span>的别称</span></li>
<li><span style="font-size: 18pt; color: rgba(0, 0, 0, 1)">I/O接口电路由<span style="background-color: rgba(204, 255, 255, 1)">接口寄存器</span>组成,用<span style="background-color: rgba(204, 255, 255, 1)">编号</span>区分各寄存器</span></li>
<li><span style="font-size: 18pt; color: rgba(0, 0, 0, 1)">I/O<span style="background-color: rgba(204, 255, 255, 1)">地址</span> = 接口电路中寄存器的<span style="background-color: rgba(204, 255, 255, 1)">编号</span></span></li>
<li><span style="font-size: 18pt; color: rgba(0, 0, 0, 1)">端口采用<span style="background-color: rgba(204, 255, 255, 1)">十六进制</span>表达</span></li>
<ul>
<li><span style="font-size: 18pt; color: rgba(0, 0, 0, 1)">Intel 8086支持64K个8位端口</span></li>
<li><span style="font-size: 18pt; color: rgba(0, 0, 0, 1)">I/O地址可以表示为:0000H~FFFFH</span></li>
</ul>
</ul>
<h2><strong><span style="font-size: 18pt; color: rgba(0, 0, 0, 1)">8086微机模型图:</span></strong></h2>
<p><img src="https://img2023.cnblogs.com/blog/2928799/202306/2928799-20230602165224553-1891647800.png" alt="" width="998" height="703" loading="lazy" style="display: block; margin-left: auto; margin-right: auto"></p>
<h2 style="text-align: left"><strong><span style="font-size: 18pt; color: rgba(0, 0, 0, 1)">常用寄存器:</span></strong></h2>
<p><span style="font-size: 18pt; color: rgba(0, 0, 0, 1)">a. 段寄存器(Segment Register)</span><span style="font-size: 18pt; color: rgba(0, 0, 0, 1)"> </span></p>
<p><span style="font-size: 18pt; color: rgba(0, 0, 0, 1)"> i. 代码段寄存器<span style="background-color: rgba(204, 153, 255, 1)">CS</span> ( Code Segment )<br></span><span style="font-size: 18pt; color: rgba(0, 0, 0, 1)"> ii. 数据段寄存器<span style="background-color: rgba(204, 153, 255, 1)">DS</span> ( Data Segment )<br></span><em id="__mceDel"><span style="font-size: 18pt; color: rgba(0, 0, 0, 1)"> iii. 堆栈段寄存器<span style="background-color: rgba(204, 153, 255, 1)">SS</span> ( Stack Segment )<br></span></em><em id="__mceDel"><em id="__mceDel"><em id="__mceDel"><span style="font-size: 18pt; color: rgba(0, 0, 0, 1)"> iv. 附加段寄存器<span style="background-color: rgba(204, 153, 255, 1)">ES</span> ( Extra Segment )</span></em></em></em></p>
<p><img src="https://img2023.cnblogs.com/blog/2928799/202305/2928799-20230526164856351-952855023.png" alt="" width="693" height="372" loading="lazy" style="display: block; margin-left: auto; margin-right: auto"><span style="font-size: 18pt; color: rgba(0, 0, 0, 1)"> 段寄存器的长度大小为96位,可以抽象的理解为以下的数据结构:</span></p>
<p> </p>
<div class="cnblogs_code">
<pre><span style="font-size: 14pt"><span style="color: rgba(0, 0, 255, 1)">struct</span><span style="color: rgba(0, 0, 0, 1)"> Segment
{
WORD Selector;</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">16位段选择子,可见部分. </span></span></pre>
<pre><span style="font-size: 14pt"><span style="color: rgba(0, 128, 0, 1)"> //使用OD 或者X64dbg看段寄存器只会显示16位的段选择子可见部分.当读段寄存器(如mov ax,CS)的时候,只会返回这16位。或者push seg 操作针对的都是这16位。如果目标操作数是32位(如mov eax ,CS),则将16位零扩展成32位赋给目标操作数。但是写的时候,就会涉及到96位</span><span style="color: rgba(0, 0, 0, 1)">
WORD Attribute; </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">16位表示的段属性, 表示了当前段寄存器是可读的可写的还是可执行的</span><span style="color: rgba(0, 0, 0, 1)">
DWORD Base; </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">32位表示的基址,表示段从哪里开始</span><span style="color: rgba(0, 0, 0, 1)">
DWORD limit; </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">32位表示,表示的是基址的长度. base + limit 可以确定一个段的大小</span><span style="color: rgba(0, 0, 0, 1)">
}</span></span></pre>
</div>
<p><span style="font-size: 18pt; color: rgba(0, 0, 0, 1)">b. 指令指针寄存器 <span style="background-color: rgba(204, 153, 255, 1)">IP</span><br> 任意时刻,8086的CPU都会将 <span style="color: rgba(255, 102, 0, 1)">CS:IP</span> 指向下一条将取出并要执行的指令。<br></span></p>
<p><span style="font-size: 18pt; color: rgba(0, 0, 0, 1)">c. 通用寄存器<br> i. 累加器 <span style="background-color: rgba(204, 153, 255, 1)">AX</span>( Accumulator ),使用频率最高,用于算术和逻辑运算以及与外设传送信息。<br> ii. 基址寄存器 <span style="background-color: rgba(204, 153, 255, 1)">BX</span>( Base ),常用于存放存储器的地址,以方便指向变量或数组中的元素。<br> iii. 计数器 <span style="background-color: rgba(204, 153, 255, 1)">CX</span>( Counter ),常用于循环操作的计数器。<br> iv. 数据寄存器 <span style="background-color: rgba(204, 153, 255, 1)">DX</span>( Data ),可以用来存放数据,在输入和输出指令中放外设端口的地址。</span></p>
<p><span style="font-size: 18pt; color: rgba(0, 0, 0, 1)">d. 专用寄存器<br> v. 源变址寄存器<span style="background-color: rgba(204, 153, 255, 1)">SI</span>( Source Index ),用于指向字符串或数组的源操作数。<br> vi. 目的变址寄存器<span style="background-color: rgba(204, 153, 255, 1)">DI</span>( Distination Index ),用于指向字符串或数组的目的操作数。<br> vii. 基址指针寄存器<span style="background-color: rgba(204, 153, 255, 1)">BP</span>( Base Pointer ),默认情况下指向程序堆栈区域的数据,主要用于在子程序中访问通过堆栈传递的参数和局部变量。<br> viii. 堆栈指针寄存器<span style="background-color: rgba(204, 153, 255, 1)">SP</span>( Stack Pointer ),专用于指向程序堆栈区域顶部的数据,在涉及到堆栈的指令中会进行自增或自减。<br></span></p>
<p><span style="font-size: 18pt; color: rgba(0, 0, 0, 1)">e. 标志寄存器<span style="background-color: rgba(204, 153, 255, 1)">FR</span>( Flag Register )<br> 标志寄存器是一个特殊的寄存器,它是按位来存储标志信息的,而非和其他常见寄存器那用按字或者字节来存储。<br></span></p>
<p><img src="https://img2023.cnblogs.com/blog/2928799/202305/2928799-20230526230433424-1811661636.png" alt="" width="563" height="119" loading="lazy" style="display: block; margin-left: auto; margin-right: auto"></p>
<p> </p>
<p><span style="font-size: 18pt; color: rgba(0, 0, 0, 1)"> i. 六个状态位(<span style="background-color: rgba(255, 204, 153, 1)">重点</span>)</span></p>
<p><em id="__mceDel"><span style="font-size: 18pt; color: rgba(0, 0, 0, 1)"> </span></em><span style="font-size: 18pt; color: rgba(0, 0, 0, 1)">1. ZF( Zero Flag ),零标志位,如果运算结果为0时,ZF = 1,否则ZF = 0。在Debug中</span><span style="font-size: 18pt; color: rgba(0, 0, 0, 1)"><span style="color: rgba(255, 102, 0, 1)">用NZ表示ZF = 0</span>,<span style="color: rgba(255, 102, 0, 1)">用ZR表示ZF = 1</span>。<br> 2. PF( Parity Flag ),奇偶标志位,若运算结果中的低8位中“1”的个数位偶数,则PF = 1,否则PF = 0。在Debug中用PO( Parity Odd )表示PF= 1,用PE( Parity even )表示PF = 0。<br> 3. SF( Symbol Flag),符号标志位,若执行相关指令后,其结果为负数,则SF = 1,否则SF = 0。需要注意,这个标志位只对有符号数有用,对于无符号数没有意义。<br> 4. CF( Carry Flag ),进借位标志位,一般用于无符号数运算时,记录运算结果的最高有效位的进位,或者从更高位的借位。<br> 5. OF( Overflow Flag ),溢出标志位,记录有符号数运算是否溢出,若溢出,则OF = 1,否则OF = 0。需要注意,<span style="background-color: rgba(204, 255, 204, 1)">OF用于有符号数,而CF用于无符号数</span>。<br> 6. AF( Auxiliary Flag ),辅助进借位标志位,反映加减运算时最低半字节有无进位或者借位。最低半字节有进位或借位时,AF=1,否则AF=0。这个标志位主要由处理器内部使用,用于十进制算术运算的调整指令,用户一般不必关心。<br></span></p>
<p><span style="font-size: 18pt; color: rgba(0, 0, 0, 1)"> ii. 3个控制标志位</span></p>
<p><span style="color: rgba(0, 0, 0, 1)"><span style="font-size: 18pt"> 1. DF( Direction Flag ),方向标志位,仅仅用于串处理指令中,控制着地址的变化方向。<br> 2. IF( Interrupt Flag ),中断允许标志位,IF置为0,禁止其他的可屏蔽中断;如果允许处理可屏蔽中断,则将IF置为1。</span><span style="font-size: 18pt">STI指令:将IF设置为1,允许可屏蔽中断。CLI指令:将IF设置为0,禁止可屏蔽中断。</span></span><br><span style="font-size: 18pt; color: rgba(0, 0, 0, 1)"> 3. TF( Trace Flag ),跟踪标志位,跟踪标志位用于标识CPU<span style="text-decoration: underline">是否允许单步中断</span>,以进行程序调试。TF=0时,8086CPU处于正常状态;TF=1时,8086CPU处于单步状态,每执行一条指令就自动产生一次单步中断。</span></p>
<p><span style="color: rgba(0, 0, 0, 1)"> </span></p>
<h2><span style="font-size: 18pt; color: rgba(0, 0, 0, 1)"><strong>小端模式:</strong></span></h2>
<p><span style="font-size: 24px; color: rgba(0, 0, 0, 1)"> 所谓小端模式,就是<span style="background-color: rgba(204, 255, 204, 1)">指数据的低字节保存在物理内存的低地址中,而数据的高字节保存在物理内的高地址</span>,这与我们的逻辑方法是一致的。8086处理器就是利用这一方法来组织内存的。</span></p><br><br>
来源:https://www.cnblogs.com/Tatsukyou/p/17434826.html
頁:
[1]