重庆火锅底料 發表於 2022-3-13 22:16:00

20192405汇编语言笔记

<h1 id="汇编语言一般概念">汇编语言一般概念:</h1>
<h2 id="机器语言就是把控制计算机的命令和各种数据直接用二进制数码表示的一种程序设计语言">机器语言,就是把控制计算机的命令和各种数据直接用二进制数码表示的一种程序设计语言</h2>
<p>优点:运行速度快,程序长度最短<br>
缺点:不便于记忆与阅读</p>
<h2 id="高级语言便于阅读效率比机器语言低">.高级语言,便于阅读,效率比机器语言低</h2>
<h2 id="汇编语言">汇编语言.</h2>
<p>定义:为了便于记忆与阅读,使用字母与符号表示机器语言的命令,用十进制或16进制表示数据的语言</p>
<h3 id="汇编语言与机器语言的关系">汇编语言与机器语言的关系:</h3>
<p>一条汇编语言与一条机器指令相对应,汇编语言与机器语言效率相同</p>
<h1 id="熟悉计算机内部结构主要是熟悉cpu功能结构包括">熟悉计算机内部结构主要是熟悉CPU功能结构,包括</h1>
<p>CPU中寄存器及其作用<br>
CPU如何访问存储器<br>
i/o操作方式有哪些</p>
<h2 id="学习与使用汇编语言的目的从根本上认识理解计算机工作过程某些功能必须要汇编语言汇编语言程序效率高于高级程序语言">学习与使用汇编语言的目的:从根本上认识、理解计算机工作过程;某些功能必须要汇编语言;汇编语言程序效率高于高级程序语言</h2>
<h2 id="进位计数制各个位置上数值城为位权简称权每个数位上使用不同数码的个数称为基数b2o8d10h16">进位计数制:各个位置上数值城为位权简称权;每个数位上使用不同数码的个数称为基数B.2;O.8;D.10;H.16</h2>
<h2 id="各种数制转换">各种数制转换</h2>
<h3 id="一十转二">一、十转二</h3>
<p>1.减权定位法<br>
2.除基取余法<br>
小数<br>
减权定位法<br>
乘积取整法</p>
<h3 id="二转十">二转十</h3>
<p>按权相加法<br>
逐次乘积相加法<br>
小数、<br>
按权相加法<br>
逐次除积相加法</p>
<h3 id="2816进制对应关系">2.8.16进制对应关系</h3>
<p>计算机原码反码补码<br>
负数原码补码:各位变反最低位加一<br>
0补码只有一个</p>
<h1 id="字符">字符</h1>
<p>ASCII码128个33非打印95打印</p>
<h1 id="ibm-pc微机结构">IBM-PC微机结构</h1>
<h2 id="总线结构">总线结构</h2>
<p>CPU与主存储器合称主机</p>
<h3 id="串行方式取指---执行--存数">串行方式:取指   执行存数</h3>
<pre><code>             忙       闲       忙
</code></pre>
<h3 id="指令流水线">指令流水线</h3>
<p>CPU寄存器结构及其用途通用寄存器8个控制寄存器2个段寄存器4个</p>
<h4 id="一通用寄存器">一、通用寄存器</h4>
<p>数据寄存器;包括AXBXDX四个寄存器可以当一个16位或者两个八位来用<br>
隐含使用:不用指出寄存器名字隐含使用</p>
<h4 id="二指针寄存器">二、指针寄存器</h4>
<p>堆栈指针sp基址指针bp<br>
变址寄存器<br>
端寄存器</p>
<h4 id="三指令指针ip">三指令指针IP</h4>
<pre><code>进位标志位cf
辅助进位标志位AF
零值标志位ZF
溢出标志位OF
</code></pre>
<h1 id="存储器">存储器</h1>
<h2 id="存储器组成">存储器组成</h2>
<h3 id="1-存储器是由若干个存储单元构成">1. 存储器是由若干个存储单元构成</h3>
<p>存储单元的多少就表示了存储器的容量</p>
<h3 id="2-每个存储单元存放相同长度的二进制数">2. 每个存储单元存放相同长度的二进制数</h3>
<p>一个存储单元的长度一般为8位二进制数,即一个字节。</p>
<h3 id="3-每个存储单元有一个唯一的地址编号地址">3. 每个存储单元有一个唯一的地址编号——地址</h3>
<h3 id="4-任何两个相邻字节单元就构成一个字单元">4. 任何两个相邻字节单元就构成一个字单元</h3>
<p>一个字存储单元(WORD)的长度为16位二进<br>
制数,即两个字节。字单元的地址为两个字节单元中<br>
较小地址字节单元的地址。<br>
16位长数据的存放规则是低8位放在较低地址字<br>
节单元中,高8位放在较高地址字节单元中</p>
<h3 id="5在定义一个地址时必须指出是字节或字类型属性">5、在定义一个地址时必须指出是字节或字类型属性</h3>
<h2 id="二存储器的段结构">二、存储器的段结构</h2>
<h3 id="1-80868088cpu将1mb的存储空间划分成若干个段每">1. 8086/8088CPU将1MB的存储空间划分成若干个段,每</h3>
<p>个段最大长度为64K(65536)个字节单元组成。</p>
<h3 id="2-每个段的基址段基址必须是一个小节的首址">2. 每个段的基址(段基址)必须是一个小节的首址。</h3>
<p>段基址——一个段的起始地址。<br>
在存储器中规定从0地址开始,每16个字节单元称为一个小<br>
节(Paragraph)。因此,1MB内存就可划分为64K个小节。</p>
<h3 id="3-逻辑段在物理存储器中可以是邻接的间隔的">3. 逻辑段在物理存储器中可以是邻接的、间隔的、</h3>
<p>部分重叠的和完全重叠的等4种情况。<br>
逻辑段是指在汇编语言源程序中设置的段<br>
内存中的一个物理存储单元可以映象到一个或多个逻辑段中</p>
<h3 id="4-在任一时刻一个程序只能访问4个当前段中的内容">4. 在任一时刻,一个程序只能访问4个当前段中的内容。</h3>
<p>4个段分别是代码段、数据段、堆栈段和附加段,<br>
称为当前段 。4个段寄存器CS、DS、SS和ES分别保<br>
存了它们段基址的高16位地址,称为段基值。段基址<br>
的最低4位为0。(小节首址的低4位为全0 )。</p>
<h2 id="三-逻辑地址与物理地址及对应关系">三、 逻辑地址与物理地址及对应关系</h2>
<h3 id="1-物理地址">1. 物理地址</h3>
<p>在1MB的存储空间中,每个存储单元的物理地址是唯<br>
一的,它就是该存储单元的20位地址。<br>
8086/8088的物理地址范围:00000H~0FFFFFH</p>
<h3 id="2-逻辑地址">2. 逻辑地址</h3>
<p>在程序设计中,为了便于程序的开发和对存储器进行动<br>
态管理,使用了逻辑地址。<br>
一个逻辑地址包括两个部分:段基值和偏移量<br>
段基值:存放在某一个段寄存器中,是一个逻辑段的起始<br>
单元地址(段基址)的高16位。<br>
偏移量:表示某个存储单元与它所在段的段基址之间的字<br>
节距离。<br>
对于一个64K的段,当偏移量为0时,就是这个段的起始单元,而偏移量为0FFFFH时,就是这个段的最后一个字节单元。</p>
<h3 id="3逻辑地址转换为物理地址">3.逻辑地址转换为物理地址</h3>
<p>当CPU要访问存储器时,需要由总线接口单元BIU将逻<br>
辑地址转换成物理地址。<br>
转换方法:将逻辑地址的段基值左移4位,形成20位的段基<br>
址(低位为0)然后与16位的偏移量相加,结果即为20位的<br>
物理地址。</p>
<h3 id="4逻辑地址的来源">4.逻辑地址的来源</h3>
<p>在程序的执行过程中,CPU根据不同操作类型访问存<br>
储器,其逻辑地址中段基值和偏移量的来源是不一样的。</p>
<h1 id="堆栈及其操作方法">堆栈及其操作方法</h1>
<p>堆栈是一个特定的存储区,访问该存储区一般需要按<br>
照专门的规则进行操作堆栈的用途:主要用于暂存数据以及在过程调用或处理<br>
中断时保存断点信息。</p>
<h2 id="一堆栈的构造">一、堆栈的构造</h2>
<p>堆栈一般分为:专用堆栈存储器 和软件堆栈<br>
专用堆栈存储器 按堆栈的工作方式专门设计的存储器<br>
软件堆栈 由程序设计人员用软件在内存中划出的一块存储区<br>
作为堆栈来使用。8086/8088采用这种方式</p>
<p>SP的内容始终指向栈顶单元<br>
堆栈中数据进出都由SP来控制</p>
<h2 id="二80868088堆栈的组织">二、8086/8088堆栈的组织</h2>
<p>顶由堆栈指针SP指示。SP中内容始终表示堆栈段基<br>
址与栈顶之间的距离(字节数)。当SP内容为最大(初始)<br>
值时,表示堆栈为空。而当(SP)=0时,表示堆栈全满.<br>
当SP被初始化时,指向栈底+2单元,其值就是堆栈的长<br>
度。由于SP是16位寄存器,因此堆栈长度 64K字节。<br>
数据在堆栈中的存放格式是:以字为单位存放,数据<br>
的低8位放在较低地址单元,高8位放在较高地址单元。<br>
当用户程序中要求的堆栈长度超过一个堆栈段的最大<br>
长度64KB时,可以设置几个堆栈段。<br>
通过改变堆栈段寄存器SS的内容,即可改变到另一个<br>
堆栈段,当改变了堆栈段寄存器SS的内容后,必须紧接着<br>
赋予SP新值。</p>
<h2 id="三-堆栈操作">三、 堆栈操作</h2>
<h3 id="1设置堆栈">1.设置堆栈</h3>
<p>设置堆栈主要是对堆栈段寄存器SS和堆栈指针SP赋值。<br>
例如:<br>
STACK1 SEGMEMT PARA STACK<br>
DB 100 DUP(0)<br>
STACK1 ENDS<br>
第一行中的PARA STACK就是用来说明本段为堆栈段。当程序经过汇编、连接并装入内存时,系统将自动为其分配一个存储区作为堆栈段,将这个段的段基址的高16位送入SS中,将程序指定的字节单元数100赋值给SP。</p>
<h3 id="2进栈push">2.进栈PUSH</h3>
<p>进栈就是把数据存入堆栈。由指令PUSH或者由机器自动<br>
实现,可以将通用寄存器、段寄存器或字存储单元的内容压<br>
入堆栈顶部。<br>
例:PUSH AX ;将寄存器AX的内容压入堆栈PUSH DS ;将段寄存器DS的内容压入堆栈<br>
PUSH DATA-WORD ;将字存储单元DADA-WORD压入; 堆栈PUSHF ;将标志寄存器内容压入堆栈。<br>
进栈的执行过程:<br>
(1)首先将堆栈指针SP减2,即指向一个空的堆栈字单元<br>
SP&lt;=(SP)-248/51<br>
(2)将要储存的内容(寄存器或存储单元的内容)送<br>
入SP指向的字单元中。(SP)&lt;=数据</p>
<h3 id="3出栈pop">3.出栈POP</h3>
<p>出栈操作由POP指令或机器自动实现,它从堆栈顶<br>
部弹出一个字到通用寄存器、段寄存器或字存储单元。<br>
例如:POP AX;将栈顶字单元内容弹出到AX<br>
POP DS;将栈顶字单元内容弹出到DS<br>
POP DATA-WORD;将栈顶字单元内容弹出到DATA-WORD存储。<br>
POPF;将栈顶字单元内容送回标志寄存器F。<br>
(1)将SP指向的字单元(即栈顶字单元)内容送往指定<br>
的寄存器或存储器。<br>
即:寄存器/存储器&lt;=((SP))<br>
(2)堆栈指针SP内容加2,即:SP&lt;=(SP)+2</p>
<h1 id="第三章-寻址方式与指令系统">第三章 寻址方式与指令系统</h1>
<h2 id="31-寻址方式">3.1 寻址方式</h2>
<p>一条指令通常由两大部分构成:<br>
操作码:表示该指令应完成的具体操作,如加法、减法、<br>
乘法、移位等等。在汇编语言中使用一定的符号来表示,称<br>
为助记符。如ADD 、PUSH、POP、MOV等等。<br>
操作数: 表示该指令的操作对象。如移位操作的被移位数,<br>
加法操作的加数等等。它可以是一个操作数,也可以是多个<br>
操作数。这取决于操作码部分的具体需要。<br>
寻址方式:寻找指令中所需操作数的各种方法,<br>
也就是提供指令中操作数的存放信息的方式</p>
<h3 id="intel-80868088-各指令中提供操作数的方法有以下四种">Intel 8086/8088 各指令中提供操作数的方法有以下四种:</h3>
<p>(1)立即数操作数——操作数在指令代码中提供<br>
(2)寄存器操作数——操作数在CPU的通用寄存器或段寄存器中<br>
(3)存储器操作数——操作数在内存的存储单元中<br>
(4)I/O端口操作数——操作数在输入/输出接口的寄存器中</p>
<h3 id="1立即数寻址">1.立即数寻址</h3>
<p>立即数寻址方式的指令中,所需操作数直接包含在指令代码中,这种操作数称为立即数。<br>
立即数可以是8位,也可以是16位。<br>
由于在指令执行过程中,立即数作为指令的一部分直接从BIU的指令队列中取出,它不需另外占用总线周期,因此<br>
这种寻址方式执行速度快。<br>
注意:立即数只能作为源操作数,而不能作为目的操作数。</p>
<h3 id="2寄存器寻址">2.寄存器寻址</h3>
<p>寄存器寻址方式是指指令中所需的操作数在CPU的某<br>
个寄存器中。寄存器可以是8位或16位通用寄存器,或者是<br>
段寄存器。如:AH、AL、AX、CX、DS、ES等。<br>
一个存储单元逻辑地址表示形式: 段基值:偏移量<br>
段基值由某个段寄存器提供.<br>
偏移量表示了该存储单元与段起始地址之间的距<br>
离,也叫做有效地址EA。<br>
有效地址EA是以下三个地址分量的几种组合,由CPU<br>
的执行单元EU计算出来的。<br>
(1)位移量:位移量是指令中直接给出的一个8位或16位数。<br>
一般源程序中以操作数名字(变量名或标号)的形式出现。<br>
(2)基址:由基址寄存器BX或基址指针BP提供的内容。<br>
(3)变址:由源变址寄存器SI或目的变址寄存器DI提供的内容<br>
位移量、基址和变址三个地址分量组合时,若有两个或<br>
两个以上分量时,将进行以2 16为模的十六位加法运算。</p>
<h3 id="3直接寻址">3.直接寻址</h3>
<p>在直接寻址方式的指令中,操作数的有效地址EA只有<br>
位移量地址分量<br>
可以用符号与常数表示</p>
<h3 id="4寄存器间接寻址">4.寄存器间接寻址</h3>
<p>操作数有效地址EA直接从基址寄存器(BX或BP)或<br>
变址寄存器(SI或DI)中获得。<br>
寄存器间接寻址就是事先将偏移量存放在某个寄存器(BX、<br>
BP、SI或DI)中,这些寄存器就如同一个地址指针。<br>
在程序运行期间,只要对寄存器内容进行修改,就可以实<br>
现用同一条指令实现对不同存储单元进行操作。<br>
指示存储器所在段的段寄存器可以省略,当指令中<br>
使用的是BP寄存器,则隐含表示使用SS段寄存器,其余<br>
情况则隐含使用DS段寄存器。</p>
<h3 id="5基址寻址变址寻址">5.基址寻址/变址寻址</h3>
<p>操作数的有效地址EA等于基址分量或变址分量加上指令中给出的位移量。<br>
指令中使用BX或BP时为基址寻址。指令中使用SI或DI时<br>
为变址寻址。<br>
段寄存器的隐含使用规则与寄存器间接寻址方式相同</p>
<h3 id="6基址变址寻址">6.基址变址寻址</h3>
<p>操作数的有效地址是三个地址分量之和,即:<br>
EA=基址+变址+位移量<br>
当基址选用BX时隐含使用段寄存器DS,而选用BP时则隐含使用段寄存器SS。<br>
在基址变址寻址方式中,程序运行期间有两个地<br>
址分量可以修改。因此它是最灵活的一种寻址方式,<br>
可以方便地对二维数组进行访问</p>
<h3 id="7串操作寻址方式">7.串操作寻址方式</h3>
<p>8086/8088设置有专门用于串操作的指令,这些指令的<br>
操作数虽然也在存储器中,但它们不使用前面介绍的各种<br>
寻址方式,而隐含地使用变址寄存器SI和DI专门指示。<br>
在寻找源操作数时,隐含使用SI作为地址指针。<br>
在寻找目的串时,隐含使用DI作为地址指针。<br>
在串操作完成之后,自动对SI和DI进行修改,使它们指<br>
向下一个操作数</p>
<h3 id="8-io端口寻址">8. I/O端口寻址</h3>
<p>在计算机系统,对I/O端口的寻址方式有以下两种方法。<br>
存储器编址方法<br>
将I/O端口视为存储器的一个单元,对端口的访问就如<br>
同访问存储单元一样。访问存储器的指令和各种寻址方式<br>
同样适用对I/O端口的访问。<br>
特点: 程序设计灵活,但需要占用存储地址空间。<br>
I/O端口编址方法<br>
I/O端口的地址与存储器地址分开,并使用专门的输入指令和<br>
输出指令。<br>
8086/8088系统中就是采用的这种方式。可以最多访问64K<br>
个字节端口或32K个字端口,用专门的IN指令和OUT指令访<br>
问。寻址方式有如下两种。<br>
(1) 直接端口寻址<br>
在指令中直接给出端口地址,端口地址一般采用2位十六<br>
进制数,也可以用符号表示。<br>
直接端口寻址可访问的端口数为0~255个。<br>
例如:IN AL,25H<br>
(2)寄存器间接端口寻址<br>
寄存器间接端口寻址:把I/O端口的地址先送到DX中,用<br>
DX作间接寻址寄存器。</p>
<h2 id="32-指令系统">3.2 指令系统</h2>
<p>一种计算机所能执行的各种类型的指令的集合称为该计<br>
算机的指令系统。<br>
Intel8086/8088CPU指令系统的指令可以分为六大类:<br>
1.传送类指令<br>
2.算术运算类指令<br>
3.位操作类指令<br>
4.串操作类指令<br>
5.程序转移类指令<br>
6.处理器控制类指令<br>
从指令的格式划分,一般可以分为三种:<br>
1.双操作数指令:OPR DEST SRC<br>
2.单操作数指令:OPR DEST<br>
3.无操作数指令:OPR<br>
对于无操作数指令,包含两种情况:<br>
(1)指令不需要操作数,如暂停指令HLT。<br>
(2)在指令格式中,没有显式地指明操作数,但是<br>
它隐含指明了操作数的存放地方,如指令PUSHF。</p>
<h3 id="一传送类指令">一、传送类指令</h3>
<p>传送类指令的作用是将数据信息或地址信息传送到<br>
一个寄存器或存储单元中,可以分为以下四种情况。</p>
<h4 id="1通用数据传送指令">1.通用数据传送指令</h4>
<p>指令格式:MOV DEST,SRC<br>
(1)立即数传送到通用寄存器或存储单元(2)寄存器之间的传送<br>
(3)寄存器与存储单元之间传送</p>
<h4 id="2交换指令">2.交换指令</h4>
<p>指令格式:XCHG DEST,SRC<br>
作用:源操作数和目的操作数两者内容相互交换,即:<br>
(DEST)&lt;=&gt;(SRC)</p>
<h4 id="3标志传送指令">3.标志传送指令</h4>
<p>对标志寄存器进行存取的指令有4条,它们都是无操<br>
作数指令,即指令隐含指定标志寄存器、AH寄存器或堆<br>
栈为操作数</p>
<h3 id="二算术运算类指令">二、算术运算类指令</h3>
<p>8086/8088指令系统中有加、减、乘、除指令,这<br>
些指令可以对字节数据或字数据进行运算。<br>
参加运算的数可以是无符号数,也可以是带符号<br>
数。带符号数用补码表示。<br>
参加运算的数可以是二进制数,也可以是十进制<br>
数(以BCD码表示)</p>
<h4 id="1加法指令">1.加法指令</h4>
<p>功能:目的操作数和源操作数相加,其和存放到<br>
目的操作数中,而源操作数内容保持不变,即<br>
DEST&lt;=(DEST)+(SRC)。<br>
根据相加的结果将影响到标志寄存器的CF、PF、<br>
AF、ZF、SF和OF。<br>
DEST只能是通用寄存器或存储器操作数。不能是<br>
立即数。<br>
SRC可以是通用寄存器、存储器或立即数操作数<br>
DEST和SRC不能都为存储器操作数。ADD指令可以是字节操作数相加,也可以是字操作<br>
数相加。<br>
例 分析下列各指令功能<br>
(1) ADD AX,CX<br>
功能:将寄存器AX的内容与CX的内容相加,结果传送到AX中<br>
(2) ADD AH,DATA_BYTE<br>
功能:将由直接寻址方式所指示的存储单元的内容与AH内容相<br>
加,结果送回AH中。<br>
(3) ADD CX,10H<br>
功能:将常数10H加入到CX中。为字操作数指令.<br>
(4) ADD AX, <br>
功能:将由基址变址寻址方式所指示的存储单元的内容加入到<br>
AX中。</p>
<h4 id="2带进位加法指令">2.带进位加法指令</h4>
<p>指令格式:ADC DEST,SRC<br>
该指令的功能与ADD基本相同,所不同的是其结果<br>
还要加上进位标志CF的值,即:<br>
DEST&lt;=(DEST)+(SRC)+CF<br>
根据相加的结果设置标志寄存器中的CF、PF、AF、<br>
ZF、SF和OF<br>
注意:参加运算的进位CF是本条指令执行之前的值。<br>
用ADC指令可实现数据长度大于16位的两数相加</p>
<h4 id="3加1指令">3.加1指令</h4>
<p>指令格式:INC DEST<br>
该指令为单操作数指令,其功能是将目的操作数加<br>
1,并送回到目的操作数,即:<br>
DEST&lt;=(DEST)+1<br>
目的操作数可以是任意的8位、16位通用寄存器或<br>
存储器操作数。目的操作数被视为带符号二进制数<br>
根据指令执行结果设置PF、AF、ZF、SF和OF标<br>
志,但不影响CF。INC指令主要用于某些计数器的<br>
计数和修改地址指针。</p>
<h4 id="4减法指令">4.减法指令</h4>
<p>指令格式:SUB DEST,SRC<br>
功能:目的操作数的内容减去源操作数的内容,结果<br>
送入目的操作数,源操作数中内容保持不变。<br>
即:DEST&lt;=(DEST)-(SRC)<br>
操作结果将影响标志位CF、PF、AF、ZF、SF和OF。<br>
目的操作数DEST和源操作数SRC可以是8位或16位<br>
的通用寄存器、存储器操作数,但两者不能同时为<br>
存储器操作数。立即数只能作源操作数。</p>
<h4 id="5带借位减法">5.带借位减法</h4>
<p>指令格式:SBB DEST,SRC<br>
该指令的功能与SUB指令基本相同,不同的是在两<br>
个操作数相减后再减去进位标志CF的值。<br>
即:DEST&lt;=(DEST)-(SRC)-CF。<br>
注意:该CF的值是本条指令执行前的结果。<br>
SBB指令在使用上与ADC类似,主要用于长度大于<br>
16位的数相减,即将低16位相减的结果引入高位部<br>
分的减法中。</p>
<h4 id="6减1指令">6.减1指令</h4>
<p>指令格式:DEC DEST<br>
该指令为单操作数指令,将目的操作数的内容减1<br>
后,送回到目的操作数。即:DEST&lt;=(DEST)-1<br>
DEST可以是8位或16位的通用寄存器存储器操作数,<br>
该指令将DEST看作是带符号二进制数。<br>
根据指令执行结果设置PF、AF、ZF、SF和OF,<br>
但不影响CF。<br>
DEC指令的使用类似INC指令。主要用于计数和修<br>
改地址指针,计数方向与INC指令相反。</p>
<h4 id="7求负数指令">7.求负数指令</h4>
<p>指令格式:NEG DEST<br>
功能:用零减去目的操作数的内容,并送回目的操<br>
作数,即:DEST&lt;=0-(DEST)<br>
DEST可以是任意一个8位或16位的通用寄存器或存<br>
储器操作数,被视为带符号的操作数。<br>
由于机器中带符号数用补码表示,求操作数的负数<br>
就是求补操作。因此,NEG指令也叫取补指令。<br>
NEG指令将影响标志PF、AF、ZF、SF、CF和OF。<br>
对进位标志CF的影响:<br>
只有当操作数为零时,进位标志CF被置零,其它<br>
情况都被置1.<br>
对溢出标志OF的影响:<br>
当字节操作数为-128,或字操作数为-32768时,执<br>
行NEG指令的结果操作数将无变化,但溢出标志<br>
OF被置1.</p>
<h3 id="三位操作类指令">三、位操作类指令</h3>
<h4 id="1逻辑运算指令">1.逻辑运算指令</h4>
<p>逻辑运算指令共有4条,它们的指令格式分别是:<br>
逻辑“与”指令 AND DEST,SRC<br>
逻辑“或”指令 OR DEST,SRC<br>
逻辑“异或”指令 XOR DEST,SRC<br>
逻辑“非”指令 NOT DEST</p>
<p>DEST和SRC可以是8位或16位的通用寄存器或存储<br>
器操作数,但两者不能同时为存储器操作数,SRC<br>
可以为立即数。</p>
<p>逻辑指令对标志位的影响:<br>
NOT指令对标志无影响。而其余三条指令将根据结<br>
果影响SF、ZF和PF,而CF和OF总 是置0,AF为不<br>
确定。<br>
逻辑运算指令除用来实现各种逻辑运算之外,还常<br>
用于对字节或字数据的某些位的组合、分离或位设<br>
置。</p>
<h4 id="2测试指令">2.测试指令</h4>
<p>指令格式:TEST DEST,SRC<br>
该指令的功能与AND指令相似,实现源操作数与<br>
目的操作数进行按位“逻辑与”运算,对标志位<br>
的影响与AND指令相同,但运算的结果不送入目<br>
的操作数,即目的操作数内容也将保持不变。<br>
TEST指令主要用于测试某一操作数的一位或几<br>
位的状态</p>
<h4 id="3移位循环移位指令">3.移位/循环移位指令</h4>
<p>这一类指令共有8条,分为3类。</p>
<h5 id="1算术移位">(1)算术移位</h5>
<p>算术左移 SAL DEST,COUNT<br>
算术右移 SAR DEST,COUNT</p>
<h5 id="2逻辑移位">(2)逻辑移位</h5>
<p>逻辑左移 SHL DEST,COUNT<br>
逻辑右移 SHR DEST,COUNT</p>
<h5 id="3循环移位">(3)循环移位</h5>
<p>小循环:<br>
循环左移 ROL DEST,COUNT<br>
循环右移 ROR DEST,COUNT<br>
大循环:<br>
带进位循环左移 RCL DEST,COUNT<br>
带进位循环右移 RCR DEST,COUNT<br>
这8条指令具有以下几个共同点:<br>
(1)DEST为操作对象,它可以是字节或字操作数,<br>
可以是通用寄存器或存储器操作数。<br>
当移位次数为1时,使用常数1或寄存器CL。<br>
(2)COUNT用来决定移位/循环的位数,即确定移位的次数<br>
当移位次数大于1时,必须使用寄存器CL。<br>
(3)在执行移位时,根据指令不同,每移位一次,最高<br>
位(左移)或最低位(右移)都要送到进位标志CF<br>
(4)前4条移位指令根据移位结束后修改标志位CF、<br>
PF、ZF、SF和OF,而AF不确定。而后4条循环移<br>
位指令根据移位结束后的结果仅修改CF和OF<br>
对溢出标志位OF的影响:<br>
移位次数为1时,移位前后操作数的符号位发生<br>
变化,则OF被置1,否则置0。移位次数大于1时,<br>
OF不确定<br>
指令SAL和SAR当移位次为n时,其作用相当于乘以<br>
2n或除以2n,因此被叫做算术移位指令。<br>
为了保持其算术运算结果的正确性,移位后的结果<br>
不能发生溢出。<br>
对于多字节或多字数据的移位,需要使用带进位循环移位指令。</p>
<h3 id="四处理器控制类指令">四、处理器控制类指令</h3>
<p>处理器控制类指令包括以下三种情况。<br>
它们都是无操作数指令,操作数隐含为标志寄存器的<br>
某个标志位。能直接操作的标志位有CF、IF和DF。<br>
1.标志位操作指令<br>
(1)清除进位标志CLC ;置CF为0<br>
(2)置1进位标志STC ;置CF为1<br>
(3)进位标志取反CMC ;CF的值取反<br>
(4)清除方向标志CLD;置DF为0<br>
(5)置1方向标志STD;置DF为1<br>
(6)清除中断标志CLI;置IF为0<br>
(7)置1中断标志STI;置IF为1<br>
2、与外部事件同步的指令<br>
HLT ;暂停指令<br>
WAIT ;等待指令<br>
ESC ;外部协处理器指令前缀<br>
LOCK ;总线锁定指令<br>
3、空操作指令 NOP<br>
执行一次NOP占用CPU三个时钟周期,它不改变任<br>
何寄存器或存储单元内容,主要用于延时。</p>
<h2 id="33-指令编码">3.3 指令编码</h2>
<p>汇编:将汇编语言程序转换为机器语言程序的过程<br>
汇编程序:在计算机中实现汇编过程的系统程序<br>
Intel8086/8088汇编指令的编码格式有四种基本格式。<br>
1.双操作数指令编码格式<br>
2.单操作数指令编码格式<br>
3.与AX或AL有关的指令编码格式<br>
4.其它指令编码格式</p>
<h4 id="一双操作数指令编码格式">一、双操作数指令编码格式</h4>
<p>对于象MOV、ADD、AND等双操作数指令,<br>
操作数可以是以下两种情形:<br>
一个操作数在寄存器中,另一操作数在寄存器或<br>
存储器中。<br>
目的操作数在寄存器或存储器中,源操作数是立<br>
即数。<br>
这类指令的机器目标代码长度为2~6个字节</p>
<h5 id="1操作特征部分">1.操作特征部分</h5>
<p>该字段长度为6bit。它表示了该指令所执行的功能<br>
和两个操作数的来源。<br>
(1)OPCODE:操作码字段<br>
(2)方向字段d<br>
该字段与第2部分寻址特征一起来决定源操作数和<br>
目的操作数的来源。<br>
注意:当源操作数为立即数Imm时,d字段无效,<br>
它被并入 操作码字段。<br>
(3)字/字节字段W<br>
当W=1时,表示两操作数长度为字;当W=0时,表<br>
示两操作数长度为字节。</p>
<h4 id="2寻址特征部分">2.寻址特征部分</h4>
<p>它与操作特征部分的方向字段d结合,指定两个操作<br>
数分别使用什么寻址方式,及使用哪个寄存器。它包括MOD、REG和R/M三个字段,REG字段确定<br>
一个操作数,而MOD和R/M字段确定另一个操作数。<br>
它与操作特征部分的方向字段d结合,指定两个操作<br>
数分别使用什么寻址方式,及使用哪个寄存器。<br>
当d=1时,则目的操作数由REG字段确定,而源操作<br>
数由MOD和R/M字段确定。<br>
当d=0时,则目的操作数由MOD和R/M 字段确定,而<br>
源操作数由REG字段确定。</p>
<h4 id="二单操作数指令编码格式">二、单操作数指令编码格式</h4>
<p>这种编码格式适用于只有一个操作数的指令,如INC、<br>
DEC、移位/循环等指令。指令编码为2~3字节。</p>
<h4 id="三与ax或al有关的指令编码格式">三、与AX或AL有关的指令编码格式</h4>
<h4 id="四其它指令编码格式">四、其它指令编码格式</h4>
<h1 id="第四章-汇编语言程序格式">第四章 汇编语言程序格式</h1>
<p>汇编语言语句种类及其格式<br>
汇编语言数据<br>
符号定义语句<br>
表达式与运算符<br>
程序的段结构<br>
过程定义伪指令<br>
当前位置计数器$与定位伪指令<br>
从程序返回操作系统的方法</p>
<h2 id="41-汇编语言语句种类及其格式">4.1 汇编语言语句种类及其格式</h2>
<p>汇编语言的语句可以分为指令语句和伪指令语句</p>
<h3 id="一指令语句">一、指令语句</h3>
<p>每一条指令语句在汇编时都要产生一个可供CPU执<br>
行的机器目标代码,它又叫可执行语句</p>
<h4 id="2指令助记符字段">2.指令助记符字段</h4>
<p>该字段是一条指令的必选项,它表示这条语句要求CPU完成什么具体操作,如MOV、ADD、SHL等有些指令还可以在指令助记符的前面加上前缀,实现一定的附加操作。如串操作指令前所加的重复前缀REP(见第7章介绍)等<br>
一条指令可以有一个操作数、两个操作数或者无操作数。</p>
<h4 id="3操作数字段">3.操作数字段</h4>
<p>如ADD、MOV指令需要两个操作数,INC、NOT<br>
指令只需一个操作数,而CLC指令不需要操作数</p>
<h4 id="4注释字段">4.注释字段</h4>
<p>注释字段为可选项,该字段以分号“;”开始。<br>
它的作用是为阅读程序的人加上一些说明性内容<br>
注释字段不会产生机器目标代码,它不会影响程<br>
序和指令的功能。<br>
注释字段可以是一条指令的后面部分</p>
<h3 id="二伪指令语句">二、伪指令语句</h3>
<p>伪指令语句又叫命令语句<br>
伪指令本身并不产生对应的机器目标代码。它仅<br>
仅是告诉汇编程序对其后面的指令语句和伪指令<br>
语句的操作数应该如何处理。</p>
<h4 id="2伪指令符字段">2.伪指令符字段</h4>
<p>该字段是伪指令语句的必选项,它规定了汇编<br>
程序所要完成的具体操作。本章后面的章节将对各<br>
种伪指令作详细介绍<br>
该字段是否需要,以及需要几个是由伪指令符<br>
字段来决定。</p>
<h4 id="3操作数字段-1">3.操作数字段</h4>
<p>操作数可以是一个常数(二进制、十进制、十<br>
六进制等)、字符串、常量名、变量名、标号和一<br>
些专用符号(如BYTE、FAR、PARA等)。</p>
<h4 id="4注释字段-1">4.注释字段</h4>
<p>注释字段为可选项,该字段必须以分号开始。<br>
其作用与指令语句的注释字段一样</p>
<h3 id="三标识符">三、标识符</h3>
<p>指令语句中的标号和伪指令语句中符号名统<br>
称为标识符。标识符是由若干个字符构成的。</p>
<h4 id="标识符构成规则">标识符构成规则:</h4>
<p>1.字符的个数为1~31个;<br>
2.第一个字符必须是字母、问号、@或下划线“<em>”<br>
这4种字符之一;<br>
3.从第二个字符开始,可以是字母、数字、@ 、<br>
“</em>”或问号“?”;<br>
4.不能使用属于系统专用的保留字。4.2 汇编语言数据<br>
数据是指令和伪指令语句中操作数的基本组<br>
成部分。一个数据由数值和属性两部分构成。<br>
在说明数据时不仅要指定其数值,还需说明<br>
它的属性,比如是字节数据还是字数据。<br>
在汇编语言中常用的数据形式有:常数、变<br>
量和标号。</p>
<h3 id="4一常数">4一、常数</h3>
<p>常数在汇编期间其值已完全确定,并且在程<br>
序运行过程中,其值不会发生变化。<br>
常数有以下几种形式:<br>
1.二进制数:以字母B结尾,如01001001B<br>
2.八进制数:以字母O或Q结尾,如631Q 254O<br>
3. 十进制数:以字母D结尾,或者没有结尾字<br>
母。如2007D、2007。<br>
154. 十六进制数:以字母H结尾,如3FEH,如果<br>
常数的第一个数字为字母,为了与标识符加以区<br>
别,必须在其前面冠以数字“0”。<br>
5.实数。一般格式为:<br>
±整数部分• 小数部分E ±指数部分<br>
尾数<br>
例 2.134 E +10<br>
汇编程序在汇编源程序时,可以把实数转换为4<br>
字节、8字节或10字节的二进制数形式存放。<br>
1617<br>
6.字符串常数:用引号(单引号或双引号)括起<br>
来的一个或多个字符,这些字符以它的ASCII码<br>
值存储在内存。</p>
<h3 id="二变量">二、变量</h3>
<p>变量用来表示存放数据的存储单元,这些数据在<br>
程序运行期间可以被改变 。<br>
程序中以变量名的形式来访问变量,因此,可以<br>
认为变量名就是存放数据的存储单元地址。<br>
1.变量的定义与预置<br>
定义变量就是给变量在内存中分配一定的存储单<br>
元。也就是给这个存储单元赋与一个符号名,即变量<br>
名,同时还要将这些存储单元预置初值</p>
<h3 id="三标号">三、标号</h3>
<p>标号写在一条指令的前面,它就是该指令在内存的<br>
存放地址的符号表示,也就是指令地址的别名。<br>
标号主要用在程序中需要改变程序的执行顺序时,<br>
用来标记转移的目的地,即作转移指令的操作数。</p>
<h2 id="43-符号定义语句">4.3 符号定义语句</h2>
<h3 id="一等值语句">一、等值语句</h3>
<p>语句格式:符号名 EQU 表达式<br>
功能:用符号名来表示EQU右边的表达式。后面的程序中<br>
一旦出现该符号名,汇编程序将把它替换成该表达式。<br>
表达式可以是任何形式,常见的有以下几种情况。<br>
1.常数或数值表达式<br>
COUNT EQU 5<br>
NUM EQU COUNT+5<br>
2.地址表达式<br>
ADR1被定义为在DS数据段中以BP作基址寻址的一个<br>
存储单元。<br>
ADR1 EQU DS:<br>
3.变量、寄存器名或指令助记符<br>
例如:CREG EQU CX;在后面的程序使用CREG就是使用CX<br>
CBD EQU DAA;DAA为十进制调整指令。</p>
<h3 id="二等号语句">二、等号语句</h3>
<p>格式:符号名=表达式<br>
等号语句与等值语句具有相同的作用。但等号语句可以<br>
对一个符号进行多次定义4e44ss3wwww211111111111111111111111111111111111    111111221qq12q21`</p>
<h2 id="44-表达式与运算符">4.4 表达式与运算符</h2>
<p>表达式是指令或伪指令语句操作数的常见形式。它由<br>
常数、变量、标号等通过操作运算符连接而成。<br>
注意:任何表达式的值在程序被汇编的过程中进行计算确<br>
定,而不是到程序运行时才计算</p>
<h3 id="一算术运算符">一、算术运算符</h3>
<p>1.运算符“+”和“<br>
-”也可作单目运算符,表示数的正负。38<br>
2.使用“+”、“<br>
-”、“*”、和“/”运算符时,参加运算<br>
的数和运算结果都是整数。<br>
3.“/”运算为取商的整数部分,而“MOD”运算取除法运<br>
算的余数。<br>
NUM=15*8;NUM=120<br>
NUM=NUM/7;NUM=17<br>
NUM=NUM MOD 3;NUM=2<br>
NUM=NUM+5;NUM=7<br>
NUM=-NUM-3;NUM=-10<br>
NUM=-NUM-NUM;NUM=20<br>
例如:39<br>
4. “SHR ”和“SHL ”为逻辑移位运算符<br>
5.下标运算符“[ ]”具有相加的作用</p>
<h3 id="二逻辑运算符">二、逻辑运算符</h3>
<p>逻辑运算符有NOT、AND、OR和XOR等四个,它们执<br>
行的都是按位逻辑运算</p>
<h3 id="三关系运算符">三、关系运算符</h3>
<p>关系运算符包括:EQ(等于)、NE(不等于)、LT(小<br>
于)、 LE(小于等于)、GT(大于)、 GE(大于等于)</p>
<h3 id="四数值返回运算符">四、数值返回运算符</h3>
<p>该类运算符有5个,它们将变量或标号的某些特征值或存<br>
储单元地址的一部分提取出来</p>
<h4 id="1seg运算符">1.SEG运算符</h4>
<p>作用:取变量或标号所在段的段基值。</p>
<h4 id="2offset运算符">2.OFFSET运算符</h4>
<p>该运算符的作用是取变量或标号在段内的偏移量。</p>
<h4 id="3type运算符">3.TYPE运算符</h4>
<p>作用:取变量或标号的类型属性,并用数字形式表示。对变量<br>
来说就是取它的字节长度。</p>
<h4 id="4length运算符">4.LENGTH运算符</h4>
<p>该运算符用于取变量的长度。</p>
<h4 id="5size运算符">5.SIZE运算符</h4>
<p>该运算符只能作用于变量,SIZE取值等于LENGTH和<br>
TYPE两个运算符返回值的乘积。</p>
<h3 id="五属性修改运算符">五、属性修改运算符</h3>
<p>这一类运算符用来对变量、标号或存储器操作数的类<br>
型属性进行修改或指定</p>
<h4 id="1ptr运算符">1.PTR运算符</h4>
<p>使用格式: 类型 PTR 地址表达式<br>
作用: 将地址表达式所指定的标号、变量或用其它形式表<br>
示的存储器地址的类型属性修改为 “类型”所指的值。<br>
类型可以是BYTE、WORD、DWORD、NEAR和FAR。<br>
这种修改是临时的,只在含有该运算符的语句内有效。</p>
<h4 id="2highlow运算符">2.HIGH/LOW运算符</h4>
<p>使用格式:HIGH 表达式<br>
LOW 表达式<br>
如果表达式为一个常量,则将其分离成高8位和低8位;<br>
如果表达式是一个地址(段基值或偏移量)时,则分离<br>
出它的高字节和低字节。</p>
<h4 id="3this运算符">3、THIS运算符</h4>
<p>THIS运算符一般与等值运算符EQU连用,用来定<br>
义一个变量或标号的类型属性。所定义的变量或标号的<br>
段基值和偏移量与紧跟其后的变量或标号相同。</p>
<h3 id="六运算符的优先级">六、运算符的优先级</h3>
<p>在一个表达式中如果存在多个运算符时,在计算时就有先<br>
后顺序问题。不同的运算符具有不同的运算优先级别。<br>
汇编程序在计算表达式时,按以下规则进行运算。<br>
先执行优先级别高的运算,再算较低级别运算;<br>
相同优先级别的操作,按照在表达式中的顺序,从<br>
左到右进行;<br>
可以用圆括号改变运算的顺序</p>
<h2 id="45-程序的段结构">4.5 程序的段结构</h2>
<h3 id="一段定义伪指令">一、段定义伪指令</h3>
<p>一般格式:<br>
段名 SEGMENT [定位类型] [组合类型] [‘类别名']本段语句序列</p>
<p>段名 ENDS</p>
<h3 id="三段寄存器的装入">三、段寄存器的装入</h3>
<p>段寄存器的初值(段基值)装入需要用程序的方法来实<br>
现。四个段寄存器的装入方法略有不同。</p>
<h2 id="46-过程定义伪指令procendp">4.6 过程定义伪指令(PROC/ENDP)</h2>
<p>过程名是子程序的名称,它被用作过程调用指令CALL的目<br>
的操作数。它类同一个标号的作用。具有段、偏移量和距离<br>
三个属性。而距离属性使用NEAR和FAR来指定,若没有指<br>
定,则隐含为NEAR。<br>
NEAR过程只能被本段指令调用,而FAR过程可以供其它段<br>
的指令调用。<br>
每一个过程中必须包含有返回指令RET,其作用是控制CPU<br>
从子程序中返回到调用该过程的主程序</p>
<h2 id="47-当前位置计数器与定位伪指令orgorigin">4.7 当前位置计数器$与定位伪指令ORG(Origin)</h2>
<p>汇编程序在汇编源程序时,每遇到一个逻辑段,就要为其<br>
设置一个位置计数器,它用来记录该逻辑段中定义的每一个<br>
数据或每一条指令在逻辑段中的相对位置。<br>
在源程序中,使用符号$来表示位置计数器的当前值。因<br>
此,$被称为当前计数器。它位于不同的位置具有不同的值</p>
<h2 id="49-从程序返回操作系统的方法">4.9 从程序返回操作系统的方法</h2>
<p>为了使程序运行结束后,能够正确地返回到操作系统,<br>
需要在程序中加上一些必要的语句。</p>
<h3 id="一使用程序段前缀pspprogram-segment-prefix实现返回">一、使用程序段前缀PSP(Program Segment Prefix)实现返回</h3>
<h3 id="二使用dos系统功能调用实现返回">二、使用DOS系统功能调用实现返回</h3>
<p>执行DOS功能调用4CH,也可以控制用户程序结束,<br>
并返回DOS操作系统。</p><br><br>
来源:https://www.cnblogs.com/zwh133/p/16002124.html
頁: [1]
查看完整版本: 20192405汇编语言笔记