【个人回顾】西安电子科技大学-周佳社-微机原理与接口设计-3

本文详细介绍了8086CPU的指令系统,包括汇编语言的基本概念如指令、机器语言、伪指令,以及汇编语言程序的组成部分。重点讲解了8086汇编中的指令语句、伪指令语句和宏指令语句,并阐述了语句的组成、常数与表达式、标号、变量及其定义。此外,还深入讨论了数据和转移地址的寻址方式,如立即数、寄存器、存储器寻址等。
摘要由CSDN通过智能技术生成

        写在开头:本文不以分享为目的,只是记录自己课程学习过程中觉得重要的部分知识点或者知识体系,以及可能存在的没有解决的问题,欢迎大家来进行交流和指正,其中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

⑥所有条件转移的寻址方式均为段内间接寻址或段内相对寻址

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值