写在开头:本文不以分享为目的,只是记录自己课程学习过程中觉得重要的部分知识点或者知识体系,以及可能存在的没有解决的问题,欢迎大家来进行交流和指正,其中ps部分为个人将其他学科与其构建联系的个人理解,因此也欢迎您能花费一部分时间帮我进行查漏补缺或者进行指点,学生拜谢。Orz
·本章内容同步于学习通课程8086CPU指令系统(一)~(十)。
正文部分
三、CPU的指令系统
首先,我们需要明确CPU的指令系统的定义,通常我们认为CPU能够识别(认识)的指令合集是该型号的CPU的指令系统。
3.1汇编语言指令
Ⅰ、名词解释
①指令——一组二进制代码。
②指令系统——CPU能够识别的所有指令的集合构成了该型号的CPU的指令系统。
③机器语言——指令代码\二进制代码语言。CPU能认识的指令代码来直接编写程序。
④机器语言程序——用户用机器语言编写的程序。优点是能够直接执行,无需编译。缺点是功能扩充、维护复杂。
⑤汇编语言——一种符号化语言,将CPU可以识别的指令用一组符号和数字来替代。
⑥汇编语言(源)程序——用汇编语言编写的程序。CPU无法直接识别,需要翻译成机器语言程序。文件后缀为.asm。
⑦汇编——将⑥翻译成④的过程,常用工具为masm.exe(5.0),一般在DOS环境下使用
⑧反汇编——将④翻译成⑥的过程。把装到内存的要执行的二进制代码文件翻译成符号的过程。
Ⅱ、8086汇编语言程序中语句的种类
①指令语句:凡是CPU可以执行的语句,汇编后能翻译成二进制代码的语句均为指令语句。
②伪指令语句:CPU不可以执行的语句,汇编后不能翻译成指令代码的语句。如DB—字节型定义数据指令。
以上两种语句是最常用的语句,
③宏指令语句:本身是8086指令系统中没有的语句,是用户通过宏指令定义的伪指令定义的一条新的语句。
Ⅲ、语句的组成
一条语句一般有四部分组成,从左到右依次为地址、助记符、操作数、注释。操作数可以缺省,名称起名字母打头。
Ⅳ、汇编语言中的常数及表达式
数字、字符、字母均为常数。表达式有多种,分别为算术表达式、逻辑表达式和关系表达式。其中算术表达式较为常用。
算术表达式也可以出现在数据定义的伪指令中,由操作数和操作符共同构成。
Ⅴ、标号、变量及伪指令
标号:指令语句中左边部分,以冒号结尾,代表指令语句地址。一旦定义后就会具有三个属性①标号对应指令所在存储单元的16位段地址属性。②标号具有指令所在单元的16位段内偏移地址属性(此为常用属性)。③类型的属性,可以采用属性表达式来获取属性。标号的类型有两种,分别为①NEAR—近程转译,也叫段内转译。转译指令和转译目的地的标号在同一个代码段。②FAR—远程转译,也叫段间转移。转译指令和转译目的地的标号不用在同一个代码段。但是在8086实际程序设计中,获取标号的类型属性毫无意义。
变量及变量定义伪指令:
首先,变量定义伪指令有几个比较重要的,分别是
伪指令 解释 长度 举例
DB 定义字节型变量 1字节长度 DAT1 DB 12,12H,-12,‘12’
DW 定义字型变量 2字节长度 DAT2 DW $
DD 定义双字型变量 4字节长度 DAT5 DD 9CH
DQ 定义长字节变量 8字节长度
DT 定义一个10字节变量 10字节长度
当变量一旦定义,就具有5个属性。除上文提到的①段地址属性SEG、②段偏移地址属性OFFSET和③类型属性(不论有多少个操作数,字变量的类型为2)以外,还具有④长度属性—在变量定义语句中,所定义的变量的个数,当变量中存在DUP指令时,长度为DUP指令左侧的数字。和⑤大小属性—在变量定义语句中,所定义的所有变量所占的总字节数。即SIZE=TYPE*LENGTH。
当我们使用属性赋值时,实际上是赋值相应的数值给寄存器,如
MOV AL,TYPE DAT1;等效于 MOV AL 1;
对于指令DAT6 DW DAT3;在DAT6字单元放DAT3变量的OFFSET偏移地址。
对于指令DAT7 DD DAT3;双字定义时,既要取偏移地址,也要放段地址属性。
对于指令DAT8 DB 4DUP(?);DUP为重复操作符,可以嵌套。
Ⅵ、属性操作符和PTR操作符
属性操作符即上文提到的五类操作符,分别是①SEG,②OFFSET,③TYPE,④LENGTH和⑤SIZE。PTR操作符为属性临时修改操作符。
实际应用中,想在字单元获取一个字节或者在一个字节单元中获取一个字,需要转换程序类型,即使用PTR操作符。如:MOV AX,WORD PTR DAT1;在此语句中临时转换为字变量。
3.2 8086指令系统中的指令的分类
8086指令系统中一共有13种指令,分别为数据传送类指令、算术运算类、逻辑运算类、移位类、标志位操作指令、转移指令、循环控制指令、子程序调用与返回指令、中断调用返回指令、字符串操作指令、输入输出指令、其他指令和宏指令。以上指令将要在3.4-3.16按类进行学习。
3.3数据与转移地址的寻址方式
寻址方式:求操作数所在地址or所在存储器单元地址的方式。若操作数不在存储器单元而在寄存器或指令中,立即给出的常数,也归类于寻址方式之中。对寻址方式进行分类,可以分为①取数据的寻址方式。②转移到目的地址的操作数在哪里放的寻址方式,可以分为段内转移—求偏移地址给IP和段间转移—求偏移地址给IP同时求段间地址给CS。
求得的操作数OPR,用处为①数据用和②转移地址用。
Ⅰ、关于寻址数据的寻址方式
立即数寻址——如MOV AX,1234H;指令中寻找的操作数以常数的形式给出。立即数无法直接传递给段寄存器,需要通用寄存器做中介。此外,立即数只能做源操作数。
寄存器寻址——如MOV AX,BX;指令中寻找的操作数在寄存器中。上文指令中,AX,BX均为REG寻址。寄存器寻址时,需要注意类型要一致。
PS、寻址时,类型要明确。当DST、SRC一方明确时,类型即明确。当双方均不明确时,类型不明确。
PS、立即数不能直接传送给DS。当DS/ES/SS做DST时,SRC不能为立即数寻址。
PS、CS、IP不能做DST,可以做SRC、
存储器寻址——要寻找的操作数OPR在存储器某单元中,存储操作数的单元的EA(段内有效/偏移地址)可以由以下五种寻址方式求得。
①直接寻址—在指令中直接写出操作数所在单元的地址。
操作数所在存储单元的有效地址,指令中直接给出称为直接寻址。但是,两存储器单元之间不能直接操作。
②REG间接寻址—通过BX、SI、DI
EA=[BX/SI/DI];默认均在DS中
寻找的操作数仍在某存储器单元中。
③REG相对寻址—单元的有效地址的一部分在一个地址寄存器中,BX/BP/SI/DI+8/16位相对位移量disp
EA=[BX/SI/DI(在DS段)/BP(在SS段)]+8/16位相对位移量disp
寻找的操作数仍在某存储器单元中,段内16位有效地址EA。当相对位移量为变量时,取变量的16位偏移地址为相对量。变量在哪个段定义,段地址就在哪个段。在寻址方式前增加段超越前缀来改变操作数所在段。
④基址变址寻址—BX/BP+SI/DI
EA=[BX/BP][SI/DI]
以基址寄存器为主来确定段地址。
⑤基址变址且相对寻址—BX/BP+SI/DI+8/16位相对位移量disp
变量>BX/BP>SI/DI。
EA=[BX/BP][SI/DI]+8/16位disp
隐含寻址——指令中并没有写出操作数,但CPU执行过程中知道操作数的位置。如PUSH AX;
字符串函数指令广泛使用隐含寻址。
但是变量不能再指令语句中运算
Ⅱ、关于转移地址的寻址方式
段内转移—近程-只有IP段发生了变化
段间转移—远程-
段内转移寻找目的地的方式
①段内直接寻址-也叫段内相对寻址
②段内间接寻址-战役目的地的IP间接的存放
以TABLE变量的直接寻址方式(数据寻址)的段内间接寻址(转移地址寻址)
知识点总结:
①通常在变量赋值偏移地址属性时应给到地址寄存器,赋值给其他寄存器虽无错但是无意义。如
MOV BX,OFFSET DAT1;等效于 MOV BX,IP;
②在MASM.exe中有个$-位置计数器(16位),用来跟踪汇编程序对原程序跟踪的那个单元的偏移地址。始终指明当前要汇编的数据/指令要寄放的存储器的偏移地址。$是个常数,因此可以直接引用。
③DW、DD等定义字符串时,8086内部规定单引号内部只能有2个字符。
④SHORT类型可以存放-128~127之间的数。
⑤相对位移量用补码来表示。8086指令系统中所有的条件转移指令只能在段内转移,则转移范围在-128~127之间,若超出范围需要用JMP指令来实现二次跳跃。执行操作码→转移到目的的的IP=当前IP+相对位移量DISP
⑥所有条件转移的寻址方式均为段内间接寻址或段内相对寻址