微机原理笔记(4)

一、数据传送指令

1、数据传送指令MOV

  • 语句格式:MOV  OPD,OPS
  • 功能:将源操作数传入目的地址,源地址内容不变。即(OPS)-->OPD

注意: 

  • MOV指令不改变源操作数内容不影响标志位
  • 源操作数和目的操作数应该有相同的类型,即必须同为字节型或字型。
  • 代码段寄存器CS不能用作目的操作数,即不允许给CS赋值
  • 立即数不能用作目的操作数,立即数也不能直接传送数据给段寄存器
  • 源操作数和目的操作数不能同时为存储单元操作数
  • 不允许在段寄存器之间直接传送数据

2、进栈指令PUSH

  • 语句格式:PUSH    SRC
  • 功能:将寄存器、段寄存器或存储器中的一个字数据压入堆栈,堆栈指针减2
       即:(SP)-2 --> SP 

3、出栈指令POP

  • 语句格式:POP  OPD
  • 功能:将栈顶元素弹出送至某一寄存器、段寄存器(CS除外)或存储器,堆栈指针加2。

4、数据交换指令XCHG

  • 语句格式:XCHG   OPR1,OPR2
  • 功能:将源地址与目的地址中的内容互换。 

5、累加器专用传送指令:输入指令IN/输出指令OUT 

  • 输入指令用来从指定的外设寄存器取信息送入累加器。
  • 此指令实现I/O端口CPU之间的数据传送。
    • 输入指令  IN    acc,PORT/DX
    • 输出指令  OUT   PORT/DX,acc
  • 指令采用两种寻址方式:
    • 直接寻址:在指令中直接给出端口的8位地址,因此可寻址256个端口
    • 间接寻址:在指令中用寄存器DX给出端口的16位地址,因此可寻址65536个端口
  • 用输入指令完成从输入端口到CPU的数据传送
  • 用输出指令完成从CPU到输出端口的数据传送 

注意:

  • 输入/输出指令只能使用累加器AL或AX接收或发送数据。
  • 使用短格式指令,必须将端口地址放入寄存器DX中。
  • 输入/输出指令不影响标志位 

6、地址传送指令

1、有效地址传送指令LEA

  • 格式:LEA   OPD,OPS
  • 功能:主存按源地址的寻址方式计算偏移地址,将偏移地址送入指定寄存器。
  • 补充:以下两条语句等效
    • MOV  BX,OFFSET   NUM;将NUM的偏移地址送入BX中
    • LEA   BX,NUM    ;将NUM的偏移地址送入BX中

2、指针送寄存器和DS指令LDS

  • 格式:LDS    OPD , OPS
  • 功能:将主存中指定字单元数据送入指定存储器下一字单元数据送DS寄存器
  • 即(OPS)--> OPD,(OPS+2)-->DS

3、指针送寄存器和附加数据段ES指令LES 

  • 格式:LES   OPD,OPS
  • 功能:将主存某字节单元内容送指定寄存器,下一字单元数据送ES寄存。
    • 即(OPS)-->OPD,(OPS+2)--> ES。

二、算术运算指令

