汇编语言 寄存器内存访问原理解析
<p>这篇文章主要介绍了汇编语言 寄存器内存访问原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下</p><p>在内存中字的存储</p>
<p style="text-align: center"><img alt="" src="https://img.jbzj.com/file_images/article/202001/202001191615101.png" /></p>
<p style="text-align: left">这段话的主要意思是:一个字=2B=16bit,CPU中是用两个内存单元储存一个字(假如获取0地址存放的字型数据,就是获取它的高位字节0+1位和低位字节0位的数据,数据由高地址位向低地址位读)</p>
<p>问题:</p>
<p>(1)0地址单元中存放的字节型数据是多少? # 20H<br />
</p>
<p>(2)0地址字单元中存放的字型数据是多少? # 4e20H<br />
</p>
<p>(3)2地址字单元中存放的字节型数据是多少? # 12H<br />
</p>
<p>(4)2地址单元中存放的字型数据是多少? # 0012H<br />
</p>
<p>(5)1地址字单元中存放的字型数据是多少? # 12aEH</p>
<p style="text-align: center"><img alt="" src="https://img.jbzj.com/file_images/article/202001/202001191615102.png" /></p>
<p>结论:就是我上面说的,字型数据就是它和它的下一位地址单元的数据(数据由高地址位向低地址位读)</p>
<p>数据段寄存器DS和偏移量</p>
<p>用法和cs和ip差不多,都是段寄存器的值*16+偏移量的值</p>
<p>为给DS数据段寄存器值</p>
<p>因为CPU的段寄存器都比较害羞,没法给他们直接赋值(cs代码寄存器用的是jmp cs:ip),所以段寄存器采用以下方法赋值</p>
<p>字的传送</p>
<p>问题1:</p>
<p>内存中的情况如下图,写出下面指令执行后寄存器ax,bx,cx中的值?</p>
<p style="text-align: center"><img alt="" src="https://img.jbzj.com/file_images/article/202001/202001191615113.png" /></p>
<p style="text-align: left">解析:</p>
<p style="text-align: center"><img alt="" src="https://img.jbzj.com/file_images/article/202001/202001191615114.png" /></p>
<p style="text-align: left">问题2:</p>
<p>内存中的情况如下图,写出下面指令执行后寄存器ax,bx,cx中的值?</p>
<p style="text-align: center"><img alt="" src="https://img.jbzj.com/file_images/article/202001/202001191615115.png" /></p>
<p style="text-align: left">解析:</p>
<p style="text-align: center"><img alt="" src="https://img.jbzj.com/file_images/article/202001/202001191615116.png" /></p>
<p style="text-align: left">NB的move指令</p>
<p>sub,add指令</p>
<p style="text-align: center"><img alt="" src="https://img.jbzj.com/file_images/article/202001/202001191615117.png" /></p>
<p>数据段</p>
<p>我们上面操作的实际上就是数据段,具体来看下是怎样操作数据段的</p>
<p>累加123B0H~123BAH的内存单元的操作</p>
<p style="text-align: center"><img alt="" src="https://img.jbzj.com/file_images/article/202001/202001191615118.png" /></p>
<p>小结:</p>
<p>(1)字在内存中存储时 ,要用两个地址连续的内存单元来存放,字的低位字节存放在低地址单元中,高位字节存放再高地址单元中。<br />
</p>
<p>(2)用 mov 指令要访问内存单元,可以在mov指令中只给出单元的偏移地址,此时,段地址默认在DS寄存器中。<br />
</p>
<p>(3)表示一个偏移地址为address的内存单元。<br />
</p>
<p>(4)在内存和寄存器之间传送字型数据时,高地址单元和高8位寄存器、低地址单元和低8位寄存器相对应。<br />
</p>
<p>(5)mov、add、sub是具有两个操作对象的指令。jmp是具有一个操作对象的指令。</p>
<p style="text-align: center"><br />
<img alt="" src="https://img.jbzj.com/file_images/article/202001/202001191615119.png" /></p>
<p style="text-align: left">(2) 内存中的情况如图3.6所示</p>
<p>各寄存器的初始值:cs=2000h,ip=0,ds=1000h,ax=0,bx=0;</p>
<p>① 写出CPU执行的指令序列(用汇编指令写出)。</p>
<p>② 写出CPU执行每条指令后,CS、IP和相关寄存器的数值。</p>
<p>③ 再次体会:数据和程序有区别吗?如何确定内存中的信息哪些是数据,哪些是程序?</p>
<p style="text-align: center"><img alt="" src="https://img.jbzj.com/file_images/article/202001/2020011916151110.png" /></p>
<p>答案:我以为jmp了以后cp的值也会改变,实际上就是它jmp的内个CP:IP</p>
<p style="text-align: center"><img alt="" src="https://img.jbzj.com/file_images/article/202001/2020011916151111.png" /></p>
<p>
<table border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td colspan="2">
<p>指令序列</p>
</td>
<td>
<p>CS</p>
</td>
<td>
<p>IP</p>
</td>
<td>
<p>DS</p>
</td>
<td>
<p>AX</p>
</td>
<td>
<p>BX</p>
</td>
</tr>
<tr>
<td colspan="2">
<p>初始值</p>
</td>
<td>
<p>2000h</p>
</td>
<td>
<p>0</p>
</td>
<td>
<p>0</p>
</td>
<td>
<p>0</p>
</td>
<td>
<p>0</p>
</td>
</tr>
<tr>
<td>
<p>1</p>
</td>
<td>
<p>mov ax,6622h</p>
</td>
<td>
<p>2000h</p>
</td>
<td>
<p>3h</p>
</td>
<td>
<p>0</p>
</td>
<td>
<p>6622h</p>
</td>
<td>
<p>0</p>
</td>
</tr>
<tr>
<td>
<p>2</p>
</td>
<td>
<p>jmp 0ff0:0100</p>
</td>
<td>
<p>ff0h</p>
</td>
<td>
<p>100h</p>
</td>
<td>
<p>0</p>
</td>
<td>
<p>6622h</p>
</td>
<td>
<p>0</p>
</td>
</tr>
<tr>
<td>
<p>3</p>
</td>
<td>
<p>mov ax,2000h</p>
</td>
<td>
<p>ff0h</p>
</td>
<td>
<p>103h</p>
</td>
<td>
<p>0</p>
</td>
<td>
<p>2000h</p>
</td>
<td>
<p>0</p>
</td>
</tr>
<tr>
<td>
<p>4</p>
</td>
<td>
<p>mov ds,ax</p>
</td>
<td>
<p>ff0h</p>
</td>
<td>
<p>105h</p>
</td>
<td>
<p>2000h</p>
</td>
<td>
<p>2000h</p>
</td>
<td>
<p>0</p>
</td>
</tr>
<tr>
<td>
<p>5</p>
</td>
<td>
<p>mov ax,</p>
</td>
<td>
<p>ff0h</p>
</td>
<td>
<p>108h</p>
</td>
<td>
<p>2000h</p>
</td>
<td>
<p>c389h</p>
</td>
<td>
<p>0</p>
</td>
</tr>
<tr>
<td>
<p>6</p>
</td>
<td>
<p>mov ax,</p>
</td>
<td>
<p>ff0h</p>
</td>
<td>
<p>10bh</p>
</td>
<td>
<p>2000h</p>
</td>
<td>
<p>ea66h</p>
</td>
<td>
<p>0</p>
</td>
</tr>
</tbody>
</table>
</p>
<p>以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持琼殿技术社区。</p>
<div class="art_xg">
<b>您可能感兴趣的文章:</b><ul><li>汇编语言之寄存器详解</li><li>汇编指令-状态寄存器、cmp、test、jz等指令详细说明</li><li>汇编语言入门汇编指令及寄存器详解教程</li><li>汇编语言存储及寄存器原理解析</li><li>汇编语言之寄存器(详细介绍)</li><li>图文详解通俗易懂的汇编语言寄存器</li></ul>
</div>
</div>
<!--endmain-->
頁:
[1]