8086汇编语言基础学习(三)——伪指令
<h1 style="text-align: center"><span style="color: rgba(0, 0, 0, 1)">8086汇编语言基础学习(三)——伪指令</span></h1><h2><span style="font-size: 18pt; color: rgba(0, 0, 0, 1)">什么是伪指令:</span></h2>
<h3><span style="font-size: 14pt; color: rgba(0, 0, 0, 1)">定义:</span></h3>
<ul>
<li><span style="font-size: 14pt; color: rgba(0, 0, 0, 1)">伪指令(Pseudo Instruction)是用于对汇编过程进行控制的指令,<span style="background-color: rgba(255, 255, 153, 1)">该类指令并不是可执行指令,没有对应机器代码</span>,只用于汇编过程中为汇编程序提供汇编信息。</span></li>
</ul>
<h3><span style="font-size: 14pt; color: rgba(0, 0, 0, 1)">特点:</span></h3>
<ul>
<li><span style="font-size: 18.6667px; color: rgba(0, 0, 0, 1)">“伪”,假指令,是不可以执行的指令,没有对应的机器代码,不会占用ROM空间,只用于汇编过程中为汇编程序提供汇编信息</span></li>
<li><span style="font-size: 18.6667px; color: rgba(0, 0, 0, 1)">“指令”,只存在于汇编语言中,高级语言中不叫指令,叫语句</span></li>
</ul>
<h3><span style="font-size: 18.6667px; color: rgba(0, 0, 0, 1)">区别:</span></h3>
<ul>
<li><span style="font-size: 18.6667px; color: rgba(0, 0, 0, 1)">指令是在执行阶段发挥作用的,由CPU来执行</span></li>
<li><span style="font-size: 18.6667px; color: rgba(0, 0, 0, 1)">伪指令是在编译阶段发挥作用的,由汇编器来解释</span></li>
</ul>
<h2><span style="font-size: 18pt; color: rgba(0, 0, 0, 1)">数据定义类伪指令:</span></h2>
<p><span style="font-size: 18pt; color: rgba(0, 0, 0, 1)">为源程序中的数据和堆栈分配存储单元是,使用的伪指令</span></p>
<h3><span style="font-size: 14pt; color: rgba(0, 0, 0, 1)">格式:</span></h3>
<ul>
<li><span style="font-size: 14pt; background-color: rgba(204, 255, 255, 1); color: rgba(0, 0, 0, 1)">[ <变量名> ] <类型><初值表></span></li>
</ul>
<h3><span style="font-size: 14pt; color: rgba(0, 0, 0, 1)">数据类型:</span></h3>
<ul>
<li><span style="font-size: 14pt; color: rgba(0, 0, 0, 1)">DB(定义字节)一个字节数据占用1个字节的存储单元,读操作时,偏移量加1</span></li>
<li><span style="font-size: 14pt; color: rgba(0, 0, 0, 1)">DW(定义字)一个字数据占用2个字节的存储单元,读操作时,偏移量加2</span></li>
<li><span style="font-size: 14pt; color: rgba(0, 0, 0, 1)">DD(定义双字)一个双字数据占用4个字节的存储单元,读操作时,偏移量加4</span></li>
<li><span style="font-size: 14pt; color: rgba(0, 0, 0, 1)">DQ(定义四字)一个四字数据占用8个字节的存储单元,读操作时,偏移量加8</span></li>
<li><span style="font-size: 14pt; color: rgba(0, 0, 0, 1)">DT(定义十字)常用于BCD码</span></li>
</ul>
<h3><span style="font-size: 14pt; color: rgba(0, 0, 0, 1)">初值:</span></h3>
<ul>
<li><span style="font-size: 14pt; color: rgba(0, 0, 0, 1)">可以是常数、表达式、字符串</span></li>
</ul>
<h2><span style="font-size: 18pt; color: rgba(0, 0, 0, 1)">符号定义类伪指令:</span></h2>
<p><span style="font-size: 18pt; color: rgba(0, 0, 0, 1)">符号定义伪指令是<span style="background-color: rgba(255, 204, 153, 1)">给一个数值、字符串或表达式赋予一个名字</span>。符号定义伪指令有等值伪指令EQU、等号伪指令 “=”、符号 / 标号伪指令LABEL三种,其实是给内存地址一个标号</span></p>
<h3><span style="font-size: 14pt; color: rgba(0, 0, 0, 1)">1. EQU(等值伪指令)</span></h3>
<ul>
<li><span style="color: rgba(0, 0, 0, 1)"><span style="font-size: 14pt">格式:</span><span style="font-size: 14pt; background-color: rgba(204, 255, 204, 1)"><符号名> EQU <表达式></span></span></li>
</ul>
<p><span style="color: rgba(0, 0, 0, 1)"><img src="https://img2023.cnblogs.com/blog/2928799/202306/2928799-20230620185450378-120837907.png" alt="" loading="lazy" style="display: block; margin-left: auto; margin-right: auto"></span></p>
<p><span style="color: rgba(0, 0, 0, 1)"> </span></p>
<p><span style="color: rgba(0, 0, 0, 1)"><img src="https://img2023.cnblogs.com/blog/2928799/202306/2928799-20230620190214986-917272325.png" alt="" loading="lazy" style="display: block; margin-left: auto; margin-right: auto"></span></p>
<p><span style="color: rgba(0, 0, 0, 1)"> </span></p>
<p><span style="color: rgba(0, 0, 0, 1)"><img src="https://img2023.cnblogs.com/blog/2928799/202306/2928799-20230620190238606-1968996704.png" alt="" loading="lazy" style="display: block; margin-left: auto; margin-right: auto"></span></p>
<h3><span style="font-size: 14pt; color: rgba(0, 0, 0, 1)"> 2. "=" 伪指令</span></h3>
<ul>
<li><span style="color: rgba(0, 0, 0, 1)"><span style="font-size: 14pt">格式:</span><span style="font-size: 14pt"><符号名> = <表达式></span></span></li>
</ul>
<p><span style="color: rgba(0, 0, 0, 1)"><img src="https://img2023.cnblogs.com/blog/2928799/202306/2928799-20230620190735591-1256949428.png" alt="" loading="lazy" style="display: block; margin-left: auto; margin-right: auto"></span></p>
<ul>
<li><span style="font-size: 14pt; background-color: rgba(255, 153, 204, 1); color: rgba(0, 0, 0, 1)"> 区别:</span></li>
<ul>
<li><span style="font-size: 14pt; color: rgba(0, 0, 0, 1)">EQU伪指令定义的符号在一个源程序中是不能被重复定义的</span></li>
<li><span style="font-size: 14pt; color: rgba(0, 0, 0, 1)">”=“伪指令定义的符号可以被重复定义,但是后定义的符号变量会覆盖前者的定义</span></li>
<li><span style="font-size: 14pt; color: rgba(0, 0, 0, 1)">使用EQU伪指令定义的符号名不仅可以代表某个常数或常数表达式,还可以代表字符串、关键字、指令码、一串符号(如WORD PTR)等,而使用等号伪指令定义的符号名仅用于代表数值表达式。</span></li>
</ul>
</ul>
<h3><span style="font-size: 18.6667px; color: rgba(0, 0, 0, 1)">3. LABEL伪指令</span></h3>
<ul>
<li><span style="font-size: 18.6667px; color: rgba(0, 0, 0, 1)">描述:符号定义伪指令和THIS运算符(关于表达式中的运算发的讲解在之后)功能类似,可以为当前存储单元定义一个指定类型的变量或标号。</span></li>
<li><span style="font-size: 18.6667px; color: rgba(0, 0, 0, 1)">格式:<符号名> LABEL <表达式>,其中,数据类型就是常用的数据类型:<span style="background-color: rgba(204, 255, 255, 1)">BYTE、WORD、DWORD、结构类型、记录类型(这五类符号名就是变量名)</span>、<span style="background-color: rgba(153, 204, 255, 1)">NEAR、FAR(这两类符号名就是标号名)</span>等。</span></li>
</ul>
<p><span style="color: rgba(0, 0, 0, 1)"><img src="https://img2023.cnblogs.com/blog/2928799/202306/2928799-20230620192314249-1792894369.png" alt="" loading="lazy" style="display: block; margin-left: auto; margin-right: auto"></span></p>
<p><span style="color: rgba(0, 0, 0, 1)"> </span></p>
<p><span style="color: rgba(0, 0, 0, 1)"><img src="https://img2023.cnblogs.com/blog/2928799/202306/2928799-20230620192421776-1216459943.png" alt="" loading="lazy" style="display: block; margin-left: auto; margin-right: auto"></span></p>
<h2><span style="color: rgba(0, 0, 0, 1)"> <span style="font-size: 18pt">段和过程定义伪指令:</span></span></h2>
<p><span style="font-size: 18pt; color: rgba(0, 0, 0, 1)">段和过程定义伪指令用来定义代码段、数据段、堆栈段和子程序。</span></p>
<h3><span style="font-size: 14pt; color: rgba(0, 0, 0, 1)">1.段定义伪指令</span></h3>
<ul>
<li><span style="font-size: 14pt; color: rgba(0, 0, 0, 1)">描述:为了与存储器的分段结构相对应,汇编语言源程序也是用分段的方法来组织程序代码、数据和变量的。段定义伪指令SEGMENT/ENDS用于段的定义</span></li>
<li><span style="font-size: 14pt; color: rgba(0, 0, 0, 1)">格式:</span></li>
</ul>
<p><span style="color: rgba(0, 0, 0, 1)"><img src="https://img2023.cnblogs.com/blog/2928799/202306/2928799-20230620192831829-1575675010.png" alt="" width="544" height="99" loading="lazy" style="display: block; margin-left: auto; margin-right: auto"></span></p>
<ul>
<li style="list-style-type: none">
<ul>
<li><span style="font-size: 14pt; color: rgba(0, 0, 0, 1)">段名:给段起的名字,这是必须的属性,<span style="background-color: rgba(204, 255, 255, 1)">定位类型,组合类型,’类别‘是可选属性,初学时最好默认!!</span></span></li>
<li><span style="font-size: 14pt; color: rgba(0, 0, 0, 1)">定位类型:确定逻辑段的起始地址:BYTE, WORD, PARA, FAGE, 默认是PARA(节),低四位地址为0</span></li>
<li><span style="font-size: 14pt; color: rgba(0, 0, 0, 1)">组合类型:说明逻辑段装入内存时如何和其他段进行组合,有NONE, PUBLIC, STACK, COMMON, MEMORY, AT六种:</span></li>
</ul>
<ol>
<li><span style="font-size: 18.6667px; color: rgba(0, 0, 0, 1)">NONE,为默认值,表示本段和其他段不发生关系,具有独立的段地址</span></li>
<li><span style="font-size: 18.6667px; color: rgba(0, 0, 0, 1)">PUBLIC:将同名同类型的段相邻地连接到一起,具有共同的段地址。</span></li>
<li><span style="font-size: 18.6667px; color: rgba(0, 0, 0, 1)">STACK:和PUBLIC功能一样,但用于堆栈段,<span style="background-color: rgba(255, 204, 153, 1)">定义堆栈段必须有</span>。</span></li>
<li><span style="font-size: 18.6667px; color: rgba(0, 0, 0, 1)">COMMON:所有同名同类型段具有相同段地址,但后面的会覆盖前面的,用于共享数据。</span></li>
<li><span style="font-size: 18.6667px; color: rgba(0, 0, 0, 1)">MEMORY:将本段定义在其他段之后。</span></li>
<li><span style="font-size: 18.6667px; color: rgba(0, 0, 0, 1)">AT :将本段定义在表达式指定位置,但代码段不能用。</span></li>
</ol></li>
<ul>
<li><span style="font-size: 18.6667px; color: rgba(0, 0, 0, 1)">类别:用户自定义的类别名,用单引号括起来,如'STACK','CODE','DATA'。<span style="background-color: rgba(204, 255, 255, 1)">连接程序会把类别名相同的所有段装入内存的连续区域</span>。</span></li>
</ul>
</ul>
<p><span style="color: rgba(0, 0, 0, 1)"><img src="https://img2023.cnblogs.com/blog/2928799/202306/2928799-20230620194249828-85981714.png" alt="" loading="lazy" style="display: block; margin-left: auto; margin-right: auto"></span></p>
<ul>
<li><span style="font-size: 14pt; color: rgba(0, 0, 0, 1)"> 注意:如果用户不自己定义堆栈段,程序就会默认使用系统的堆栈段,有大量的入栈数据时要定义自己的堆栈。初始化程序时要使用MOV指令初始化SS和SP。(似乎加上STACK组合类型就可以省去初始化操作)</span></li>
</ul>
<h3><span style="font-size: 14pt; color: rgba(0, 0, 0, 1)">2. 假定伪指令</span></h3>
<ul>
<li><span style="font-size: 14pt; color: rgba(0, 0, 0, 1)">描述:假定伪指令用在代码段中,<span style="background-color: rgba(204, 255, 255, 1)">它用来告诉汇编程序,如何设定各段与对应段寄存器的映射关系</span>。</span></li>
<li><span style="font-size: 14pt; color: rgba(0, 0, 0, 1)">格式:ASSUME <段寄存器名> : <建立映射的段名>, <段寄存器名> : <建立映射的段名>, ……。段寄存器名可以是CS、DS、ES或SS,段名则是由段定义伪指令定义。</span></li>
<li><span style="font-size: 14pt; color: rgba(0, 0, 0, 1)">注意:</span></li>
<ul>
<li><span style="font-size: 14pt; color: rgba(0, 0, 0, 1)">段名可以时一个特别关键字NOTHING,表示某个段寄存器不在与任何段有关系。</span></li>
<li><span style="font-size: 18.6667px; color: rgba(0, 0, 0, 1)">假定伪指令通常在代码段的起始就使用(暂不确定)</span></li>
</ul>
</ul>
<h3><span style="font-size: 14pt"> 3. 过程定义伪指令</span></h3>
<ul>
<li><span style="font-size: 14pt">描述:可将具有一定功能的程序段看成一个过程(相当于一个子程序)。它可以被其他程序调用(用CALL指令)转移到这段程序执行,执行完再返回主程序。</span></li>
<li><span style="font-size: 14pt">格式:</span></li>
</ul>
<p><img src="https://img2023.cnblogs.com/blog/2928799/202306/2928799-20230622105234346-388110747.png" alt="" loading="lazy" style="display: block; margin-left: auto; margin-right: auto"></p>
<p> </p><br><br>
来源:https://www.cnblogs.com/Tatsukyou/p/17494396.html
頁:
[1]