阿撒亚丽 發表於 2022-3-13 16:09:00

20192427李睿智汇编语言学习笔记(1-4章)

<h1 id="第一章-基础知识">第一章 基础知识</h1>
<h2 id="11--汇编语言的一般概念">1.1汇编语言的一般概念</h2>
<ul>
<li>计算机程序设计语言可分为<mark>机器语言、高级<br>
语言和汇编语言</mark>三类</li>
</ul>
<h4 id="1机器语言">1.机器语言</h4>
<h5 id="1机器语言就是把控制计算机的命令和各种数据直接用二进制数码表示的一种程序设计语言">1)机器语言就是把控制计算机的<mark>命令</mark>和<mark>各种数据</mark>直接用<mark>二进制数码</mark>表示的一种程序设计语言。</h5>
<p><em>在32位二进制数表示的机器语言程序代码中,包含了乘法和加法运算操作,其中前16位代码表示了乘法运算,后16位代码表示了加法运算。</em></p>
<h5 id="2机器指令中既包含了指示运算功能的代码又给出了参加运算的操作数据表示非常详细">2)机器指令中既包含了指示运算功能的代码,又给出了参加运算的操作数据,表示非常详细。</h5>
<h4 id="优缺点">优缺点:</h4>
<h5 id="优点机器语言最直接地表示了计算机内部的基本操作用它编制的程序在计算机中运行的效率最高即运行速度最快程序长度最短">优点:机器语言最直接地表示了计算机内部的基本操作,用它编制的程序在计算机中运行的<mark>效率最高</mark>。即<mark>运行速度最快</mark>,==程序长度最短</h5>
<h5 id="缺点用二进制数表示的内容既不便于记忆又难于阅读">缺点:用二进制数表示的内容既<mark>不便于记忆又难于阅读</mark>。</h5>
<h4 id="2高级语言">2.高级语言</h4>
<h5 id="1高级语言将计算机内部的操作细节屏蔽起来用户不需要知道计算机内部数据的传送和处理的细节使用类似于自然语言的一些语句来编制程序完成指定的任务">1)高级语言将计算机内部的操作细节屏蔽起来,用户不需要知道计算机内部数据的传送和处理的细节,使用类似于自然语言的一些语句来编制程序,完成指定的任务。</h5>
<h4 id="特点">特点:</h4>
<p><strong>程序设计简单,但程序效率较机器语言低。</strong></p>
<h4 id="3汇编语言">3.汇编语言</h4>
<h5 id="1为了便于记忆和阅读使用字母和符号来表示机器语言的命令用十进制数或十六进制数来表示数据这样的计算机程序设计语言就称为汇编语言">1)为了便于记忆和阅读,使用字母和符号来表示机器语言的命令,用十进制数或十六进制数来表示数据,这样的计算机程序设计语言就称为汇编语言。</h5>
<h5 id="2-汇编语言程序与机器语言程序的关系">2) 汇编语言程序与机器语言程序的关系</h5>
<p>一条汇编语言的语句与一条机器语言指令对应<br>
<strong><mark>汇编语言程序与机器语言程序效率相同</mark></strong>.</p>
<h5 id="3不同类型计算机有不同的机器指令系统和汇编语言描述">3)不同类型计算机有不同的机器指令系统和汇编语言描述</h5>
<p>对一台计算机来说,机器语言的执行主要取决于该计算机的<strong>中央处理器CPU</strong>。因此<strong>熟悉计算机内部结构</strong>主要是指<strong>CPU的功能结构</strong>。</p>
<hr>
<h2 id="12-学习和使用汇编语言的目的">1.2 学习和使用汇编语言的目的</h2>
<ul>
<li>学习和使用汇编语言可以从根本上认识、理解计算机的工作过程。</li>
<li>在计算机系统中,某些功能必须用汇编语言程序来实现。</li>
<li>汇编语言程序的效率高于高级语言程序。</li>
</ul>
<hr>
<h2 id="13-进位计数制及其相互转换">1.3 进位计数制及其相互转换</h2>
<h4 id="1进位计数制">1)进位计数制:</h4>
<ul>
<li>使用一定个数的数码的组合来表示数字,这种表示方法称为进位计数制。<strong>根据所使用的数码的个数,就产生了不同的进位计数制。</strong></li>
<li>将各个位置上所表示的基本数值称为位权, 简称<strong>权</strong>。</li>
<li>不同的进位制和不同的位置其位权是不同的。<strong>位权乘以对应位置上的数码就等于该数位上数值的大小。</strong></li>
<li>每个数位上能使用不同数码的个数称为<strong>基数</strong>。</li>
<li><strong>每个数位能取的最大数码值=基数-1。</strong><br>
(<mark>在计算机中数据表示一般采用二进制数</mark>,因为它在计算机中最容易表示和存储,且适合于逻辑值的表达与运算。)</li>
<li>二进制与8进制、16进制之间有非常简单的转换关系:<strong>3位二进制数与一位8进制数对应,4位二进制数与一位16进制数对应。</strong></li>
<li>在书写不同进位计数制数时,为了区别,常在数的尾部用一个字母来表示:</li>
</ul>
<p>B(Binary)--二进制数</p>
<p>O (Octal)或Q--八进制数</p>
<p>D (Decimal)--十进制数</p>
<p>H (Hexadecimal)--十六进制数。</p>
<p>如未使用任何字母,则默认表示是十进制数。</p>
<h4 id="2各种数制间的相互转换">2)各种数制间的相互转换</h4>
<p><strong>1. 十进制整数转换为二进制数</strong><br>
两种转换方法 :</p>
<p>(1)减权定位法</p>
<ul>
<li>从二进制数高位起,依次用待转换的十进制数与各位权值进行比较;</li>
<li>如够减,则该数位系数Ki=1,同时减去该位权值,余数作为下一次比较的值;</li>
<li>如不够减,则Ki=0 。</li>
</ul>
<p>(2)除基取余法</p>
<ul>
<li>将十进制数除以基数2,其余数为二进制数的最低位,再用其商除2,其余数为次低位,反复做下去,直到商0.</li>
</ul>
<p><strong>2.十进制小数转换为二进制数</strong>:</p>
<p>(1)减权定位法:<br>
转换时应根据程序要求的精度或计算机的字长来确定二进制的位数.</p>
<p>(2)乘积取整法</p>
<p><strong>3.二进制整数转换为十进制数</strong></p>
<p>(1)按权相加法</p>
<p>(2)逐次乘基相加法</p>
<p><strong>4.二进制小数转换为十进制数</strong></p>
<p>(1)按权相加法</p>
<p>(2)逐次除基相加法</p>
<p><strong>5.二进制与八进制和十六进制间的转</strong>换</p>
<p>二进制与八进制和十六进制之间的对应关系很简单:<br>
<strong>三位二进制数对应一位八进制数,四位二进制数对应一位十六进制数</strong></p>
<hr>
<h2 id="14带符号数的表示">1.4带符号数的表示</h2>
<ul>
<li>在一般算术表示中使用”“+”和“-”来表示正数与负数,而在计算机中使用“0”和“1”来表示正数和负数。</li>
<li>用“+”或“-”表示正负的数叫<br>
真值<br>
用“0”或“1”表示正负的数叫机器 带符号的机器数可以用原码、反码和补码三种不同码制来 数 表示。一般计算机中大多采用补码表示。</li>
</ul>
<h4 id="一原码表示">一,原码表示</h4>
<ul>
<li>
<p>二进制数的最高位表示符号,<strong>0表示正,1表示负</strong>。数值部分用二进制数绝对值表示。</p>
</li>
<li>
<p>8位二进制数原码的</p>
</li>
</ul>
<p>最大数为01111111(+127)</p>
<p>最小数为11111111 (-127)</p>
<p>8位二进制数表示范围:-127≤X≤+127</p>
<ul>
<li>0的原码有两种表示形式:<mark>00000000和10000000(+0和-0)</mark></li>
</ul>
<h4 id="二补码的表示">二,补码的表示</h4>
<ul>
<li><strong>补码的定义</strong></li>
</ul>
<p>带符号数X的补码表示补定义为:</p>
<p>补=M+X (Mod M)</p>
<p>其中模数M根据机器数的位数而定,如位数为8则M=28用补码表示的机器数,符号位仍然表示数的符号:0为正,1为<br>
负。对于正数,补码与原码相同,对于负数需要进行变换。</p>
<ul>
<li><strong>由真值,原码变换为补码</strong></li>
</ul>
<p>由于正数的原码与补码相同,下面讨论负数的变换方法。</p>
<p>负数的真值变换为补码的方法:将各位变反(0变1,1变0)然后在最低位加1.</p>
<p>负数的原码变换为补码:保持符号位不变,其余各位变反,最低位加1。</p>
<ul>
<li><strong>补码数的表示范围</strong></li>
</ul>
<p>当位数为8时,</p>
<p>最大补码为01111111=[+127]补</p>
<p>最小补码为10000000=[-128]补</p>
<p>0的补码只有一个,<br>
补=00000000,而10000000是[-128]补</p>
<p>11111111=[-1]补</p>
<p>对于16位数,则补码表示范围为-32768~+32767</p>
<ul>
<li><strong>补码的加减运算</strong></li>
</ul>
<p>规则:</p>
<p>补=补+补</p>
<p>补=补-补=补+[-Y]补</p>
<p>其中[-Y]补是对补执行一次求补运算</p>
<p>求补运算是将原数连同符号位一起(不管是正还是负)按位求反,再在最低位加1。</p>
<p><strong>(1)加法运算:</strong></p>
<p>X+Y</p>
<p>补+补</p>
<p><strong>(2)减法运算:</strong></p>
<p>补-补=补+[-Y]补</p>
<hr>
<h2 id="15字符的表示">1.5字符的表示</h2>
<ul>
<li>在计算机内部,各种字符(字母、符号、数字码)都是按一定的方式编写成二进制信息。不同的计算机以及不同的场合所采用的编码形式可能不同。目前<mark>最广泛采用的是ASCII码</mark></li>
<li>标准ASCII码共有128个,可分为两类:</li>
</ul>
<p>非打印ASCII码,共33个,用于控制操作, 如BEL(响铃07H),DEL(删除7FH),CR(回车,0DH), LF(换行,0AH).</p>
<p>可打印ASCII码共有95个,如数字符0~9,大小写字母等。</p>
<hr>
<h2 id="16基本逻辑运算">1.6基本逻辑运算</h2>
<ul>
<li>计算机内部采用二进制数表示信息,具有<strong>物理实现容易、可靠性高</strong>的优点,且由于状态“0”和“1”正好与逻辑运算中的逻辑“真”和“假”对应,因此可以用“0”和“1”来表示逻辑变量的取值,很容易地实现各种复杂的逻辑运算。</li>
</ul>
<h5 id="1-与运算">1. “与”运算</h5>
<p>F=A ∧ B 或 F=A · B</p>
<p>0 ∧ 0 =0 0 ∧ 1 = 0 1 ∧ 0 = 0 1 ∧ 1 =1</p>
<h5 id="2或运算">2.“或”运算</h5>
<p>F=A ∨B F=A +B</p>
<p>0 ∨0=0 0 ∨1=1 1 ∨0=1 1 ∨1=1</p>
<h5 id="3非运算">3.“非”运算</h5>
<p>如A为1,则 非A=0,若A为0,则非A=1</p>
<p>非 1 = 0非 0 = 1</p>
<h5 id="4异或运算">4.“异或”运算</h5>
<p>F =A ⊕ B</p>
<p>1 ⊕ 1=0 1 ⊕ 0=1 0 ⊕ 1=1 0⊕ 0=0</p>
<hr>
<hr>
<h1 id="第二章-ibm-pc微机的功能结构">第二章 IBM-PC微机的功能结构</h1>
<h2 id="21-ibm-pc微机基本结构">2.1 IBM-PC微机基本结构</h2>
<h3 id="一微机的一般构成">一,微机的一般构成</h3>
<p>:<strong>运算器、控制器、存储器、输入设备和输出设备。</strong></p>
<ul>
<li>将运算器和控制器两大部件集成在一个集成电路芯片上,称为中央处理器 ,简称CPU,也叫微处理器</li>
<li>系统采用总线结构,具有较大的灵活性和扩展性。</li>
</ul>
<h5 id="1中央处理器cpu">1,中央处理器CPU</h5>
<p>功能:分析从主存储器取来的各条指令的功能,控制计算机各部件完成指定功能的各项操作。</p>
<h5 id="2主存储器">2,主存储器</h5>
<ul>
<li>主存储器是用来存放程序和数据的部件。它由若干个存储单元构成。</li>
<li>存储单元的多少表示存储器的容量。每个存储单元使用一个唯一的编号来标识,称为存储单元的地址。</li>
<li>对每个存储单元内容的存和取是按照地址进行访问的。</li>
<li>习惯上<strong>将CPU与主存储器合称为主机</strong></li>
<li>在计算机中,除了主存储器之外,一般还配置有<strong>辅助存储器</strong>,简称<strong>辅存</strong>。由于它的位置是在主机之外,因此也叫做<strong>外存</strong></li>
</ul>
<h5 id="3输入输出设备及接口">3,输入输出设备及接口</h5>
<ul>
<li>输入设备将外部信息(程序、数据和命令)送入计算机。包括键盘、鼠标等</li>
<li>输出设备将计算机处理后的结果转换为人或其它系统能识别的信息形式向外输出。如显示器、打印机等</li>
<li>有的设备既具有输入功能又具有输出功能。如磁盘、磁带、触摸显示屏等。</li>
<li>由于I/O设备的工作速度、工作原理以及所处理的信息格式等与主机相差很大,因此I/O设备要通过I/O接口才能与系统总线连接。</li>
<li>I/O接口是主机与I/O设备之间设置的逻辑控制部件。通过它实现主机与I/O设备间的信息传送。</li>
</ul>
<h5 id="4系统总线">4,系统总线</h5>
<ul>
<li>系统总线将CPU、存储器和I/O设备连接起来,实现各大部件之间的各种信息传送。</li>
<li>系统总线包括<strong>地址总线</strong>、<strong>数据总线</strong>和<strong>控制总线</strong>三组。<br>
它们分别用于传送不同的信息。</li>
</ul>
<h3 id="二intel-80868088-cpu的功能结构">二,Intel 8086/8088 CPU的功能结构</h3>
<ul>
<li>汇编语言程序是由一系列的指令(指令序列)构成。</li>
<li>指令是构成汇编语言程序的最基本单位,就象高级语言中的语句。</li>
<li>CPU执行指令序列就是重复执行以下两个步骤:</li>
</ul>
<p><strong>从存储器中取指令</strong></p>
<p><strong>执行指令规定的操作</strong></p>
<p>这两个步骤的执行又分为<strong>串行方式</strong>和<strong>指令流水线</strong>方式。</p>
<p><strong>1)串行方式</strong>:<br>
特点</p>
<p>(1)当CPU在指令执行阶段,不需要占用系统总线,但此时总线也不工作,因此系统总线的空闲时间比较多 。</p>
<p>(2)在从存储器取指令、取数据或存数据时,总线处于忙状态,其所占用的时间也较长。而CPU却只需要花很短的<br>
时间去处理,因此大部分时间处于闲置状态。</p>
<p>采用<strong>串行工作方式的计算机其运行速度较慢</strong></p>
<p><strong>2)指令流水线方式</strong>:特点</p>
<p>(1)采用指令流水线工作方式的计算机具有较高的工作效率。CPU内部采用了一种先进的指令流水线结构,这种结构<br>
可以有效而充分地利用各主要硬件资源。</p>
<h6 id="8086cpu">8086CPU</h6>
<p>(1)执行单元EU</p>
<p>EU的主要任务是分析与执行指令</p>
<p>(2)总线接口单元BIU</p>
<p>BIU负责CPU与存储器、I/O的信息传送</p>
<h2 id="22-intel80868088cpu寄存器结构及其用途">2.2 Intel8086/8088CPU寄存器结构及其用途</h2>
<h4 id="一通用寄存器">一,通用寄存器</h4>
<h5 id="1数据寄存器">1,数据寄存器</h5>
<p>它包括AX、BX、CX和DX四个寄存器。它们中的每一<br>
个既可以是16位寄存器,也可以分成两个8位寄存器使用。即可以当作8个独立的8位寄存器使用。</p>
<p>数据寄存器既可以用来存放参加运算的操作数,也可以存放运算的结果。在多数情况下,使用这些寄存器时必须在<br>
指令中明确指示。</p>
<h5 id="2指针寄存器">2,指针寄存器</h5>
<p>指针寄存器有堆栈指针SP和基址指针BP</p>
<h6 id="sp指针">sp指针</h6>
<p>在进行堆栈操作时,被隐含使用,被用来指向<br>
堆栈顶部单元。</p>
<h6 id="bp指针">BP指针</h6>
<p>被用来指向堆栈段内某一存储单元。BP除用作地址指针外也可以象数据寄存器一 样,存放参加运算的操作数和运算的结果。</p>
<h5 id="3变址寄存器">3,变址寄存器</h5>
<p>有两个16位的变址寄存器SI和DI,一般被用来作地址指针</p>
<p>SI——源变址寄存器</p>
<p>DI——目的变址寄存器</p>
<h4 id="二段寄存器">二,段寄存器</h4>
<ul>
<li>8086/8088CPU在使用存储器时,将它划分成若干个段。</li>
<li>每个段用来存放不同的内容,如程序代码、数据等等。</li>
<li>每个存储段用一个段寄存器来指明该段的起始位置(也叫段基址)。</li>
</ul>
<h6 id="cpu在访问存储器时必须指明两个内容">CPU在访问存储器时必须指明两个内容:</h6>
<p>(1)所访问的存储单元属于哪个段,即指明使用的段寄存器。<br>
(2)<strong>该存储单元与段起始地址(段基址)的相距多少</strong>,即偏移量。</p>
<h4 id="三指令指针ip">三,指令指针IP</h4>
<ul>
<li>CPU在从存储器取指令时,以段寄存器CS作为代码段的基址指针,以IP的内容作为偏移量,共同形成一条指令的存放地址。</li>
<li>当CPU从内存中取出一条指令后,IP内容自动修改为指向下一条指令。</li>
</ul>
<h5 id="注意ip的内容不能被直接访问既不能用指令去读ip的值也不能用指令给它赋值但是可以通过某些指令的执行而自动修改ip的内容">注意:IP的内容不能被直接访问,既不能用指令去读IP的值,也不能用指令给它赋值。但是可以通过某些指令的执行而自动修改IP的内容。</h5>
<h4 id="四标志寄存器">四,标志寄存器</h4>
<ul>
<li>标志寄存器是用来反映CPU在程序运行时的某些状态,如是否有进位、奇偶性、结果的符号、结果是否为零等等。</li>
</ul>
<h5 id="1进位标志位cf">1,进位标志位CF</h5>
<ul>
<li>在进行算术运算时,若最高位(对字操作是第15位,字节操作是第7位)产生进位或借位时CF被自动置“1”,否则置“0”</li>
<li>在移位类指令中,CF也被用来存放从最高位(左移时)或最低位(右移时)移出的数值(0或1)。</li>
</ul>
<h5 id="2奇偶标志位pf">2,奇偶标志位PF</h5>
<ul>
<li>当指令操作结果的低8位中含有1的个数为偶数时,则PF被置1,否则PF被置0。</li>
</ul>
<h5 id="注意pf只反映操作结果的低8位的奇偶性与指令操作数的长度无关">注意:PF只反映操作结果的低8位的奇偶性,与指令操作数的长度无关。</h5>
<h5 id="3辅助进位标志位af">3,辅助进位标志位AF</h5>
<ul>
<li>在进行算术运算时,若低字节的低四位向高4位产生进位或借位,即第3位产生进位或借位时,AF位被置1,否则置0。AF标志位用于十进制运算的调整。</li>
</ul>
<h5 id="注意af只反映运算结果低八位与操作数长度无关">注意:AF只反映运算结果低八位,与操作数长度无关。</h5>
<h5 id="4零值标志位zf">4,零值标志位ZF</h5>
<ul>
<li>若运算结果各位全为0,则ZF被置1,否则置0。</li>
</ul>
<h5 id="5符号标志位sf">5,符号标志位SF</h5>
<ul>
<li>将运算结果视为带符号数,当运算结果为负数时SF被置1,为正数时,则置0</li>
</ul>
<h5 id="6溢出标志位of">6,溢出标志位OF</h5>
<ul>
<li>当运算结果超过机器用补码所能表示数的范围时,则OF置1,否则置0.</li>
<li>字节数据,机器用补码所能表示的数范围为-128~+127。<br>
字数据的表示范围为:-32768~+32767</li>
</ul>
<h5 id="注意溢出与进位是两个完全不同的概念不能相互混淆">注意:溢出与进位是两个完全不同的概念,不能相互混淆。</h5>
<h5 id="7单步标志位tf">7,单步标志位TF</h5>
<ul>
<li>单步标志也叫跟踪位,该标志为控制标志位。单步标志位供调试程序使用。</li>
<li>当TF位被设置为1时,每执行一条指令后,CPU暂停运行,即产生单步中断。</li>
</ul>
<h5 id="8中断允许标志位if">8,中断允许标志位IF</h5>
<ul>
<li>该标志位为控制标志位。当IF被设置为1时,CPU可以响应可屏蔽中断,否则不允许响应可屏蔽中断。</li>
</ul>
<h5 id="9方向标志位df">9,方向标志位DF</h5>
<ul>
<li>DF也是控制标志位。它被用来规定串操作指令的增减方向。</li>
</ul>
<h2 id="23存储器组织结构">2.3存储器组织结构</h2>
<h3 id="一存储器的组成">一,存储器的组成</h3>
<h4 id="1存储器是由若干个存储单元构成">1,存储器是由若干个存储单元构成</h4>
<p>存储单元的多少就表示了存储器的容量。</p>
<h4 id="2每个存储单元存放相同长度的二进制数">2,每个存储单元存放相同长度的二进制数</h4>
<p>一个存储单元的长度一般为8位二进制数,即一个字节。</p>
<h4 id="3每个存储单元有一个唯一的地址编号地址">3,每个存储单元有一个唯一的地址编号——地址</h4>
<h4 id="4任何两个相邻字节单元就构成一个字单元">4,任何两个相邻字节单元就构成一个字单元</h4>
<ul>
<li>一个字存储单元(WORD)的长度为16位二进<br>
制数,即两个字节。字单元的地址为两个字节单元中<br>
较小地址字节单元的地址。</li>
<li>16位长数据的存放规则是低8位放在较低地址字<br>
节单元中,高8位放在较高地址字节单元中。</li>
</ul>
<h4 id="5在定义一个地址时必须指出是字节或字类型属性">5,在定义一个地址时必须指出是字节或字类型属性</h4>
<p>由于存储单元可分为字单元和字节单元,因此8086/8088CPU访问内存的指令中,分为字节访问和字访问两种指令。</p>
<h3 id="二存储器的段结构">二,存储器的段结构</h3>
<h4 id="80868088系统的存储器段结构具有以下几个特点">8086/8088系统的存储器段结构具有以下几个特点:</h4>
<h5 id="180868088cpu将1mb的存储空间划分成若干个段每个段最大长度为64k65536个字节单元组成">1,8086/8088CPU将1MB的存储空间划分成若干个段,每个段最大长度为64K(65536)个字节单元组成。</h5>
<h5 id="2每个段的基址段基址必须是一个小节的首址">2,每个段的基址(段基址)必须是一个小节的首址。</h5>
<p><mark>段基址:一个段的起始地址。</mark></p>
<h5 id="3逻辑段在物理存储器中可以是邻接的间隔的部分重叠的和完全重叠的等4种情况">3,逻辑段在物理存储器中可以是邻接的、间隔的、部分重叠的和完全重叠的等4种情况。</h5>
<h5 id="4在任一时刻一个程序只能访问4个当前段中的内容">4,在任一时刻,一个程序只能访问4个当前段中的内容。</h5>
<h3 id="三逻辑地址与物理地址及对应关系">三,逻辑地址与物理地址及对应关系</h3>
<h4 id="1物理地址">1,物理地址</h4>
<p>在1MB的存储空间中,每个存储单元的物理地址是唯一的,它就是该存储单元的20位地址。</p>
<p>8086/8088的物理地址范围:00000H~0FFFFFH</p>
<p>CPU与存储器之间的任何信息交换都使用物理地址。</p>
<h4 id="2逻辑地址">2,逻辑地址</h4>
<p>在程序设计中,为了便于程序的开发和对存储器进行动态管理,使用了逻辑地址。</p>
<p>一个逻辑地址包括两个部分:段基值和偏移量</p>
<p>段基值:存放在某一个段寄存器中,是一个逻辑段的起始单元地址(段基址)的高16位。</p>
<p>偏移量:表示某个存储单元与它所在段的段基址之间的字节距离</p>
<p>逻辑地址的表示方法:<strong>段基值,偏移量。</strong></p>
<h4 id="3逻辑地址转换为物理地址">3,逻辑地址转换为物理地址</h4>
<ul>
<li>当CPU要访问存储器时,需要由总线接口单元BIU将逻辑地址转换成物理地址。</li>
<li>转换方法:将逻辑地址的段基值左移4位,形成20位的段基址(低位为0)然后与16位的偏移量相加,结果即为20位的物理地址。</li>
</ul>
<h4 id="4逻辑地址的来源">4,逻辑地址的来源</h4>
<ul>
<li>在程序的执行过程中,CPU根据不同操作类型访问存储器,其逻辑地址中段基值和偏移量的来源是不一样的。</li>
</ul>
<h5 id="说明">说明:</h5>
<p>(1)允许替代来源也叫做段超越,它表示了段基值除使用隐含的段寄存器外是否可以指定其它段寄存器来提供。</p>
<p>(2)有效地址EA,它表示根据指令所采用的寻址方式(下一章介绍)计算出来的段内偏移量</p>
<h2 id="24堆栈及其操作方法">2,4堆栈及其操作方法</h2>
<ul>
<li>堆栈是一个特定的存储区,访问该存储区一般需要按照专门的规则进行操作。</li>
<li>堆栈的用途:主要用于暂存数据以及在过程调用或处理中断时保存断点信息</li>
</ul>
<h3 id="一堆栈的构造">一,堆栈的构造</h3>
<h4 id="堆栈一般分为专用堆栈存储器-和-软件堆栈">堆栈一般分为:<strong>专用堆栈存储器</strong> 和 <strong>软件堆栈</strong></h4>
<h6 id="专用堆栈存储器">专用堆栈存储器</h6>
<p>按堆栈的工作方式专门设计的存储器</p>
<h6 id="软件堆栈">软件堆栈</h6>
<ul>
<li>由程序设计人员用软件在内存中划出的一块存储区作为堆栈来使用。8086/8088采用这种方式。</li>
<li>在堆栈中存取数据的规则是:“先进后出FILO” (First-InLast-Out)。即最先送入堆栈的数据要到最后才能取出,而最后送入堆栈的数据,最先取出。</li>
</ul>
<h3 id="二80868088堆栈的组织">二,8086/8088堆栈的组织</h3>
<ul>
<li>顶由堆栈指针SP指示。SP中内容始终表示堆栈段基址与栈顶之间的距离(字节数)。当SP内容为最大(初始)值时,表示堆栈为空。而当(SP)=0时,表示堆栈全满.</li>
<li>当SP被初始化时,指向栈底+2单元,<strong>其值就是堆栈的长度</strong>。由于SP是16位寄存器,因此堆栈长度≤64K字节。</li>
<li>数据在堆栈中的存放格式是:以<strong>字</strong>为单位存放,数据的<strong>低8位</strong>放在<strong>较低</strong>地址单元,<strong>高8位</strong>放在<strong>较高</strong>地址单元</li>
<li>当用户程序中要求的堆栈长度超过一个堆栈段的最大长度64KB时,可以设置几个堆栈段。</li>
<li>通过改变堆栈段寄存器SS的内容,即可改变到另一个堆栈段,当改变了堆栈段寄存器SS的内容后,必须紧接着赋予SP新值。</li>
</ul>
<h3 id="三堆栈操作">三,堆栈操作</h3>
<h5 id="1设置堆栈">1,设置堆栈</h5>
<p>设置堆栈主要是对堆栈段寄存器SS和堆栈指针SP赋值。</p>
<h5 id="2进栈push">2,进栈PUSH</h5>
<p>进栈就是把数据存入堆栈。由指令PUSH或者由机器自动实现,可以将通用寄存器、段寄存器或字存储单元的内容压入堆栈顶部</p>
<p><strong>进栈的执行过程</strong>:</p>
<ul>
<li>(1)首先将堆栈指针SP减2,即指向一个空的堆栈字单元<br>
SP&lt;=(SP)-2</li>
<li>(2)将要储存的内容(寄存器或存储单元的内容)送入SP指向的字单元中。(SP)&lt;=数据</li>
</ul>
<p><strong>出栈的操作过程</strong>:</p>
<ul>
<li>(1)将SP指向的字单元(即栈顶字单元)内容送往指定的寄存器或存储器。即:寄存器/存储器&lt;=((SP))</li>
<li>(2)堆栈指针SP内容加2,即:SP&lt;=(SP)+2</li>
</ul>
<hr>
<hr>
<h1 id="第三章--寻址方式与指令系统">第三章寻址方式与指令系统</h1>
<h2 id="31寻址方式">3.1寻址方式</h2>
<ul>
<li>一条指令通常由两大部分构成:<br>
<strong>操作码和操作数</strong></li>
</ul>
<h5 id="操作码">操作码</h5>
<p>表示该指令应完成的具体操作,如加法、减法、乘法、移位等等。在汇编语言中使用一定的符号来表示,称为助记符。如ADD 、PUSH、POP、MOV等等。</p>
<h5 id="操作数">操作数</h5>
<p>表示该指令的操作对象。如移位操作的被移位数,加法操作的加数等等。它可以是一个操作数,也可以是多个操作数。这取决于操作码部分的具体需要。</p>
<h4 id="寻址方式">寻址方式:</h4>
<p>寻找指令中所需操作数的各种方法,也就是提供指令中操作数的存放信息的方式。</p>
<h4 id="intel-80868088-各指令中提供操作数的方法有以下四种">Intel 8086/8088 各指令中提供操作数的方法有以下四种</h4>
<p>(1)立即数操作数</p>
<p>(2)寄存器操作数</p>
<p>(3)存储器操作数</p>
<p>(4)I/O端口操作数</p>
<p><strong>1.立即数寻址</strong></p>
<p>立即数寻址方式的指令中,所需操作数直接包含在指令代码中,这种操作数称为立即数。立即数可以是8位,也可以是16位。</p>
<p><strong>2.寄存器寻址</strong></p>
<p>寄存器寻址方式是指指令中所需的操作数在CPU的某个寄存器中。寄存器可以是8位或16位通用寄存器,或者是段寄存器。如:AH、AL、AX、CX、DS、ES等。</p>
<p><strong>3.直接寻址</strong></p>
<p>在直接寻址方式的指令中,操作数的有效地址EA只有位移量地址分量。</p>
<p><strong>4.寄存器间接寻址</strong></p>
<p>操作数有效地址EA直接从基址寄存器(BX或BP)或变址寄存器(SI或DI)中获得。</p>
<p><strong>5.基址寻址和变址寻址</strong></p>
<p>操作数的有效地址EA等于基地址分量或变址分量加上指令中给出的位移量。</p>
<p><strong>6.基址变址寻址</strong></p>
<p>操作数的有效地址是三个地址分量之和,即:EA=基址+变址+位移量</p>
<p><strong>7.串操作寻址方式</strong></p>
<p>8086/8088设置有专门用于串操作的指令,这些指令的操作数虽然也在存储器中,但它们不使用前面介绍的各种寻址方式,而隐含地使用变址寄存器SI和DI专门指示。</p>
<p><strong>8. I/O端口寻址</strong></p>
<ul>
<li>存储器编址方法</li>
<li>I/O端口编址方法</li>
</ul>
<p>(1)直接端口寻址</p>
<p>在指令中直接给出端口地址,端口地址一般采用2位十六进制数,也可以用符号表示。</p>
<p>(2)寄存器间接端口寻址</p>
<p>寄存器间接端口寻址:把I/O端口的地址先送到DX中,用DX作间接寻址寄存器。</p>
<h2 id="32指令系统">3.2指令系统</h2>
<ul>
<li>一种计算机所能执行的各种类型的指令的集合称为该计算机的指令系统。</li>
<li>Intel8086/8088CPU指令系统的指令可以分为六大类:</li>
</ul>
<p>1.传送类指令</p>
<p>2.算术运算类指令</p>
<p>3.位操作类指令</p>
<p>4.串操作类指令</p>
<p>5.程序转移类指令</p>
<p>6.处理器控制类指令</p>
<h3 id="一传送类指令">一,传送类指令</h3>
<ul>
<li>传送类指令的作用是将数据信息或地址信息传送到一个寄存器或存储单元中,可以分为以下四种情况。</li>
</ul>
<p><strong>1.通用数据传送指令</strong></p>
<p><strong>指令格式</strong>:MOVDEST,SRC</p>
<p><strong>作用</strong>:将源操作数指定的内容传送到目的操作数,即DEST&lt;=(SRC)。</p>
<ul>
<li>MOV指令可以分为以下几种情况:</li>
</ul>
<p>1)立即数传送到通用寄存器或存储单元</p>
<p>2)寄存器之间的传送</p>
<p>3)寄存器与存储单元之间传送</p>
<p><strong>2.交换指令</strong></p>
<p><strong>指令格式</strong>:XCHGDEST,SRC</p>
<p><strong>作用</strong>:源操作数和目的操作数两者内容相互交换,即:(DEST)&lt;=&gt;(SRC)。指令对标志寄存器各位无影响</p>
<p><strong>3.标志传送指令</strong></p>
<p>1)取标志寄存器指令</p>
<p><strong>指令格式</strong>:LAHF</p>
<p><strong>作用</strong>:将标志寄存器的低8位送入AH寄存器,即将标志SF、ZF、AF、PF和CF分别送入AH的第7、6、4、2、0位,而AH的第5、3、1位不确定。</p>
<p>2)存储标志寄存器指令</p>
<p><strong>指令格式</strong>:SAHF</p>
<p><strong>作用</strong>:将寄存器AH中的第7、6、4、2、0位分别送入标志寄存器的SF、ZF、AF、PF和CF各标志位。而标志寄存器高8位中的各标志位不受影响。</p>
<p>3)标志进栈指令</p>
<p><strong>指令格式</strong>:PUSHF</p>
<p><strong>作用</strong>:先将堆栈指针SP减2,使其指向堆栈顶部的空字单元,然后将16位标志寄存器的内容送SP指向的字单元。</p>
<p>4)标志出栈指令</p>
<p><strong>指令格式</strong>:POPF</p>
<p><strong>作用</strong>:将由SP指向的堆栈顶部的一个字单元的内容送入标志寄存器,然后SP的内容加2.</p>
<p><strong>4.地址传送指令</strong></p>
<ul>
<li>这类指令有3条,它们的作用是将存储单元的地址送寄存器。</li>
</ul>
<p>1)装入有效地址</p>
<p><strong>格式</strong>:LEADEST,SRC</p>
<p><strong>作用</strong>:将SRC存储单元地址中的偏移量,即有效地址EA传送到一个16位通用寄存器中。</p>
<p>2)装入地址指针指令</p>
<p><strong>格式</strong>:<br>
LDSDEST,SRC<br>
LESDEST,SRC</p>
<p><strong>作用</strong>:把SRC存储单元开始的4个字节单元的内容(32位地址指针)送入DEST通用寄存器和段寄存器DS(LDS指令)或ES(LES指令),其中低字单元内容为偏移量送通用寄存器,高字单元内容为段基值送DS或ES。</p>
<h3 id="二算术运算类指令">二、算术运算类指令</h3>
<h4 id="1加法指令">1,加法指令</h4>
<p><strong>指令格式</strong>:ADDDEST,SRC</p>
<p><strong>功能</strong>:目的操作数和源操作数相加,其和存放到目的操作数中,而源操作数内容保持不变,即DEST&lt;=(DEST)+(SRC)。</p>
<ul>
<li>ADD指令可以是字节操作数相加,也可以是字操作数相加。</li>
</ul>
<h4 id="2带进位加法指令">2.带进位加法指令</h4>
<p><strong>指令格式</strong>:ADCDEST,SRC</p>
<p><strong>功能</strong>:该指令的功能与ADD基本相同,所不同的是其结果还要加上进位标志CF的值,即:   DEST&lt;=(DEST)+(SRC)+CF</p>
<h4 id="3加1指令">3.加1指令</h4>
<p><strong>指令格式</strong>:INCDEST</p>
<p><strong>功能</strong>:该指令为单操作数指令,其功能是将目的操作数加1,并送回到目的操作数,即:DEST&lt;=(DEST)+1</p>
<h4 id="4减法指令">4.减法指令</h4>
<p><strong>指令格式</strong>:SUBDEST,SRC</p>
<p><strong>功能</strong>:目的操作数的内容减去源操作数的内容,结果送入目的操作数,源操作数中内容保持不变。即:DEST&lt;=(DEST)-(SRC)</p>
<h4 id="5带借位减法">5.带借位减法</h4>
<p><strong>指令格式</strong>:SBBDEST,SRC</p>
<p><strong>功能</strong>:该指令的功能与SUB指令基本相同,不同的是在两个操作数相减后再减去进位标志CF的值。即:DEST&lt;=(DEST)-(SRC)-CF。</p>
<h4 id="6减1指令">6.减1指令</h4>
<p><strong>指令格式</strong>:DECDEST</p>
<p><strong>功能</strong>:该指令为单操作数指令,将目的操作数的内容减1后,送回到目的操作数。即:DEST&lt;=(DEST)-1</p>
<h4 id="7求负数指令">7.求负数指令</h4>
<p><strong>指令格式</strong>:NEGDEST</p>
<p><strong>功能</strong>:用零减去目的操作数的内容,并送回目的操作数,即:DEST&lt;=0-(DEST)</p>
<h3 id="三位操作类指令">三、位操作类指令</h3>
<h4 id="1逻辑运算指令">1.逻辑运算指令</h4>
<ul>
<li>逻辑运算指令共有4条,它们的指令格式分别是:</li>
</ul>
<p>逻辑“与”指令   ANDDEST,SRC</p>
<p>逻辑“或”指令   OR   DEST,SRC</p>
<p>逻辑“异或”指令 XORDEST,SRC</p>
<p>逻辑“非”指令   NOTDEST</p>
<h4 id="2测试指令">2.测试指令</h4>
<p><strong>指令格式</strong>:TESTDEST,SRC</p>
<p><strong>功能</strong>:该指令的功能与AND指令相似,实现源操作数与目的操作数进行按位“逻辑与”运算,对标志位的影响与AND指令相同,但运算的结果不送入目的操作数,即目的操作数内容也将保持不变。</p>
<h4 id="3移位循环移位指令">3.移位/循环移位指令</h4>
<h5 id="1算术移位">1)算术移位</h5>
<p>算术左移SALDEST,COUNT</p>
<p>算术右移SARDEST,COUNT</p>
<h5 id="2逻辑移位">2)逻辑移位</h5>
<p>逻辑左移SHLDEST,COUNT</p>
<p>逻辑右移SHRDEST,COUNT</p>
<h5 id="3循环移位">3)循环移位</h5>
<ul>
<li>小循环:</li>
</ul>
<p>循环左移 ROLDEST,COUNT</p>
<p>循环右移 RORDEST,COUNT</p>
<ul>
<li>大循环:</li>
</ul>
<p>带进位循环左移 RCLDEST,COUNT</p>
<p>带进位循环右移 RCRDEST,COUNT</p>
<h3 id="四处理器控制类指令">四、处理器控制类指令</h3>
<h4 id="处理器控制类指令包括以下三种情况">处理器控制类指令包括以下三种情况。</h4>
<h5 id="1标志位操作指令">1.标志位操作指令</h5>
<ul>
<li>(1)清除进位标志<br>
CLC;置CF为0</li>
<li>(2)置1进位标志<br>
STC   ;置CF为1</li>
<li>(3)进位标志取反<br>
CMC   ;CF的值取反</li>
<li>(4)清除方向标志<br>
CLD;置DF为0</li>
<li>(5)置1方向标志<br>
STD;置DF为1</li>
<li>(6)清除中断标志<br>
CLI;置IF为0</li>
<li>(7)置1中断标志<br>
STI;置IF为1</li>
</ul>
<h5 id="2与外部事件同步的指令">2、与外部事件同步的指令</h5>
<ul>
<li>HLT    ;暂停指令</li>
<li>WAIT;等待指令</li>
<li>ESC    ;外部协处理器指令前缀</li>
<li>LOCK ;总线锁定指令</li>
</ul>
<h5 id="3空操作指令---nop">3、空操作指令   NOP</h5>
<p>执行一次NOP占用CPU三个时钟周期,它不改变任何寄存器或存储单元内容,主要用于延时。</p>
<h2 id="33--指令编码">3.3指令编码</h2>
<ul>
<li>将汇编语言程序转换为机器语言程序的过程称为汇编</li>
<li>将汇编语言程序转换为机器语言程序的过程称为汇编</li>
<li>Intel8086/8088汇编指令的编码格式有四种基本格式:</li>
</ul>
<p>1.)双操作数指令编码格式</p>
<p>2.)单操作数指令编码格式</p>
<p>3.)与AX或AL有关的指令编码格式</p>
<p>4.)其它指令编码格式</p>
<h3 id="一双操作数指令编码格式">一、双操作数指令编码格式</h3>
<p><strong>对于象MOV、ADD、AND等双操作数指令,操作数可以是以下两种情形</strong>:</p>
<ul>
<li>一个操作数在寄存器中,另一操作数在寄存器或存储器中。</li>
<li>目的操作数在寄存器或存储器中,源操作数是立即数。</li>
</ul>
<h5 id="1操作特征部分">1.操作特征部分</h5>
<p>1)OPCODE:操作码字段</p>
<p>2)方向字段d</p>
<p>3)字/字节字段W</p>
<h5 id="2寻址特征部分">2.寻址特征部分</h5>
<ul>
<li>它与操作特征部分的方向字段d结合,指定两个操作数分别使用什么寻址方式,及使用哪个寄存器。</li>
<li>它包括MOD、REG和R/M三个字段,REG字段确定一个操作数,而MOD和R/M字段确定另一个操作数。</li>
</ul>
<p><strong>1)REG字段</strong></p>
<p>由REG字段确定的一个操作数是某一通用寄存器的内容,即使用的是寄存器寻址方式。</p>
<p><strong>2)寻址方式字段MOD和寄存器/存储器字段R/M</strong></p>
<p>这两个字段共同确定一个操作数。该操作数可以在寄存器中,也可以在存储器中</p>
<h5 id="3位移量部分">3.位移量部分</h5>
<p>根据寻址特征中MOD和R/M字段确定的有效地址计算方法,位移量可以是以下三种情况之一:</p>
<ul>
<li>没有位移量</li>
<li>1字节位移量disp8</li>
<li>2字节位移量disp16</li>
</ul>
<h5 id="4立即数部分">4.立即数部分</h5>
<p>如果指令的源操作数为立即数,则指令编码中包含有该部分。它总是位于指令编码的最后1~2字节。</p>
<h3 id="二单操作数指令编码格式">二、单操作数指令编码格式</h3>
<p><strong>操作特征部分:</strong></p>
<ul>
<li>包括OPCODE 、V和W三个字段,其中V字段只有移位/循环指令中才有该字段。其它指令中没有该字段。</li>
<li>V=0时,指令中使用常数1作为移位或循环次数。V=1时,指令中使用寄存器CL作移位次数。</li>
</ul>
<h3 id="三与ax或al有关的指令编码格式">三、与AX或AL有关的指令编码格式</h3>
<p>这种编码格式用于隐含指定AX/AL作为一个操作数的双操作数指令。</p>
<p>采用这种编码格式的指令,除一个操作数隐含指定为AX/AL外,另一个操作数可以是立即数或存储单元。</p>
<ul>
<li>立即数:则编码中应有1~2字节的立即数</li>
<li>存储单元:只能使用直接寻址方式,位移量由disp字段给出</li>
</ul>
<h3 id="四其它指令编码格式">四、其它指令编码格式</h3>
<ul>
<li>除上述三种编码格式外,还有一些指令的编码格式更简单。如标志位操作指令、堆栈操作指令等。这些指令的编码格式一般只有一个字节。</li>
</ul>
<hr>
<hr>
<h1 id="第四章-汇编语言程序格式">第四章 汇编语言程序格式</h1>
<h2 id="41-汇编语言语句种类及其格式">4.1 汇编语言语句种类及其格式</h2>
<ul>
<li>汇编语言的语句可以分为指令语句和伪指令语句</li>
</ul>
<h4 id="一指令语句">一、指令语句</h4>
<p>每一条指令语句在汇编时都要产生一个可供CPU执行的机器目标代码,它又叫可执行语句。</p>
<ul>
<li>1.标号字段</li>
</ul>
<p>标号是可选字段,它后面必须有“:”。标号是一 条指令的符号地址,代表了该指令的第一个字节存 放地址。</p>
<ul>
<li>2.指令助记符字段</li>
</ul>
<p>该字段是一条指令的必选项,它表示这条语句要求<br>
CPU完成什么具体操作,如MOV、ADD、SHL等。</p>
<ul>
<li>3.操作数字段</li>
</ul>
<p>一条指令可以有一个操作数、两个操作数或者无操 作数。</p>
<ul>
<li>4.注释字段</li>
</ul>
<p>注释字段为可选项,该字段以分号“;”开始。</p>
<p>它的作用是为阅读程序的人加上一些说明性内容</p>
<p>注释字段不会产生机器目标代码,它不会影响程 序和指令的功能。</p>
<h3 id="二伪指令语句">二、伪指令语句</h3>
<p>伪指令语句又叫命令语句。</p>
<ul>
<li>
<p>伪指令本身并不产生对应的机器目标代码。它仅 仅是告诉汇编程序对其后面的指令语句和伪指令 语句的操作数应该如何处理。</p>
</li>
<li>
<p>1.符号名字段</p>
</li>
</ul>
<p>该字段为可选项。根据伪指令的不同,符号名可 以是常量名、变量名、过程名、结构名和记录名 等等。</p>
<ul>
<li>2.伪指令符字段</li>
</ul>
<p>该字段是伪指令语句的必选项,它规定了汇编 程序所要完成的具体操作。本章后面的章节将对各种伪指令作详细介绍。</p>
<ul>
<li>3.操作数字段</li>
</ul>
<p>该字段是否需要,以及需要几个是由伪指令符 字段来决定。</p>
<ul>
<li>4.注释字段</li>
</ul>
<p>注释字段为可选项,该字段必须以分号开始。 其作用与指令语句的注释字段相同。</p>
<h3 id="三标识符">三、标识符</h3>
<p>指令语句中的标号和伪指令语句中符号名统 称为标识符。标识符是由若干个字符构成的。</p>
<ul>
<li>标识符构成规则:</li>
</ul>
<p>1)字符的个数为1~31个</p>
<p>2)第一个字符必须是字母、问号、@或下划线“_”这4种字符之一</p>
<p>3)从第二个字符开始,可以是字母、数字、@ 、 “_”或问号“?”</p>
<p>4)不能使用属于系统专用的保留字</p>
<h2 id="42汇编语言数据">4.2        汇编语言数据</h2>
<ul>
<li>数据是指令和伪指令语句中操作数的基本组 成部分。一个数据由<strong>数值</strong>和<strong>属性</strong>两部分构成。</li>
<li>在汇编语言中常用的数据形式有:<strong>常数、变 量和标</strong>号。</li>
</ul>
<h3 id="一常数">一、常数</h3>
<h5 id="常数有以下几种形式">常数有以下几种形式</h5>
<ul>
<li>1.二进制数:以字母B结尾,如01001001B</li>
<li>2.八进制数:以字母O或Q结尾,如631Q        254O</li>
<li>
<ol start="3">
<li>十进制数:以字母D结尾,或者没有结尾字 母。如2007D、2007。</li>
</ol>
</li>
<li>
<ol start="4">
<li>十六进制数:以字母H结尾,如3FEH,如果 常数的第一个数字为字母,为了与标识符加以区别,必须在其前面冠以数字“0”。</li>
</ol>
</li>
<li>5.实数</li>
<li>6.字符串常数:用引号(单引号或双引号)括起来的一个或多个字符,这些字符以它的ASCII码 值存储在内存。</li>
</ul>
<h5 id="常数在程序中可以用在以下几种情况">常数在程序中可以用在以下几种情况</h5>
<p>-(1)作指令语句的源操作数</p>
<ul>
<li>(2)在指令语句的直接寻址方式、变址(基址)寻 址方式或基址变址寻址方式中作位移量。</li>
<li>(3)在数据定义伪指令中使用</li>
</ul>
<h3 id="二变量">二、变量</h3>
<p>变量用来表示存放数据的存储单元,这些数据在 程序运行期间可以被改变 。</p>
<h5 id="1变量的定义与预置">1.变量的定义与预置</h5>
<p>定义变量就是给变量在内存中分配一定的存储单 元。也就是给这个存储单元赋与一个符号名,即变量 名,同时还要将这些存储单元预置初值。</p>
<ul>
<li>当变量被定义后,就具有了以下三个属性:</li>
</ul>
<p><strong>(1)段属性</strong></p>
<p>它表示变量存放在哪一个逻辑段中。</p>
<p><strong>(2)偏移量属性(OFFSET)</strong></p>
<p>段属性和偏移量属性就构造了变量的逻辑地址</p>
<p><strong>(3)类型属性</strong></p>
<p>它表示变量占用存储单元的字节数。其中DB伪指令 定义的变量为字节,DW定义的变量为字,DD定义的为 双字(4字节),DQ定义的为4字,DT定义的为5字</p>
<h5 id="当变量被定义后就具有了以下三个属性">当变量被定义后,就具有了以下三个属性:</h5>
<p><strong>(1)段属性</strong></p>
<p>它表示变量存放在哪一个逻辑段中</p>
<p><strong>(2)偏移量属性(OFFSET)</strong></p>
<p>段属性和偏移量属性就构造了变量的逻辑地址</p>
<p><strong>(3)类型属性</strong></p>
<p>它表示变量占用存储单元的字节数。其中DB伪指令定义的变量为字节,DW定义的变量为字,DD定义的为双字(4字节),DQ定义的为4字,DT定义的为5字。</p>
<h5 id="在变量的定义语句中给变量赋初值的表达式可以使用下面4种形式">在变量的定义语句中,给<strong>变量赋初值</strong>的表达式可以使用下面4种形式:</h5>
<p>(1)数值表达式</p>
<p>(2)?表达式</p>
<p>(3)字符串表达式</p>
<p>(4)DUP表达式</p>
<h4 id="2变量的使用">2.变量的使用</h4>
<p><strong>(1)在指令语句中引用</strong></p>
<p>在指令语句中直接引用变量名就是对其存储单元的内容进 行存取</p>
<p><strong>(2)在伪指令语句中引用</strong></p>
<p>后面三条伪指令的操作数中都 包含了前面定义的两个变量</p>
<h3 id="三标号">三、标号</h3>
<p>标号写在一条指令的前面,它就是该指令在内存的 存放地址的符号表示,也就是<strong>指令地址的别名</strong></p>
<h5 id="每个标号具有三属性">每个标号具有三属性</h5>
<p><strong>(1)段属性(SEG)</strong></p>
<p><strong>(2)偏移量属性(OFFSET)</strong></p>
<p><strong>(3)距离属性(也叫类型属性)</strong></p>
<h5 id="标号的距离属性可以有两种方法来指定">标号的距离属性可以有两种方法来指定</h5>
<p>a.隐含方式</p>
<p>b.用LABEL伪指令给标号指定距离属性</p>
<h2 id="43符号定义语句">4.3        符号定义语句</h2>
<h4 id="一等值语句">一、等值语句</h4>
<h6 id="语句格式符号名equ表达式">语句格式:符号名        EQU        表达式</h6>
<ul>
<li>1.常数或数值表达式</li>
</ul>
<p>COUNT        EQU        5</p>
<p>NUM        EQU        COUNT+5</p>
<ul>
<li>2.地址表达式</li>
</ul>
<p>ADR1        EQU        DS:</p>
<ul>
<li>3.变量、寄存器名或指令助记符</li>
</ul>
<h4 id="二等号语句">二、等号语句</h4>
<h5 id="格式符号名表达式">格式:符号名=表达式</h5>
<h2 id="44表达式与运算符">4.4        表达式与运算符</h2>
<h4 id="一算术运算符">一、算术运算符</h4>
<p>1.运算符“+”和“-”也可作单目运算符,表示数的正负</p>
<p>2.使用“+”、“-”、“*”、和“/”运算符时,参加运算 的数和运算结果都是整数。</p>
<p>3.“/”运算为取商的整数部分,而“MOD”运算取除法运<br>
算的余数。</p>
<ol start="4">
<li>“SHR ”和“SHL ”为逻辑移位运算符</li>
</ol>
<p>5.下标运算符“[ ]”具有相加的作用</p>
<h4 id="二逻辑运算符">二、逻辑运算符</h4>
<p>逻辑运算符有NOT、AND、OR和XOR等四个,它们执行的都是按位逻辑运算。</p>
<h4 id="三关系运算符">三、关系运算符</h4>
<p>关系运算符包括:EQ(等于)、NE(不等于)、LT(小于)、 LE(小于等于)、GT(大于)、 GE(大于等于)</p>
<h4 id="四数值返回运算符">四、数值返回运算符</h4>
<h5 id="1seg运算符">1.SEG运算符</h5>
<p>作用:        取变量或标号所在段的段基值</p>
<h5 id="2offset运算符">2,OFFSET运算符</h5>
<p>该运算符的作用是取变量或标号在段内的偏移量</p>
<h5 id="3type运算符">3.TYPE运算符</h5>
<p>作用:取变量或标号的类型属性,并用数字形式表示。对变量来说就是取它的字节长度。</p>
<h5 id="4length运算符">4.LENGTH运算符</h5>
<p>该运算符用于取变量的长度。</p>
<h5 id="5size运算符">5.SIZE运算符</h5>
<p>该运算符只能作用于变量,SIZE取值等于LENGTH和<br>
TYPE两个运算符返回值的乘积。</p>
<h4 id="五属性修改运算符">五、属性修改运算符</h4>
<h5 id="1ptr运算符">1.PTR运算符</h5>
<p><strong>使用格式</strong>:<br>
类型 PTR        地址表达式</p>
<p><strong>作用</strong>:<br>
将地址表达式所指定的标号、变量或用其它形式表示的存储器地址的类型属性修改为 “类型”所指的值</p>
<h5 id="2highlow运算符">2.HIGH/LOW运算符</h5>
<p><strong>使用格式</strong>:</p>
<p>HIGH        表达式<br>
LOW        表达式</p>
<h5 id="3this运算符">3、THIS运算符</h5>
<p>THIS运算符一般与等值运算符EQU连用,用来定 义一个变量或标号的类型属性。所定义的变量或标号的段基值和偏移量与紧跟其后的变量或标号相同。</p>
<h4 id="六运算符的优先级">六、运算符的优先级</h4>
<p>在一个表达式中如果存在多个运算符时,在计算时就有先<br>
后顺序问题。不同的运算符具有不同的运算优先级别。</p>
<h5 id="汇编程序在计算表达式时按以下规则进行运算">汇编程序在计算表达式时,按以下规则进行运算</h5>
<ul>
<li>先执行优先级别高的运算,再算较低级别运算</li>
<li>相同优先级别的操作,按照在表达式中的顺序,从 左到右进行</li>
<li>可以用圆括号改变运算的顺序</li>
</ul>
<h2 id="45程序的段结构">4.5        程序的段结构</h2>
<ul>
<li>086/8088在管理内存时,按照逻辑段进行划分, 不同的逻辑段可以用来存放不同目的的数据。在程序 中使用四个段寄存器CS,DS,ES和SS来访问它们。</li>
</ul>
<h4 id="一段定义伪指令">一、段定义伪指令</h4>
<p>伪指令SEGMENT和ENDS用于定义一个逻辑段。使<br>
用时必须配对,分别表示定义的开始与结束。</p>
<h5 id="1段名">1、段名</h5>
<p>段名是由用户自己任意选定的,符合<strong>标识符定义</strong> 规则的一个名称。</p>
<h5 id="2定位类型">2、定位类型</h5>
<p>定位类型用于决定段的起始边界,即第一个可存放数据 的位置(不是段基址)。它可以有4种取值。</p>
<ul>
<li>1)PAGE:        表示该段从一个页面的边界开始</li>
<li>2)PARA:表示该段从一个小节的边界开始 如果用户未选定位类型,则缺省为PARA。</li>
<li>3)WORD:表示该段从一个偶数字节地址开始,即段起始单元地址的最后一位二进制数一定是0</li>
<li>4)BYTE:表示该段起始单元地址可以是任一地址值</li>
</ul>
<h5 id="3组合类型">3、组合类型</h5>
<ul>
<li>1)若未指定组合类型,表示本段与其它段无连接关系。在 装入内存时,本段有自己的物理段,因此有自己的段基址</li>
<li>2)PUBLIC:在满足定位类型的前提下,将与该段同名的 段邻接在一起,形成一个新的逻辑段,共用一个段基址。段 内的所有偏移量调整为相对于新逻辑段的段基址。</li>
<li>3)COMMON: 产生一个覆盖段。在多个模块连接时,把 该段与其它也用COMMON说明的同名段置成相同的段基址,这样可达到共享同一存储区。共享存储区的长度由同名段中 最大的段确定。</li>
<li>4)STACK:把所有同名段连接成一个连续段,且系统自动 对SS段寄存器初始化为该连续段的段基址。并初始化堆栈指 针SP。</li>
<li>5)AT表达式:表示本段可定位在表达式所指示的小节边 界上。表达式的值也就是段基值。</li>
<li>6)MEMORY:表示本段在存储器中应定位在所有其它段之 后的最高地址上。如果有多个用MEMORY说明的段,则只处 理第一个用MEMORY说明的段。其余的被视为COMMON</li>
</ul>
<h4 id="4类别名">4.类别名</h4>
<p>类别名为某一个段或几个相同类型段设定的类型名称。系 统在进行连接处理时,把类别名相同的段存放在相邻的存储 区,但段的划分与使用仍按原来的设定</p>
<p>在定义一个段时,段名是必须有的项,而定位类型、组合类型和类别名三个参数是可选项。各个参数之间用空格分 隔。各参数之间的顺序不能改变。</p>
<h3 id="二段寻址伪指令">二、段寻址伪指令</h3>
<ul>
<li>段寻址伪指令ASSUME的作用是告诉汇编程序,在处理源 程序时,定义的段与哪个寄存器关联。</li>
</ul>
<p>一般格式: ASSUME        段寄存器名:段名,段寄存器名:段名,......</p>
<h3 id="三段寄存器的装入">三、段寄存器的装入</h3>
<h5 id="1ds和es的装入">1、DS和ES的装入</h5>
<p>在程序中,使用数据传送语句来实现对DS和ES的装入</p>
<h5 id="2ss的装入">2,SS的装入</h5>
<p>SS的装入有两种方法</p>
<p>1)在段定义伪指令的组合类型项中,使用STACK参 数,并在段寻址伪指令ASSUME语句中把该段与SS段寄 存器关联。</p>
<p>2)如果在段定义伪指令的组合类型中,未使用STACK参数,或者是在程序中要调换到另一个堆栈,这时,可以 使用类似于DS和ES的装入方法。</p>
<h5 id="3cs的装入">3、CS的装入</h5>
<p>1)由系统软件按照结束伪指令指定的地址装入初始的CS和IP</p>
<p>2)在程序运行期间,当执行某些指令时,CPU自动修改CS和IP,使它们指向新的代码段。</p>
<h2 id="46过程定义伪指令procendp">4.6        过程定义伪指令(PROC/ENDP)</h2>
<h6 id="过程名是子程序的名称它被用作过程调用指令call的目-的操作数它类同一个标号的作用具有段偏移量和距离-三个属性而距离属性使用near和far来指定若没有指定则隐含为near">过程名是子程序的名称,它被用作过程调用指令CALL的目 的操作数。它类同一个标号的作用。具有段、偏移量和距离 三个属性。而距离属性使用NEAR和FAR来指定,若没有指定,则隐含为NEAR。</h6>
<ul>
<li>
<p>NEAR过程只能被本段指令调用,而FAR过程可以供其它段 的指令调用。</p>
</li>
<li>
<p>每一个过程中必须包含有返回指令RET,其作用是控制CPU<br>
从子程序中返回到调用该过程的主程序。</p>
</li>
</ul>
<h2 id="47当前位置计数器与定位伪指令orgorigin">4.7        当前位置计数器$与定位伪指令ORG(Origin)</h2>
<h6 id="汇编程序在汇编源程序时每遇到一个逻辑段就要为其-设置一个位置计数器它用来记录该逻辑段中定义的每一个-数据或每一条指令在逻辑段中的相对位置">汇编程序在汇编源程序时,每遇到一个逻辑段,就要为其 设置一个位置计数器,它用来记录该逻辑段中定义的每一个 数据或每一条指令在逻辑段中的相对位置。</h6>
<ul>
<li>定位伪指令ORG--用来改变位置计数器的值</li>
<li></li>
</ul>
<p>格式: ORG数值表达式</p>
<h2 id="48标题伪指令title">4.8        标题伪指令TITLE</h2>
<p>语句格式:</p>
<p>TITLE        标题名</p>
<h5 id="作用给所在程序指定一个标题以便在列表文件的每一页-的第一行都显示这个标题其中标题是用户任意选用的字符-串字符个数不能超过60">作用:给所在程序指定一个标题。以便在列表文件的每一页 的第一行都显示这个标题。其中标题是用户任意选用的字符 串,字符个数不能超过60。</h5>
<h2 id="49从程序返回操作系统的方法">4.9        从程序返回操作系统的方法</h2>
<h4 id="一使用程序段前缀pspprogram-segment-prefix实现返回">一、使用程序段前缀PSP(Program Segment Prefix)实现返回</h4>
<ul>
<li>
<ol>
<li>将用户程序编制成一个过程,类型为FAR;</li>
</ol>
</li>
<li>
<ol start="2">
<li>将PSP的起始逻辑地址压栈,即将INT 20H指令的地址压栈</li>
</ol>
</li>
<li>
<ol start="3">
<li>在用户程序结尾处,使用一条RET指令。执行该指令将使 保存在堆栈中的PSP的起始地址弹出到CS和IP中。</li>
</ol>
</li>
</ul>
<h4 id="二使用dos系统功能调用实现返回">二、使用DOS系统功能调用实现返回</h4>
<p>执行DOS功能调用4CH,也可以控制用户程序结束, 并返回DOS操作系统。</p>
<hr>
<hr><br><br>
来源:https://www.cnblogs.com/lrz2427/p/16000807.html
頁: [1]
查看完整版本: 20192427李睿智汇编语言学习笔记(1-4章)