1、加法指令ADD、带进位加指令ADC

  • 格式:ADD   DST,SRC;

  • 指令的功能是把源操作数的值加到目的操作数中。

  • 根据结果设置FLAGS的OF,SF,ZF,AF,PF和CF标志位 

  • 格式:ADC   DST,SRC;
  • 指令的功能是把源操作数和进位标志位CF的值(0/1)一起加到目的操作数中 
  •  加1指令INC
    • 格式:INC   OPR;
    • 功能:把操作数的值加1(不影响CF
  • 交换加指令XADD
    • 格式:XADD   oprd1,oprd2;
    • 功能:交换两个操作数的值,再进行算术“加”法操作。

2、减法指令SUB

  • 格式:SUB   DST,SRC ;
  • 功能:目的操作数(DST)减去源操作数(SRC)
  • 影响六个状态标志,AF为半借位,CF为借位

带借位减SBB 

  • 格式:SBB   DSI,SRC;
  • 把源操作数和标志位CF的值从目的操作数中一起减去。

减1指令DEC

  • 格式:DEC   OPR;
  • 把操作数的值减去1(不影响CF

求补指令NEC

  • 格式:NEC   OPR;
  • 功能:操作数= 0 - 操作数。 

比较指令CMP

  • 格式:CMP   OPD,OPS     
  • 功能:目的操作数减源操作数,与SUB指令一样执行减法操作,但不回送相减结果,结果只影响标志位
  • (OPD)-(OPS)。CMP指令通常用在选择结构程序中,其后紧跟着条件转移指令,用来根据比较结果转向不同的程序分支。

3、乘法指令MUL

无符号乘法指令MUL

  •  格式:MUL    src
  • MUL为操作码助记符;src为源操作数(乘数),也可以是寄存器或存储单元,但不能使用立即数或段寄存器。
  • 功能:两个无符号数相乘。
    • 字节乘法:AX <--(AL)*(src)
    • 字乘法:DX(高字),AX(低字)<--(AX)*(src)
  • 注意:指令中只指定乘数,被乘数默认在寄存器ALAX。该指令只影响状态标志CF和OF,对其它标志位无定义。

有符号乘指令IMUL

  • 格式:IMUL   SRC
  • 功能:
    • 字节乘法:(AL)*(SRC)--> AX
    • 字乘法:(AX)*(SRC)--> DX、AX
  • IMUL指令除计算对象是带符号二进制数外,其他都与MUL一样,但计算结果不同。

4、除法指令DIV

除法指令的被除数是隐含操作数,除数在指令中显式地写出来。
除法指令功能是用显式操作数除隐含操作数,可得到余数。当除数为0,或商超出数据类型所能表示的范围时,系统会自动产生0号中断。

无符号除指令DIV

  • 格式:DIV   OPS;
  • 功能:
    • 字节除法:(AX)/(OPS)--> AL(商)、AH(余数)
    • 字除法:(DX、AX)/(OPS) -->  AX(商)、DX(余数)

有符号除指令IDIV

  • 格式:IDIV   OPS;
  • 功能:
    • 字节除法:(AX)/(OPS)-->  AL(商)、AH(余数)
    • 字除法:(AD、AX)/(OPS)-->  AX(商)、DX(余数)
  • 8086/8088规定IDIV指令运算结果余数的符号与被除数相同
  • 除法指令DIV和IDIV虽然对标志位的影响未定义,但可产生溢出

字节转换成字指令CBM

  • 格式:CBM
  • 功能:将AL中的符号位数据扩展至AH(补0)。

字转换为双子指令CWD

  • 格式:CWD
  • 功能:将AX中数的符号扩展到DX中。若AX中的数为正数,则(DX)=0000,否则(DX)=0FFFFH

5、十进制调整指令BCD码

  • BCD码是一种用二进制编码的十进制数,又称二一十进制数。
  • ...略* 

三、逻辑运算和移位指令 

1、逻辑指令

逻辑指令对字节或字数据进行按位的运算操作。

  • 逻辑与AND   DST,SRT;-->(DST)
    设置CF=OF=0,影响SF、ZF、PF、对AF无定义
  • 逻辑或OR    DST,SRC;-->(DST);标志同上
  • 逻辑非NOT  OPR;-->(OPR);不影响标志位
  • 异或XOR   DST,SRC;-->(DST);标志同AND
  • 测试TEST   OPR1,OPR2;运算与AND相同,但不保存结果,只根其特征置条件标志。 

2、移位指令 

移位指令从移位方向上分为左移或右移;从移位功能上可以分为算术逻辑移位或循环移位,前者是开环的;后者是闭环的;从位移次数上可以分为一次移位或多次移位。

逻辑左移指令SHL

  • 格式:SHL   OPD,1  或  SHL   OPD, CL
  • 功能:将OPD的内容向左移动指定的位数最高位移入CF中,低位补0

算术左移指令SAL

  • 格式:SAL   OPD,1 或 SAL   OPD,CL
  • 功能:其操作与逻辑左移指令SHL完全相同

逻辑右移指令SHR

  • 格式:SHR   OPU,1 或 SHR   OPD , CL
  • 功能:将OPD的内容向右移动指定的位数最低位移入CF中,高位补0

算术右移指令SAR

  • 格式:SAR  OPD,1 或 SAR  OPD,CL
  • 功能:将OPD的内容向右移动指定的位数最低位移入CF中,最高位保持不变

循环左移指令ROL

  • 格式:ROL   OPD,1ROL   OPD,CL
  • 功能:将OPD的内容向左移动指定的位数最高位同时移入最低位CF

  • 循环位移可以改变操作数中原有位的位置

循环右移指令ROR

  • 格式:ROR   OPD,1 或 ROR   OPD,CL
  • 功能:将OPD的内容向右移动指定的位数最低位同时移入最高位CF中。

带进位的循环左移指令RCL

  • 格式:RCL   OPD,1 或 RCL   OPD,CL
  • 功能:将OPD的内容连同CF标志一起向左循环所规定的位数。

四、串操作指令

为8086提供一组处理主存中连续存放数据串的指令

1、与REP相配合工作的MOVS,STOS和LODS指令

 REP重复串操作

  • REP前缀用在串传送指令MOVS存入串指令STOS从源串中取数指令LODS指令
  • 功能:每执行一次串指令(CX)-1,直到(CX)=0,重复执行结束。
  • 例:REP  MOVS

MOVS串传送指令

  • 格式:
    • MOVSB----字节串传送
    • MOVSW----字串传送
  • 功能:将以SI为指针的源串中的一个字节(或字)存储单元中的数据传送至以DI为指针的目的地址中,并自动修改指针使之指向下一个字节(或字)存储单元。 

存入串指令STOS

  • 格式:
    • STOSB----往字节串中存数
    • STOSW----往字串中存数
  • 功能:将AL或AX中的数据送入DI所指的目的串中的字节(或字)存储单元中。
  • 即字节操作:(AL)--> [DI]
        字操作:(AX)-->[DI]
  • 修改指针DI,使之指向串的下一个元素

从源串中取数指令LODS指令

  • 格式:
    • LODSB----从字节串中取数
    • LODSW---从字串中取数
  • 功能:将SI所指的源串中的一个字节(或字)存储单元中的数据取出来送入AL(或AX)中。
  • 即:字节操作:([SI])-->AL,字操作:([SI])--> AX
         修改指针SI,使它指向串中的下一个元素。
  • 当DF=0,(SI)增量。当DF=1时,(SI)减量。

2、与REPE/REPZ和REPNE/REPNZ联合工作的串比较指令CMPS和串扫描指令SCAS 

REPE/REPZ

  • 某次比较的结果两个操作数相等,或两个操作数相减为零重复串操作
  • 一般用在CMPS,SCAS指令前。
  • 功能:每执行一次串指令(CX)-1,并判断ZF标志是否为0,只要(CX)=0或ZF=0,则重复执行结束。

REPNE/REPNZ

  • 某次比较的结果两个操作数不相等,或两个操作数相减不为零时重复串操作。
  • 一般用在CMPS,SCAS指令前。
  • 功能:每执行一次串指令(CX)-1,并判断ZF标志是否为0,只要(CX)=0或ZF=1,则重复执行结束。

CMPS串比较指令

  • 格式:
    • CMPSB----字节串比较
    • CMPSW---字串比较
  • 功能:将SI所指的源串中的一个字节(或字)存储单元中的数据与DI所指的目的串中的一个字节(或字)存储单元的数据相减,并根据相减结果设置标志,单结果不保存
  • 即:([SI])-([DI])
        修改串指针,使之指向串中的下一个元素。

串扫描指令SCAS

  • 格式:
    • SCASB---字节串搜索
    • SCASW---字串搜索
    • 功能:AL(字节)或AX(字)中的内容与DI所指的目的串中的一个字节(或字)存储单元中的数据相减,根据相减结果设置标志位结果不保存
    • 即:字节操作:(AL])-([DI])字操作:(AX])-([DI])
          修改串指针,使之指向串中的下一个元素。
    • 当DF=0,(DI)增量。当DF=1时,(D)减量。

