顺好 發表於 2022-5-4 18:41:00

汇编语言学习(对于8086CPU)

<h1 id="汇编语言学习对于8086cpu">汇编语言学习(对于8086CPU)</h1>
<blockquote>
<p>前言:学了计算机导论再来学会更好,推荐也学一下计算机组成原理(只学过导论也可以)</p>
</blockquote>
<blockquote>
<p>这篇笔记没有前置理论知识,不讲历史之类的</p>
<p>直接从汇编开始</p>
</blockquote>
<h2 id="cpu寄存器">CPU寄存器</h2>
<h3 id="通用寄存器">通用寄存器</h3>
<ol>
<li>
<p>首先,CPU需要除了ALU(运算)和CU(控制)还需要存储(寄存器)</p>
</li>
<li>
<p>此时,引出我们能够使用的:</p>
<ul>
<li>四个通用寄存器:AX,BX,CX,DX</li>
<li>是16位的,也就是4个4位,就是4个16(2^4)进制数</li>
<li>他们可以各自分割成2个8位寄存器,为了兼容以前</li>
<li>高8位(AH,BH,CH,DH)</li>
<li>低8位(AL,BL,CL,DL)</li>
</ul>
</li>
<li>
<p>8086CPU有16根地址线:</p>
</li>
<li>
<ul>
<li>一次可以处理两种尺寸的数据:
<ul>
<li>字节型数据:8bit——8位寄存器</li>
<li>字型数据:16bit——16位寄存器</li>
</ul>
</li>
</ul>
</li>
</ol>
<hr>
<h3 id="前期常用指令及语法">前期常用指令及语法</h3>
<p>mov(赋值):        mov 寄存器 值        mov 寄存器 寄存器</p>
<p>add(加):        add 寄存器 值                add 寄存器 寄存器</p>
<p>sub(减):        sub 寄存器 值                sub 寄存器 寄存器</p>
<p>jmp:见下面cs:ip寄存器讲解</p>
<h3 id="地址寄存器">地址寄存器</h3>
<ol>
<li>
<p>8086中地址由段地址和偏移地址组成</p>
</li>
<li>
<p>原因是设计问题:</p>
<ul>
<li>地址线多(有20根)</li>
<li>但寄存器小(只有16位)</li>
<li>怕浪费了地址线,所以提出</li>
</ul>
</li>
<li>
<p>通过地址加法器算出实际地址</p>
<ul>
<li>(段地址 * 16) + 偏移地址 = 物理地址</li>
</ul>
</li>
<li>
<table>
<thead>
<tr>
<th>段地址寄存器</th>
<th>偏移地址寄存器</th>
</tr>
</thead>
<tbody>
<tr>
<td>ds</td>
<td>sp</td>
</tr>
<tr>
<td>es</td>
<td>bp</td>
</tr>
<tr>
<td>ss</td>
<td>si</td>
</tr>
<tr>
<td>cs</td>
<td>di</td>
</tr>
<tr>
<td></td>
<td>ip</td>
</tr>
<tr>
<td></td>
<td>bx</td>
</tr>
</tbody>
</table>
</li>
</ol>
<hr>
<h3 id="csip寄存器">cs:ip寄存器</h3>
<ol>
<li>我们知道:一般计算机用指令和数据都用二进制表示,没有区别</li>
<li>那计算机该如何区分指令和数据呢</li>
<li>此时我们引出cs:ip</li>
<li>上面的表中我们可以看到cs是段寄存器,ip是偏移地址寄存器</li>
<li>我们此时用cs和ip一起可以指向可以真实的物理地址</li>
<li>那么我们规定:cs:ip指向的那个地址存放的是指令</li>
<li>此时我们需要一步一步的执行和跳转,那么我们就要控制cs:ip的地址
<ol>
<li>每次执行后ip会自增指令的长度</li>
<li>jmp语句可以进行对cs:ip进行改变</li>
<li>jmp的语法:
<ul>
<li>jmp cs:ip                例如:jmp 2000:0        修改cs:ip两个</li>
<li>jmp 寄存器   例如:jmp ax         修改ip一个</li>
</ul>
</li>
</ol>
</li>
</ol>
<hr>
<h2 id="内存">内存</h2>
<ul>
<li>一个“<strong>字型</strong>”数据存放在内存中,可以由        “<strong>2个</strong>”        “<strong>连续的</strong>”        地址内存单元组成</li>
<li>高地址存放“<strong>字型</strong>”的高位“<strong>字节</strong>”</li>
<li>低地址存放“字型”的低位“<strong>字节</strong>”</li>
</ul>
<p>例如:一个虚拟的地址空间</p>
<table>
<thead>
<tr>
<th>地址</th>
<th>值</th>
</tr>
</thead>
<tbody>
<tr>
<td>0</td>
<td>10H</td>
</tr>
<tr>
<td>1</td>
<td>05H</td>
</tr>
<tr>
<td>2</td>
<td>2EH</td>
</tr>
<tr>
<td>3</td>
<td>3AH</td>
</tr>
</tbody>
</table>
<p><strong>此时:</strong></p>
<p><strong>0的字节型是10H,0的字型是0510H</strong></p>
<p><strong>2的字节型是2EH,2的字型是3A2EH</strong></p>
<p><strong>1的字节型是05H,1的字型是2E05H</strong></p>
<hr>
<h3 id="可以使用ds段地址寄存器来使寄存器访问内存的数据">可以使用ds段地址寄存器来使寄存器访问内存的数据</h3>
<p>例如:</p>
<p>mov bx,1000H</p>
<p>mov <strong>ds</strong>,bx</p>
<p>mov ax,<strong>ds:</strong>                mov <strong>ds:</strong>,ax</p>
<hr>
<h3 id="栈">栈</h3>
<ol>
<li>栈是一段连续的内存单元,也就是一段连续的内存地址</li>
<li>栈的访问形式是<strong>后进先出(LIFO)</strong></li>
<li>通过改变<strong>栈顶标记</strong>进行入栈出栈</li>
<li>使用<strong>ss:sp寄存器</strong>进行组合</li>
<li>指令:只能操作<strong>字型</strong>数据或者<strong>16位寄存器,操作的都是ss:sp的数据</strong>
<ul>
<li>push:入栈        例如:push ax</li>
<li>pop:出栈    例如:pop ax</li>
</ul>
</li>
</ol>
<hr>
<p><strong>未完</strong></p><br><br>
来源:https://www.cnblogs.com/coderDreams/p/16221919.html
頁: [1]
查看完整版本: 汇编语言学习(对于8086CPU)