是我呀 發表於 2021-8-7 16:48:00

[汇编]《汇编语言》第1章 基础知识

<h2 id="王爽汇编语言第四版-超级笔记">王爽《汇编语言》第四版 超级笔记</h2>
<p><strong>PS:cnblogs对于markdown页内跳转暂不支持,请在浏览器端该页右下角文章目录按钮进行快速查阅。</strong></p>
<p></p><div class="toc"><div class="toc-container-header">目录</div><ul><li>王爽《汇编语言》第四版 超级笔记<ul><li>第1章 基础知识<ul><li>1.1 机器语言</li><li>1.2 汇编语言的产生与组成</li><li>1.3 存储器、指令、数据、存储单元</li><li>1.4 CPU对存储器的读写</li><li>1.5 CPU的三大总线</li><li>1.1~1.5 小结</li><li>1.6 内存地址空间<ul><li>主板</li><li>接口卡</li><li>存储器芯片</li></ul></li></ul></li></ul></li></ul></div><p></p>
<h3 id="第1章-基础知识">第1章 基础知识</h3>
<h4 id="11-机器语言">1.1 机器语言</h4>
<p>机器语言是机器指令的集合。</p>
<p>机器指令展开来讲就是一台机器可以正确执行的命令,计算机的机器指令是一列二进制数字。</p>
<p>现在,在我们常用的PC机中,有一个芯片来完成计算机执行机器指令、进行运算功能。这个芯片就是我们常说的CPU(Central Processing Unit,中央处理单元),CPU是一种微处理器。</p>
<p>以后我们提到的计算机是指由CPU和其他受CPU直接或间接控制的芯片、器件、设备组成的计算机系统,比如我们最常见的PC机。</p>
<p>每一种微处理器都有自己的机器指令集,也就是机器语言。</p>
<p>早期的程序设计均使用机器语言。程序员们将用0、1数字编成的程序代码打在纸带 或卡片上,1打孔,0不打孔,再将程序通过纸带机或卡片机输入计算机,进行运算。</p>
<p>应用8086CPU完成运算s=768+12288-1280,机器码如下:</p>
<blockquote>
<p>101110000000000000000011</p>
<p>000001010000000000110000</p>
<p>001011010000000000000101</p>
</blockquote>
<p>在显示器上输岀“welcome to masm”,机器码如下:</p>
<blockquote>
<p>0001111010111000<br>
0000000000000000<br>
0101000010111000<br>
1100011000001111<br>
1000111011011000<br>
1011010000000110<br>
1011000000000000<br>
1011011100000111<br>
1011100100000000<br>
0000000010110110<br>
0001100010110010<br>
0100111111001101<br>
0001000010110100<br>
0000001010110111<br>
0000000010110110<br>
0000000010110010<br>
0000000011001101<br>
0001000010110100<br>
0000100110001101<br>
0001011000101010<br>
0000000011001101<br>
0010000110110100<br>
0000101010001101<br>
0001011000110001<br>
0000000011001101<br>
0010000110110100<br>
0000011010110000<br>
0001010010110111<br>
0001100110110101<br>
0000101110110001<br>
0001001110110110<br>
0000110110110010<br>
0011110011001101<br>
0001000010110100<br>
0000001010110111<br>
0000000010110000<br>
0000110010110010<br>
0001010011001101<br>
0001000010110100<br>
0000100110001101<br>
0001011000000000<br>
0000000011001101<br>
0010000111001011</p>
</blockquote>
<h4 id="12-汇编语言的产生与组成">1.2 汇编语言的产生与组成</h4>
<p>汇编语言的主体是汇编指令。</p>
<p>汇编指令和机器指令的差别在于指令的表示方法上。</p>
<p>汇编指令是机器指令便于记忆的书写格式。</p>
<blockquote>
<p>操作:将寄存器BX的内容送到AX中<br>
机器指令:1000100111011000<br>
汇编指令:mov ax,bx</p>
</blockquote>
<p>(寄存器,简单地讲是CPU中可以存储数据的器件,一个CPU中有多个寄存器。AX是其中一个寄存器的代号,BX是另一个寄存器的代号。)</p>
<p>计算机如何执行程序员用汇编指令编写的程序呢?</p>
<p><img src="https://img2020.cnblogs.com/blog/1162354/202108/1162354-20210807163957596-358965857.png" alt="image" loading="lazy"></p>
<p>汇编语言有以下3类指令组成</p>
<ol>
<li>
<p>汇编指令:机器码的助记符,有对应的机器码。</p>
</li>
<li>
<p>伪指令:没有对应的机器码,由编译器执行,计算机并不执行。</p>
</li>
<li>
<p>其他符号:如 +、-、*、/ 等,由编译器识别,没有对应的机器码。</p>
</li>
</ol>
<p>汇编语言的核心是汇编指令,它决定了汇编语言的特性。</p>
<h4 id="13-存储器指令数据存储单元">1.3 存储器、指令、数据、存储单元</h4>
<p>CPU工作,就必须向它提供指令和数据。</p>
<p>指令和数据在存储器中存放,也就是我们平时所说的内存。</p>
<p>在一台PC机中内存的作用仅次于CPU,离开了内存,性能再好的CPU也无法工作。</p>
<p>要灵活地利用汇编语言编程,我们首先要了解CPU是如何从内存中读取信息,以及向内存中写入信息的。</p>
<p>指令和数据是应用上的概念。</p>
<p>在内存或磁盘上,指令和数据没有任何区别,都是二进制信息。</p>
<p>CPU在工作的时候把有的信息看作指令,有的信息看作数据,为同样的信息赋予了不同的意义。</p>
<p>例如,内存中的二进制信息1000100111011000,计算机可以把它看作大小为89D8H的数据来处理,也可以将其看作指令mov ax,bx来执行。</p>
<p><strong>注:89D8H 中的H是十六进制的标识Hex</strong></p>
<blockquote>
<p>1000100111011000 -&gt; 89D8H (数据)<br>
1000100111011000 -&gt; mov ax,bx (程序)</p>
</blockquote>
<p>存储器被划分成若干个存储单元,每个存储单元从0开始顺序编号。</p>
<p>例如一个存储器有128个存储单元,编号从0〜127,如图1.2所示。</p>
<p><img src="https://img2020.cnblogs.com/blog/1162354/202108/1162354-20210807164043563-2056239581.png" alt="image" loading="lazy"></p>
<p>我们知道电子计算机的最小信息单位是bit(音译为比特),也就是一个二进制位。</p>
<p>8个bit组成一个Byte,也就是通常讲的一个字节。</p>
<blockquote>
<p>1Byte = 8 bit</p>
</blockquote>
<p>对于大容量的存储器一般还用以下单位来计量容量(以下用B来代表Byte):</p>
<blockquote>
<p>1KB=1O24B    1MB=1O24KB    1GB = 1024MB    1TB = 1024GB 1PB = 1024TB</p>
</blockquote>
<p>磁盘的容量单位同内存的一样,实际上以上单位是微机中常用的计量单位。</p>
<h4 id="14-cpu对存储器的读写">1.4 CPU对存储器的读写</h4>
<p>存储器被划分成多个存储单元,存储单元从零开始顺序编号。</p>
<p>这些编号可以看作存储单元在存储器中的地址。</p>
<p>CPU要从内存中读数据,首先要指定存储单元的地址。</p>
<p>CPU要想进行数据的读写,必须和外部器件(标准的说法是芯片)进行下面3类信息的交互。</p>
<ul>
<li>
<p>存储单元的地址(地址信息);</p>
</li>
<li>
<p>器件的选择,读或写的命令(控制信息);</p>
</li>
<li>
<p>读或写的数据(数据信息)。</p>
</li>
</ul>
<p>那么CPU是通过什么将地址、数据和控制信息传到存储器芯片中的呢?</p>
<p>在计算机中专门有连接CPU和其他芯片的导线,通常称为总线。</p>
<p>总线从物理上来讲,就是一根根导线的集合,根据传送信息的不同,总线从逻辑上又分为3类,地址总线、控制总线和数据总线。</p>
<p>CPU从3号单元中读取数据的过程(见图1.3)如下。</p>
<p><img src="https://img2020.cnblogs.com/blog/1162354/202108/1162354-20210807164143672-1517712825.png" alt="image" loading="lazy"></p>
<p>(1)CPU通过地址线将地址信息3发出。</p>
<p>(2)CPU通过控制线发出内存读命令,选中存储器芯片,并通知它,将要从中读取数据。</p>
<p>(3)存储器将3号单元中的数据8通过数据线送入CPU。</p>
<p>写操作与读操作的步骤相似,如向3号单元写入数据26。</p>
<p>(1)CPU通过地址线将地址信息3发出。</p>
<p>(2)CPU通过控制线发出内存写命令,选中存储器芯片,并通知它,要向其中写入数据。</p>
<p>(3)CPU通过数据线将数据26送入内存的3号单元中。</p>
<p>如何命令计算机进行数据的读写呢?</p>
<p>对于8086CPU,下面的机器码,能够完成从3号单元读数据。</p>
<blockquote>
<p>机器码:101000010000001100000000<br>
含义:从3号单元读取数据送入寄存器AX</p>
</blockquote>
<p>CPU接收这条机器码后将完成我们上面所述的读写工作。</p>
<p>机器码难于记忆,用汇编指令来表示,情况如下。</p>
<blockquote>
<p>机器码:101000010000001100000000<br>
对应的汇编指令:MOV AX,<br>
含义:   传送3号单元的内容入AX</p>
</blockquote>
<h4 id="15-cpu的三大总线">1.5 CPU的三大总线</h4>
<p>CPU是通过地址总线来指定存储器单元的。</p>
<p>可见地址总线上能传送多少个不同的信息,CPU就可以对多少个存储单元进行寻址。</p>
<p>一个CPU有N根地址线,则可以说这个CPU的地址总线的宽度为N。这样的CPU最多可以寻找2的N次方个内存单元。</p>
<p><img src="https://img2020.cnblogs.com/blog/1162354/202108/1162354-20210807164306424-1557135946.png" alt="image" loading="lazy"></p>
<p>CPU与内存或其他器件之间的数据传送是通过数据总线来进行的。</p>
<p>数据总线的宽度决定了CPU和外界的数据传送速度。</p>
<p>8根数据总线一次可传送一个8位二进制数据(即一个字节)。16根数据总线一次可传送两个字节。</p>
<p>8088CPU的数据总线宽度为8, 8086CPU的数据总线宽度为16。</p>
<p><img src="https://img2020.cnblogs.com/blog/1162354/202108/1162354-20210807164323736-1633641879.png" alt="image" loading="lazy"></p>
<p><img src="https://img2020.cnblogs.com/blog/1162354/202108/1162354-20210807164328769-1077606223.png" alt="image" loading="lazy"></p>
<p>8086有16根数据线,可一次传送16位数据,所以可一次传送数据89D8H;而8088只有8根数据线,一次只能传8位数据,所以向内存写入数据89D8H时需要进行两次数据传送。</p>
<p>CPU对外部器件的控制是通过控制总线来进行的。</p>
<p>控制总线是一些不同控制线的集合。</p>
<p>有多少根控制总线,就意味着CPU提供了对外部器件的多少种控制。</p>
<p>所以,控制总线的宽度决定了CPU对外部器件的控制能力。</p>
<p>前面所讲的内存读或写命令是由几根控制线综合发出的,其中有一根称为“读信号输出”的控制线负责由CPU向外传送读信号,CPU向该控制线上输出低电平表示将要读取数据;有一根称为“写信号输出”的控制线则负责传送写信号。</p>
<h4 id="1115-小--结">1.1~1.5 小结</h4>
<blockquote>
<p>(1) 汇编指令是机器指令的助记符,同机器指令一一对应。</p>
<p>(2) 每一种CPU都有自己的汇编指令集。</p>
<p>(3) CPU可以直接使用的信息在存储器中存放。</p>
<p>(4) 在存储器中指令和数据没有任何区别,都是二进制信息。</p>
<p>(5) 存储单元从零开始顺序编号。</p>
<p>(6) 一个存储单元可以存储8个bit,即8位二进制数。</p>
<p>(7) 1Byte=8bit 1KB=1024B 1MB=1024KB 1GB=1024MB</p>
<p>(8) 每一个CPU芯片都有许多管脚,这些管脚和总线相连。也可以说,这些管脚引出总线。一个<br>
CPU可以引出3种总线的宽度标志了这个CPU的不同方面的性能:</p>
<p>地址总线的宽度决定了CPU的寻址能力;</p>
<p>数据总线的宽度决定了CPU与其他器件进行数据传送时的一次数据传送量;</p>
<p>控制总线的宽度决定了CPU对系统中其他器件的控制能力。</p>
</blockquote>
<h4 id="16-内存地址空间">1.6 内存地址空间</h4>
<p>什么是内存地址空间呢?</p>
<p>举例来讲,一个CPU的地址总线宽度为10,那么可以寻址1024个内存单元,这1024个可寻到的内存单元就构成这个CPU的内存地址空间。</p>
<p>下面进行深入讨论。首先需要介绍两部分基本知识,主板和接口卡。</p>
<h5 id="主板">主板</h5>
<p>在每一台pc机中,都有一个主板,主板上有核心器件和一些主要器件,这些器件通过总线(地址总线、数据总线、控制总线)相连。</p>
<p>这些器件有CPU、存储器、外围芯片组、扩展插槽等,扩展插槽上一般插有RAM内存条和各类接口卡。</p>
<h5 id="接口卡">接口卡</h5>
<p>CPU对外部设备都不能直接控制,如显示器、音箱、打印机等。</p>
<p>直接控制这些设备进行工作的是插在扩展插槽上的接口卡。扩展插槽通过总线和CPU相连,所以接口卡也通过总线同CPU相连。</p>
<p>CPU可以直接控制这些接口卡,从而实现CPU对外设的间接控制。</p>
<p>简单地讲,就是CPU通过总线向接口卡发送命令,接口卡根据CPU的命令控制外设进行工作。</p>
<h5 id="存储器芯片">存储器芯片</h5>
<p>从读写属性上看分为两类:随机存储器(RAM)和只读存储器(ROM)。</p>
<p>随机存储器可读可写,但必须带电存储,关机后存储的内容丢失;只读存储器只能读取不能写入,关机后其中的内容不丢失。</p>
<p>这些存储器从功能和连接上又可分为以下几类。</p>
<ul>
<li>
<p>随机存储器<br>
用于存放供CPU使用的绝大部分程序和数据,主随机存储器一般由两个位置上的RAM组成,装在主板上的RAM和插在扩展插槽上的RAM。</p>
</li>
<li>
<p>装有 BIOS(Basic Input/Output System,基本输入/输出系统)的ROM<br>
BIOS是由主板和各类接口卡(如显卡、网卡等)厂商提供的软件系统,可以通过它利用该硬件设备进行最基本的输入输岀。在主板和某些接口卡上插有存储相应BIOS的ROM。例如,主板上的ROM中存储着主板的BIOS(通常称为系统BIOS);显卡上的ROM中存储着显卡的BIOS;如果网卡上装有ROM,那其中就可以存储网卡的BIOS。</p>
</li>
<li>
<p>接口卡上的RAM<br>
某些接口卡需要对大批量输入、输出数据进行暂时存储,在其上装有RAM,最典型的是显示卡上的RAM, 一般称为显存。显示卡随时将显存中的数据向显示器上输出。换句话说,我们将需要显示的内容写入显存,就会出现在显示器上。</p>
</li>
</ul>
<p><img src="https://img2020.cnblogs.com/blog/1162354/202108/1162354-20210807164353883-1518965605.png" alt="image" loading="lazy"></p>
<p>上述的那些存储器,在物理上是独立的器件,但是在以下两点上相同。</p>
<ul>
<li>
<p>都和CPU的总线相连。</p>
</li>
<li>
<p>CPU对它们进行读或写的时候都通过控制线发岀内存读写命令。</p>
</li>
</ul>
<p>CPU在操控它们的时候,把它们都当作内存来对待,把它们总的看作一个由若干存储单元组成的逻辑存储器,这个逻辑存储器就是我们所说的内存地址空间。</p>
<p>在汇编这门课中,我们所面对的是内存地址空间。</p>
<p><img src="https://img2020.cnblogs.com/blog/1162354/202108/1162354-20210807164409999-31780096.png" alt="image" loading="lazy"></p>
<p>在图1.8中,所有的物理存储器被看作一个由若干存储单元组成的逻辑存储器,每个物理存储器在这个逻辑存储器中占有一个地址段,即一段地址空间。CPU在这段地址空间中读写数据,实际上就是在相对应的物理存储器中读写数据。</p>
<p>内存地址空间的大小受CPU地址总线宽度的限制。</p>
<p>8086CPU的地址总线宽度为20, 可以传送2<sup>20个不同的地址信息(大小从0至2</sup>20—1)。即可以定位2^20个内存单元,则8086PC的内存地址空间大小为1MB。同理,80386CPU的地址总线宽度为32,则内存地址空间最大为4GB。</p>
<p>不同的计算机系统的内存地址空间的分配情况是不同的,图1.9展示了8086PC机内存地址空间分配的基本情况。</p>
<p><img src="https://img2020.cnblogs.com/blog/1162354/202108/1162354-20210807164434929-1651242927.png" alt="image" loading="lazy"></p>
<p>图1.9告诉我们,从地址0〜9FFFF的内存单元中读取数据,实际上就是在读取主随机存储器中的数据;向地址AOOOO-BFFFF的内存单元中写数据,就是向显存中写入数据,这些数据会被显示卡输出到显示器上;我们向地址C0000〜FFFFF的内存单元中写入数据的操作是无效的,因为这等于改写只读存储器中的内容。</p>
<blockquote>
<p>最终运行程序的是CPU,我们用汇编语言编程的时候,必须要从CPU的角度考虑问题。对CPU来讲,系统中的所有存储器中的存储单元都处于一个统一的逻辑存储器中,它的容量受CPU寻址能力的限制。这个逻辑存储器即是我们所说的内存地址空间。</p>
</blockquote><br><br>
来源:https://www.cnblogs.com/jpSpaceX/p/15112371.html
頁: [1]
查看完整版本: [汇编]《汇编语言》第1章 基础知识