五、控制转移指令

1、无条件转移指令

段内转移指令JMP

  •  格式:
    • 段内直接短转移:JMP   SHORT   OPR;(IP)<--(IP)+8位位移量
    • 段内直接近转移;  JMP    NEAR    PTR    OPR;(IP)<--(IP)+16位位移量
    • 段内间接转移: JMP    WORD   OPR;(IP)<--(EA),WORD、PTR是运算符

段间转移指令

  • 格式:
    • 段间直接(远)转移  JMP    FAR   PTR   OPR;   IP<--P[R的端内偏移地址,CS<-OPR的段地址
    • 段间间接转移   JMP   DWORD   PTR   OPR;IP<--(OPR)段内偏移地址,CS<--(OPR+2)

2、条件转移指令 

条件转移指令将前一条指令执行结果对状态标志位的影响,作为程序转移的条件。满足条件时转移到指令指定的地址,否则将顺序执下条指令。可作为判断条件的状态标志位有CF、DF、ZF、SF和OF。

条件转移指令都是采用相对寻址方式的双子节指令,操作码+位移量。不影响状态标志。

测试寄存器CX的值为0转移指令

  • 格式:
    • JCXZ   OPR:  (CX)=0则转移
  • 此指令在循环结构的程序中,将寄存器CX用作计数器,根据寄存器CX内容的修改情况实现二分支转移

3、循环控制指令

(1):LOOP    OPR(CX)不等于0 循环,否则顺序执行

(2):为零/相等循环:LOOPZ/LOOPE   OPR;当ZF=1且(CX)不等于0则循环。反之

(3):不为零/不相等循环:LOOPNZ/LOOPNE;与上相反

注意:

  • 使用循环控制指令之前,必须在寄存器CX(作为计数器)中预置循环次数的初值
  • 执行循环控制指令时,将完成(IP)<--(IP)+8位位移量(符号位扩展到16位)的操作
  • 循环控制指令不影响状态标志位
  • 循环控制指令主要用于数据比较、查找关键字等操作 

六、处理器控制指令

1、子程序调用及返回指令

调用指令CALL

  • 段内直接调用CALL   DST;(SP)<--(SP)-2
  • 例:
    • CALL   3000H:指令直接给出调用地址3000H
    • CALL  NEAR  PTR   SUBR;指令直接给出调用的“近”过程名SUBR
      • :NEAR   PTR是段内调用运算符。
    • 段内间接调用CALL   DST;

返回指令RET

  • 段内返回RET

2、中断指令

  •  计算机程序运行期间遇到某些特殊情况时,需要CPU停止当前的程序转去执行一组专门的程序,这种情况称为中断,这组程序称为中断服务程序。
  • 8086中断分为外部中断内部中断。外部中断通过外部设备接口向CPU的中断请求引脚发出请求,内部中断则由CPU执行中断指令而产生
  • 中断指令:INT    TYPE
  • 溢出中断指令:INTO;当运算结果溢出时OF=1并产生中断。
  • 中断返回   IRET;

3、其它处理机控制指令

空操作指令NOP

  • 格式:NOP
  • 此指令为单字节指令,不执行任何操作,只起到占用存储器空间时间延迟的作用。
  • 处理器控制指令中,只有状态标志位操作指令影响指定的标志位,其他指令不影响。

停机指令HLT

  • 格式:HLT
  • 此指令可暂停计算机工作,使处理器处于停机状态,用于等待一次外部中断的产生,中断结束后,继续执行下面的程序。

等待指令WAIT

  • 格式:WAIT
  • 此指令使处理器处等待状态,也可以用来等待外部中断发生,但中断结束后仍返回WAIT指令继续等待。本指令不允许使用立即数和寄存器寻址方式

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/327560.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python中的变量

最近学习了一套课程&#xff0c;体系比较完善&#xff0c;写一下读书笔记&#xff0c;方便后续的复习。 课程涉及的面比较广&#xff0c;包括python的基础、后端框架django、flask&#xff1b;前端开发&#xff0c;html、css、JavaScript、vue、reac&#xff1b;数据库&#x…

模板模式实现分布式锁实战

前言 分布式锁相信大家都有用过&#xff0c;常见的分布式锁实现方式例如redis、zookeeper、数据库都可以实现&#xff0c;而我们代码中强引用这些分布式锁的代码&#xff0c;那么当我们以后想替换分布式锁的实现方式时&#xff0c;需要修改代码的成本会很高&#xff0c;于是我…

【Python实战】global关键字的应用和线程并发

【Python实战】global关键字的应用和线程并发 一、前言编译环境 二、gloabl全局变量关键字代码示例 三、程序运行时全局变量的变化代码示例 四、全局变量的线程安全问题五、总结 在很多场景和业务实践中&#xff0c;线程之间的变量共享和保持原子性非常的关键和重要。 这边主要…

HarmonyOS 开发基础(五)Button

HarmonyOS 开发基础&#xff08;五&#xff09;Button Entry Component struct Index {build() {Row() {Column() {// Button&#xff1a;ArkUI 的基础组件 按钮组件// label 参数&#xff1a;文字型按钮Button(我是按钮)// width&#xff1a;属性方法&#xff0c;设置组件的宽…

Python如何生成个性二维码

Python-生成个性二维码 一、问题描述 通过调用MyQR模块来实现生成个人所需二维码。 安装&#xff1a; pip install myqr 二、代码实现 1.普通二维码 from MyQR import myqr # 普通二维码 myqr.run(wordshttp://www.csdn.net/mayi0312,save_nameqrcode.png ) 效果图&#…

Vue2商品规格选择

Vue2Element-ui Vu2仿写拼多多商家后台规则选择&#xff0c;为什么用Vue2呢&#xff0c;因为公司用的Vue2... 样式不是很好看&#xff0c;自己调一下就行。 <template><div ref"inputContainer"><div>{{ combinationsResult }}</div><…

【开源】基于JAVA语言的智能教学资源库系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 课程档案模块2.3 课程资源模块2.4 课程作业模块2.5 课程评价模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 课程档案表3.2.2 课程资源表3.2.3 课程作业表3.2.4 课程评价表 四、系统展示五、核心代…

【响应式编程-05】Lambda方法引用

一、简要描述 Lambda的方法引用也叫引用方法 方法引用初体验方法引用的底层实现方法引用的语法格式方法引用举例 静态方法引用构造方法引用普通方法引用super和this方法引用数组的方法引用 二、方法引用初体验 为什么出现方法引用&#xff1f; 引用已存在方法&#xff0c;避免重…

DBeaver配置类Navicat显示字段是否非空

在Navicat中设计表时可以很方便的看到字段是否【非空】&#xff0c;而在DBeaver中确实这样显示的,必须双击字段才能看到是否【非空】 解决方案 点击此处齿轮按钮,将【非空】以及其他需要的显示字段都勾上,重新打开即可

Python中的有序字典是什么

有序字典 一、简介 Python中的字典的特性&#xff1a;无序性。 有序字典和通常字典类似&#xff0c;只是它可以记录元素插入其中的顺序&#xff0c;而一般字典是会以任意的顺序迭代的。 二、普通字典 #! /usr/bin/env python3 # -*- coding:utf-8 -*- d1 {} d1[a] A d1[b…

【Java EE初阶七】多线程案例(生产者消费者模型)

1. 阻塞队列 队列是先进先出的一种数据结构&#xff1b; 阻塞队列&#xff0c;是基于队列&#xff0c;做了一些扩展&#xff0c;适用于多线程编程中&#xff1b; 阻塞队列特点如下&#xff1a; 1、是线程安全的 2、具有阻塞的特性 2.1、当队列满了时&#xff0c;就不能往队列里…

druid Communications link failure报错处理

现象 日志报错&#xff1a;com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure 原因 从数据库连接池拿到了已经关闭的连接&#xff0c;导致报错。druid有定时任务进行空闲连接的检测和回收&#xff0c;当连接时长超过mysql的连接超时时间…