美文网首页汇编
「微机原理」微处理器指令系统

「微机原理」微处理器指令系统

作者: d5d2004b6a61 | 来源:发表于2017-10-19 00:29 被阅读499次

    微处理器的内部结构

    微处理器的基本结构

    8位微处理器的内部结构一般由算术逻辑单元、寄存器组和指令处理单元等组成。

    1. 算术逻辑单元(ALU):负责CPU所能进行的运算,主要是算术运算和逻辑运算。
    2. 寄存器组:主要用来存放临时的数据或地址,起着数据准备、数据调度和数据缓冲的作用。可编程寄存器可以分为三类:通用寄存器,地址寄存器,标志寄存器
    3. 指令处理单元:负责对指令进行译码和处理。一般包括:
      • 指令寄存器:用来暂存被译码处理的指令。
      • 指令译码逻辑:负责对指令进行译码,获知该指令的功能。
      • 时序和控制逻辑:按一定时序发出和接收时钟信号、控制信号、请求和相应信号等。

    8088/8086的功能结构

    8088内部结构

    1. 总线接口单元(BIU):由指令队列、指令指针、段寄存器、地址加法器和总线控制逻辑等构成。
    2. 执行单元(EU):由ALU、通用寄存器、地址寄存器、标志寄存器和指令译码逻辑等构成,负责指令的译码、执行和数据的运算。
    3. 指令预取:指令的读取在BIU单元,执行在EU单元,可并行。BIU单元的指令读取实际上就是指令预取。

    注意:8088和8086两个芯片都是16位的,内部的运算器和寄存器都是16位,都具有20位地址线,唯一区别是外部数据总线,8088是8位,8086是16位。

    8088/8086的寄存器结构

    8088/8086的寄存器组有8个通用寄存器、4个段寄存器、1个标志寄存器和1个指令指针寄存器,均为16位。

    通用寄存器

    1. 数据寄存器

      8088有4个16位数据寄存器,分别是:

      • AX累加器(Accumulator)—>AH,AL(高8位和底8位),以下类似。
      • BX基址寄存器(Base)—>BH,BL
      • CX计数器(Counter)—>CH,CL
      • DX数据寄存器(Data)—>DH,DL
    2. 变址寄存器

      • SI源地址寄存器(Source)
      • DI目的地址寄存器(Destination)
    3. 指针寄存器

      • BP基址指针寄存器
      • SP堆栈指针寄存器

    指令指针寄存器

    1. CS代码段寄存器:指示代码段的开始位置
    2. IP指令指针寄存器:指示当前指令在代码段的偏移位置。

    标志寄存器

    1. 状态标志
      • CF进位标志:运算结果的最高有效位有进位或借位时CF=1,否则CF=0。
      • ZF零标志:运算结果为0时ZF=1,否则ZF=0。
      • SF符号标志:运算结果最高有效位为1时SF=1,否则SF=0。
      • PF奇偶标志:反映的是最低字节中1的个数的奇偶性。
      • OF溢出标志:有溢出OF=1,否则为0。
    2. 控制标志
      • IF中断允许标志:用于控制外部可屏蔽中断是否可以被处理器响应。允许中断时IF=1,禁止中断时IF=0。

    8088/8086的存储器结构

    1. 数据的存储格式

      计算机存储信息的基本单位是二进制位(bit)。字或双字在存储器中占相邻的2个或4个存储单元,低字节存入低地址,高存高,字或双字单元的地址用它的低地址来表示。如字单元的内容为:[00002H] = 1234H。

    2. 存储器的分段管理

      • 段基地址:段地址,说明逻辑段在主存中的起始位置。
      • 段内偏移地址(Offset):说明偏移量。

      每个存储器单元都有一个唯一的20位物理地址。而像段地址:偏移地址这种形式,称为逻辑地址。逻辑地址转物理地址的方法是:将逻辑地址中的段地址左移4位二进制(对应1位16进制),加上偏移地址就得到20位物理地址。

    3. 段寄存器

      • CS代码段:存放代码段的段地址。处理器利用CS:IP取得要执行的指令。
      • DS数据段:存放数据段的段地址,称之为有效地址EA。程序中的数据默认都在DS中存放。
      • ES附加段:附加的数据段。
      • SS堆栈段:处理器利用SS:SP操作堆栈中的数据。

    8088/8086的寻址方式

    语句有相似的两种,一般由分隔符分成的4个部分组成。

    1. 执行性语句:用于表达处理器指令格式为:
      • 标号:硬指令助记符 参数,参数,...... ;注释
        • 如:MOV dest,src ;dest<—src
    2. 说明性语句:格式:
      • 名字 伪指令助记符 参数,参数,...... ;注释

    立即数寻址方式

    采用立即数寻址方式的操作数就直接存放在机器代码中,紧跟在操作码之后。立即数为imm。如:MOV AX,0102H ;将0102H赋值给寄存器AX

    寄存器寻址方式

    寄存器寻址方式的操作数存放在CPU的内部寄存器reg中。如:MOV AX,BX ;将BX里存的值赋值给AX

    存储器寻址方式

    1. 直接寻址方式:指令中直接包含了操作数的有效地址,跟在指令操作码之后。如:MOV AX,[2000H]
    2. 寄存器间接寻址方式:操作数的有效地址放在基址寄存器BX或变址寄存器SI、DI中。如:MOV AX,[BX]
    3. 寄存器相对寻址方式:操作数的有效地址是寄存器内容与符号8位或16位位移量之和。如:MOV AX,[SI+06H]
    4. 基址变址寻址方式:把一个基址寄存器(BP或BX)的内容加上变址寄存器(SI或DI)的内容构成有效地址EA。如:MOV AX,[BX+SI]
    5. 相对基址变址寻址方式:使用基址寄存器(BX或BP)和变址寄存器(SI或DI),另外还在指令中指定一个8位或16位的位移量,这三者构成EA。如:MOV AX,[BX+DI-06H]

    数据传送类指令

    通用数据传送指令

    1. 传送指令MOV:把一个字节或字的操作数从源地址传送至目的地址。相当于赋值操作。注意:目的操作数不能为立即数以字母开头的十六进制数应该加一个前导0,以便与标识符区别。
      • 寄存器有明确的字节或字类型,对应的立即数或存储器操作数只能是字节或字;但将立即数传送给存储器单元时,指令中给出的立即数可以理解为字,也可以理解为字节,此时必须显式指明。汇编语言用byte ptr表示字节类型,用word ptr表示字类型。
    2. 交换指令XCHG:用来将源操作数和目的操作数内容互换,格式为:XCHG reg,reg/mem。注意:XCHG AL,byte ptr wvar+1这条指令的理解是——将字节变量wvar指向的地址的上一个地址(即wvar+1地址)里的内容取出来与AL做交换。
    3. 换码指令XLAT:用于将BX制定的缓冲区中的AL指定的位移处的数据取出赋给AL。

    堆栈操作指令

    1. 进栈指令PUSH:先使堆栈指针SP减2,然后把一个字操作数存入堆栈顶部。
    2. 出栈指令POP:把栈顶的一个字传送至指定的目的操作数,然后堆栈指针SP加2。注意:进栈先减地址后存内容,出栈先赋内容再加地址。把栈看做一个倒扣的箱子。

    标志操作指令

    1. 标志操作指令:CLC、STC、CMC、CLD等。

    地址传送指令

    1. 地址传送指令LEA:将存储器操作数的有效地址(段内偏移地址)传送至16位通用寄存器中。

    算术运算类指令

    加减法指令

    1. 加法指令ADD:使目的操作数加上源操作数,结果送到目的操作数。注意:目的操作数不能为立即数,且两个操作数不能同为存储器寻址方式。
    2. 加法指令ADC:结果会再加上进位标志CF送到目的操作数。
    3. 减法指令SUB:目的操作数减去源操作数,结果送到目的操作数。
    4. 减法指令SBB:结果会减去借位标志CF送到目的操作数。
    5. 比较指令CMP:用目的操作数减去源操作数,通过影响状态标志CF看是否有借位来判断出两个数的大小关系。
    6. 增量和减量指令INC和DEC:INC自增1,类似于i++;DEC自减1,类似于i--

    符号扩展指令

    略了,不太重要,想学的可以自行百度

    乘除法指令

    略,考试不考,老师没讲...

    十进制调整指令

    略,这个就是一个规则,很简单的...

    位操作类指令

    逻辑运算指令

    1. 逻辑与指令AND:两位都是1,结果为1,否则都为0。
    2. 逻辑或指令OR:只要一位为1结果就为1,全0才为0。
    3. 逻辑异或指令XOR:两个不相同为1,相同为0。
    4. 逻辑非NOT:取反,1变为0。
    5. 测试指令TEST:做与操作,通过影响状态标志来测试条件,一般用在条件转移指令。

    规律:如果想把一个数其中某一位清零,就和0相与,其余位和1与;想把某一位置1,就和1做或,其余位和0或,想把某一位取反,和1做异或,其余位和0做异或,每一位都取反的话直接NOT操作。

    移位指令

    1. 逻辑移位指令SHL、SHR:分别对应左移一位,最低位补零,最高位进入CF和右移一位,最高位补零,最低位进入CF。
    2. 算术移位指令SAL、SAR:分别对应左移一位和右移一位。格式:SAL reg/mem,1/CL。注意:目的操作数可以是寄存器或存储单元,后一个操作数表示移位位数,当移位数大于1时,用MOV指令给CL赋值,再用CL表示移位位数。
      左移同逻辑左移相同,算数右移一位,最高位不变,最低位进入CF。
      注意:判断数据的奇偶性只需要看二进制数据的最后一位(因为除最后一位,其余位都是2的倍数),最后一位只要是0,为偶数,为1就是奇数。

    循环移位指令

    1. 不带进位循环移位指令ROL、ROR,同样带着CF标志位,但是不影响SF、ZF、PF、AF标志。
    2. 带进位循环移位指令RCL、RCR

    控制转移类指令

    在8088CPU中,程序代码安排在代码段。8088CPU有相对、直接和间接三种地址寻址方式。

    8088将地址转移分为了段内转移和段间转移。

    • 段内转移:在当前代码段64KB范围内转移,不需要更改CS段地址,只要改变IP偏移地址。称为“近转移”,它可以在±32KB范围跳转。如果范围在-128~+127之间,称为“短转移”。
    • 段间转移:从当前代码段跳转到另一个代码段,需要更改CS段地址和IP偏移地址,称为“远转移”。

    无条件转移指令

    • 段内相对转移JMP指令:用距离标号处的位移量加上当前偏移地址形成转移后的偏移地址;程序跳转到标号所在的位置处,开始执行指令。

    条件转移指令

    • 条件转移指令JCC:注意这里的CC是一个总的表示,代表转换条件的意思,JCC只支持短转移寻址方式。下表为条件转移指令中的条件CC:
    助记符 标志位 中文说明
    JZ/JE ZF=1 等于零/相等
    JNZ/JNE ZF=0 不等于零/不相等
    JS SF=1 符号为负
    JNS SF=0 符号为正
    JP/JPE PF=1 “1”的个数为偶数
    JNP/JPO PF=0 “1”的个数为奇数
    JO OF=1 溢出
    JNO OF=0 无溢出
    JC/JB/JNAE CF=1 进位/低于/不高于等于
    JNC/JNB/JAE CF=0 无进位/不低于/高于等于
    JBE/JNA CF=1或ZF=1 低于等于/不高于
    JNBE/JA CF=0或ZF=0 不低于等于/高于
    JL/JNGE SF≠OF 小于/不大于等于
    JNL/JGE SF=OF 不小于/大于等于
    JLE/JNG SF≠OF或ZF=1 小于等于/不大于
    JNLE/JG SF=OF或ZF=0 不小于等于/大于

    条件指令要利用影响标志的指令执行后的标志状态形成判定条件,所以在条件转移指令之前,常有比较CMP、测试TEST、加减运算、逻辑运算等指令。

    例子:寄存器AL中是字母Y(含大小写),则令AH=0,否则令AH=-1。

                CMP AL,'Y'      ;比较AL与大写字母Y(ASCII码值)
                JE NEXT         ;相等,转移
                CMP AL,'y'      ;不相等继续比较AL与小写y
                JE NEXT         ;相等,转移
                MOV AH,-1       ;不相等:AH<- -1
                JMP DONE        ;无条件转移,跳过另一个分支
                NEXT:MOV AH,0   ;相等时的处理
                DONE:......
    

    循环指令

    8088CPU设计了针对CX计数器的计数循环指令
    LOOP指令:首先将计数值CX减1,然后判断计数值CX是否为0;若不为0,转移到标号处执行;若等于0,顺序执行后面的指令。

    子程序指令

    子程序的作用就是用来执行一段特定功能,可以类比高级语言的函数。当主程序需要执行这个功能时,用CALL指令调用该子程序,这时程序就转移到子程序的起始处执行,在子程序最后,用RET指令返回调用它的主程序,继续指令后续指令。子程序框架如下:

    子程序名称    伪指令助记符
                 ···
                 ret
    子程序名称    endp 
    

    中断指令和系统功能调用

    DOS输入输出功能调用

    子功能号 功能 入口参数 出口参数
    AH=01H 输入一个字符 AL=输入字符的ASCII码
    AH=02H 输出一个字符 DL=欲显示字符的ASCII码
    AH=09H 输出一个字符串 DS:DX=欲显示字符串在内存中的首地址
    AH=0AH 输入一个字符串 DS:DX=输入字符串将在内存缓冲区的首地址

    上表罗列出了四个常用的输入输出功能调用。
    注意:使用0AH号调用,程序员应事先定义好缓冲区,并且注意缓冲区的格式:第1字节填入最多欲接收的字符个数(可以是1~255,包括最后的回车符),留出第2字节用于存放功能调用时实际输入的字符个数(这里不包括回车符),从第3字节开始才存放实际输入的字符串ASCII码

    欢迎大家访问我的个人博客

    相关文章

      网友评论

        本文标题:「微机原理」微处理器指令系统

        本文链接:https://www.haomeiwen.com/subject/vdmyuxtx.html