【微机原理】

微机概述

  • 计算机由运算器、控制器、存储器、输入设备和输出设备5个基本部分组成。
  • 微型计算机总线系统
    数据总线 DB(双向) 、控制总线 CB(双向)、地址总线  AB(单向);
  • 8086/8088CPU内部结构按照功能划分
    包括总线接口部分BIU执行部分EU
    BIU负责CPU与存储器,,输入/输出设备之间的数据传送,包括取指令、存储器读写、和I/O读写等操作。 EU部分负责指令的执行。

在这里插入图片描述
在这里插入图片描述

8086/8088CPU内部寄存器

在这里插入图片描述
8086/8088CPU内部共有14个16位寄存器,通用寄存器(8个)、段寄存器(4个)、控制寄存器(2个)。
1、通用寄存器

  • 数据寄存器(AX、BX、CX、DX)
    8088/8086含4个16位数据寄存器,它们又可分为8个8位寄存器,即:AX->AH、AL  BX->BH、BL CX->CH、CL DX->DH、DL
    AX:累加器。所有I/O指令都通过AX与接口传送信息,中间运算结果也多放于AX中;
    BX:基址寄存器。在间接寻址中用于存放基地址;
    CX:计数寄存器。用于在循环或串操作指令中存放计数值;
    DX:数据寄存器。在间接寻址的I/O指令中存放I/O端口地址;在32位乘除法运算时,存放高16位数。
  • 地址指针寄存器(SP、BP)
    SP:堆栈指针寄存器,其内容为栈顶的偏移地址;
    BP:基址指针寄存器,常用于在访问内存时存放内存单元的偏移地址。
  • 变址寄存器(SI、DI)
    SI:源变址寄存器
    DI:目标变址寄存器
    变址寄存器在指令中常用于存放数据在内存中的地址。

注意:
BX与BP在应用上的区别:

  • 作为通用寄存器,二者均可用于存放数据;
  • 作为基址寄存器,用BX表示所寻找的数据在数据段;用BP则表示数据在堆栈段。

2、段寄存器
8088/8088采用将地址空间分段的方法。
内存每个单元的地址在逻辑上都由两部分组成:
段(基)地址:指示存储单元在整个内存空间中处于哪个区域
段内地址(相对地址/偏移地址):指示存储单元在段中的相对位置(与段中第1个单元的距离)
物理地址 = 段地址 * 16 + 段内偏移

  • CS
    代码段寄存器,存放代码段的段基地址
  • DS
    数据段寄存器 ,存放数据段的段基地址
    ES
  • 附加段寄存器,存放数据段的段基地址
  • SS
    堆栈段寄存器, 存放堆栈段的段基地址

3、控制寄存器IP、FLAGS
FLAGS称为标志寄存器或程序状态字,是16位寄存器,其中使用的是9位,包括6个状态标志和3个控制标志。
状态标志位:

  • CF(Carry Flag)
    进位标志位。加(减)法运算时,若最高位有进(借)位则CF=1
  • OF(Overflow Flag)
    溢出标志位。当算术运算的结果超出了有符号数的可表达范围时,OF=l
  • ZF(Zero Flag)
    零标志位。当运算结果为零时ZF=1
  • SF(Sign Flag)
    符号标志位。当运算结果的最高位为1时,SF=l
  • PF(Parity Flag)
    奇偶标志位。运算结果的低8位中“1”的个数为偶数时PF=l
  • AF(Auxiliary Carry Flag)
    辅助进位标志位。加(减)操作中,若Bit3向Bit4有进位(借位),AF=1
    AF和PF仅针对低8位

控制标志位:

  • TF(Trap Flag)
    陷井标志位,也叫跟踪标志位。TF=1时,使CPU处于单步执行指令的工作方式。
  • IF(Interrupt Enable Flag)
    中断允许标志位。IF=1使CPU可以响应可屏蔽中断请求。
  • DF(Direction Flag)
    方向标志位。在数据串操作时确定操作的方向。

寻址方式

立即寻址

操作数在指令中,紧跟在操作码之后,这样的操作数成为立即数,可以是8bit或者16bit。

例如:

     MOV AL,12H
     MOV AX,1234H
寄存器寻址

寄存器寻址:操作数在CPU寄存器中,指令中指定寄存器编号

	MOV SI, AX 
	MOV AL, AH
直接寻址

直接寻址:操作数在存储器中,指令直接包含操作数的有效地址。此时操作数一般存放在数据段DS中,采用换段前缀可以使用其它段寄存器。

	MOV AX,[1234H]
寄存器间接寻址

寄存器间接寻址:操作数在存储器中,操作数有效地址在SI、DI、BX、BP之一种。在不使用换段前缀的情况下,若有效地址在SI/DI/BX中,则以DS的值为段值;若有效地址在BP中,则以段寄存器SS的值为段值。

	MOV AX,[SI]
	MOV [BP], CX
寄存器相对寻址

寄存器相对寻址:操作数在存储器中,操作数的有效地址是一个基址寄存器(BX、BP)或变址寄存器(SI、DI)内容加上指令中给定的8位或16位位移量之和。即:EA = (BX/BP/SI/DI) + (8/16位位移量)
  在不使用换段前缀的情况下,若SI/DI/BX的内容作为有效地址的一部分,则以DS的值为段值;若BP的内容作为有效地址的一部分,则以段寄存器SS的值为段值。
  在指令中给定的8位或16位位移量以补码形式表示。在计算有效地址时,若位移量是8位,则将其有符号扩展为16位,当有效地址超过FFFFH,则对其进行64K取模。

MOV  AX,[DI+1233H]
基址、变址寻址

操作数的偏移地址为:
  一个基址寄存器的内容 + 一个变址寄存器的内容;
操作数的段地址由选择的基址寄存器决定:
  基址寄存器为BX,默认在数据段
  基址寄存器为BP,默认在堆栈段
基址变址寻址方式与相对寻址方式一样,主要用于一维数组操作。

MOV SI,1100H
MOV BP,SI
MOV AX,[SI+BP]
基址、变址、相对寻址

操作数的偏移地址为:
  基址寄存器内容+变址寄存器内容+位移量
操作数的段地址由选择的基址寄存器决定
基址变址相对寻址方式主要用于二维表格操作。

MOV DI,1100H
MOV BP,DI
MOV  AL,[BP][DI]5
隐含寻址

指令中隐含了一个或两个操作数的地址,即操作数在默认的地址中。

MUL  BL		//AL×BL--> AX

指令系统

指令中包含的信息

  • 运算数据的来源
  • 运算结果的去向
  • 执行的操作
    在这里插入图片描述
    指令格式:
  • 零操作数指令: 操作码
  • 单操作数指令: 操作码 操作数
  • 双操作数指令: 操作码 操作数,操作数
  • 多操作数指令: 三操作数及以上
数据传送指令
1.通用数据传送

1)一般数据传送指令MOV

MOV  dest,src		//src-->dest
  • 两操作数字长必须相同;
  • 两操作数不允许同时为存储器操作数;
  • 两操作数不允许同时为段寄存器;
  • 在源操作数是立即数时,目标操作数不能是段寄存器;
  • IP和CS不作为目标操作数,FLAGS一般也不作为操作数在指令中出现。

2)堆栈操作指令
堆栈操作的原则:

  • 先进后出
  • 以字为单位

压栈指令

  • 格式: PUSH OPRD
  • 指令执行过程:
    SP - 2 → SP
    操作数高字节 → SP+1
    操作数低字节 → SP
    在这里插入图片描述

出栈指令

  • 格式: POP OPRD
  • 指令执行过程:
    SP → 操作数低字节
    SP+1 → 操作数高字节
    SP ← SP+2
    在这里插入图片描述
  • 指令的操作数必须是16位;
  • 操作数可以是寄存器或存储器两单元,但不能是立即数;
  • 不能从栈顶弹出一个字给CS;
  • PUSH和POP指令在程序中一般成对出现;
  • PUSH指令的操作方向是从高地址向低地址,而POP指令的操作正好相反。

3) 交换与查表指令
格式:
XCHG REG,MEM/REG
注:

  • 两操作数必须有一个是寄存器操作数
  • 不允许使用段寄存器。

例:

XCHG	AX,BX
XCHG	[2000],CL

4)字位扩展指令
字节到字的扩展指令

  • 格式:
    CBW
  • 操作:
    将AL内容扩展到AX
  • 规则:
    若最高位=1,则执行后AH=FFH
    若最高位=0,则执行后AH=00H

字到双字的扩展指令

  • 格式:
    CWD
  • 操作:
    将AX内容扩展到DX AX
  • 规则:
    若最高位=1,则执行后DX=FFFFH
    若最高位=0,则执行后DX=0000H
2.输入输出

专门面向I/O端口操作的指令
指令格式:

  • 输入指令: IN acc,PORT
  • 输出指令 :OUT PORT,acc

根据端口地址码的长度,指令具有两种不同的端口地址表现形式。

  • 直接寻址
    端口地址为8位时,指令中直接给出8位端口地址;
    寻址256个端口,端口地址范围:0000H-00FFH。
  • 间接寻址
    端口地址为16位时,指令中的端口地址必须由DX指定;
    可寻址64K个端口,端口地址范围:0000H-FFFFH 。
IN  AX,80H		;80H端口读入16bit数据到AX
MOV DX,2400H
    IN  AL,DX	;2400H端口读入8bit数据到AL
OUT  35H ,AX	;将AX的值写入到35H端口中
OUT  AX,35H	×
IN   35H,AX	×
3.地址传送

取偏移地址指令LEA

  • 操作:
    将变量的16位偏移地址取出送目标寄存器
    当程序中用符号表示内存偏移地址时,须使用该指令。
  • 格式:
    LEA REG,MEM
  • 指令要求:
    源操作数必须是一个存储器操作数,目标操作数通常是间址寄存器。
算术运算类指令
1.加法指令

1)ADD指令

  • 格式:
    ADD OPRD1,OPRD2
  • 操作:
    OPRD1+OPRD2 → OPRD1

ADD指令的执行对全部6个状态标志位都产生影响
在这里插入图片描述
2)ADC指令

  • 指令格式、对操作数的要求、对标志位的影响与ADD指令完全一样
  • 指令的操作:
    OPRD1+OPRD2+CF
  • ADC指令多用于多字节数相加,使用前要先将CF清零。

3)INC指令

  • 格式:
    INC OPRD
  • 操作:
    OPRD+1 → OPRD
  • 常用于在程序中修改地址指针
2.减法指令

1)SUB指令

  • 格式:
    SUB OPRD1,OPRD2
  • 操作:
    OPRD1- OPRD2 → OPRD1
  • 对标志位的影响与ADD指令同

2)SBB指令

  • 指令格式、对操作数的要求、对标志位的影响与SUB指令完全一样
  • 指令的操作:
    OPRD1- OPRD2- CF → OPRD1

3)DEC指令

  • 格式:
    DEC OPRD
  • 操作:
    OPRD - 1 → OPRD
  • 指令对操作数的要求与INC相同
    指令常用于在程序中修改计数值

4)NEG指令

  • 格式:
    NEG OPRD
  • 操作:
    0 - OPRD
  • 用0减去操作数,相当于对该操作数求补码

5)CMP指令

  • 格式:
    CMP OPRD1,OPRD2
  • 操作:
    OPRD1- OPRD2
  • 指令执行的结果不影响目标操作数,仅影响标志位!
  • 用途:
    用于比较两个数的大小,可作为条件转移指令转移的条件
  • 指令对操作数的要求及对标志位的影响与SUB指令相同
3.乘法指令

注:乘法指令采用隐含寻址,隐含的是存放被乘数的累加器AL或AX及存放结果的AX,DX

1)无符号的乘法指令MUL

  • 格式:
    MUL OPRD(不能是立即数)
  • 操作:
    OPRD为字节数:AL×OPRD → AX
    OPRD为16位数:AX×OPRD → DX AX
    在这里插入图片描述
    2)带符号的乘法指令IMUL
  • 格式:
    IMUL OPRD
  • 指令格式及对操作数的要求与MUL指令相同。
  • 指令执行原理:
  1. 将两个操作数取补码(对负数按位取反加1,正数不变);
  2. 做乘法运算;
  3. 将乘积按位取反加1。
4.除法指令

1)无符号除法指令

  • 格式:
    DIV OPRD

  • 若OPRD是字节数
    执行:AX/OPRD
    结果:
    AL=商 AH=余数

  • 若OPRD是双字节数
    执行: DXAX/OPRD
    结果:
    AX=商 DX=余数

2)有符号除法指令
格式:
IDIV OPRD

逻辑运算
  • 逻辑运算指令对 操作数的要求大多与MOV指令相同。
  • “非”运算指令要求操作数不能是立即数;
  • 除“非”运算指令外:
    其余指令的执行都会影响除AF 外的5个状态标志;
    无论执行结果任何,都会使标志位OF=CF=0。

1)逻辑与指令:AND DST, SRC
执行操作: (DST) ← (DST) ∧ (SRC)

  • 应用:
    1.实现两操作数按位相与的运算
    AND BL,[SI]
    2.使目标操作数的某些位不变,某些位清零
    AND AL,0FH
    3.在操作数不变的 情况下使CF和OF清零
    AND AX,AX

2)逻辑或指令:OR DST, SRC
执行操作: (DST) ← (DST)∨(SRC)

  • 应用:
    1.实现两操作数 相 “或”的 运算
    OR AX,[DI]
    2.使某些位不变,某些位置“1”
    OR CL,0FH
    3.在不改变操作数的 情况下使OF=CF=0
    OR AX,AX

3)逻辑非指令:NOT OPRD
执行操作:操作数按位取反再送回原地址

  • 注:
    指令的执行对标志位无影响
  • 例:
    NOT BYTE PTR[BX]

4)异或指令: XOR DST, SRC
执行操作: (DST) ← (DST)⊕(SRC)

5)测试指令: TEST OPR1, OPR2
执行操作: (OPR1)∧(OPR2)

  • 应用:
    常用于测试某些位的状态
移位指令
  • 非循环移位指令
  • 循环移位指令
  • 注:
    移动一位时由指令直接给出;
    移动两位及以上,则移位次数由CL指定。
非循环移位指令

1)算术左移指令:
SAL OPRD,1
SAL OPRD,CL
2)逻辑左移指令:
SHL OPRD,1
SHL OPRD,CL
3)逻辑右移
格式:
SHR OPRD,1
SHR OPRD,CL
4)算术右移
格式:
SAR OPRD,1
SAR OPRD,CL
在这里插入图片描述

循环移位指令

不带进位位的循环移位
左移 ROL
右移 ROR
带进位位的循环移位
左移 RCL
右移 RCR
指令格式、对操作数的要求与非循环移位指令相同
在这里插入图片描述
在这里插入图片描述

串操作指令
  • 目标操作数必须在附加段,源操作数默认在数据段(允许段重设)。
  • 源串和目标串指针分别为SI和DI
  • 串长度值必须由CX给出
  • 需要设置数据的操作方向
    确定DF的状态
  • 串操作指令前可以加重复前缀。使用时应注意:
    传送类指令前加无条件重复前缀
    串比较类指令前加条件重复前缀,但前缀不影响ZF状态
1.串传送指令
  • 格式:
    MOVS OPRD1,OPRD2
    MOVSB
    MOVSW
  • 串传送指令常与无条件重复前缀连用
2.串比较指令
  • 格式:
    CMPS OPRD1,OPRD2
    CMPSB
    CMPSW
  • 串比较指令常与条件重复前缀连用,指令的执行不改变操作数,仅影响标志位。
  • 前缀的操作对标志位不影响
3.串扫描指令
  • 格式:
    SCAS OPRD
    SCASB
    SCASW
  • 执行与CMPS指令相似的操作,只是这里的源操作数是AX或AL

注:

  • 需要定义附加段
    目标操作数必须在附加段
  • 需要设置数据的操作方向
    确定DF的状态
  • 源串和目标串指针分别为SI和DI
  • 串长度值必须由CX给出
  • 注意重复前缀的使用方法
    传送类指令前加无条件重复前缀
    串比较类指令前加条件重复前缀,但前缀不影响ZF状态
程序控制指令

程序的执行方向

  • 程序控制类指令的本质是:
    控制程序的执行方向
  • 决定程序执行方向的因素:
    CS,IP
  • 控制程序执行方向的方法:
    仅修改IP,则程序将改变当前的执行顺序,转向本代码段内其它某处执行;
    修改CS 和IP ,则程序转向另一个代码段执行。
转移指令
无条件转移指令

无条件转移到目标地址,执行新的指令

  • 格式:
    JMP OPRD

1.无条件段内转移
转移的目标地址在当前代码段内,段地址不改变。
即:目标地址是16位偏移地址。

  • 段内直接转移
    转移的目标地址由指令直接给出
    格式:
    JMP Label
  • .段内间接转移
    转移的目标地址存放在某个16位寄存器或存储器
    的某两个单元中
    例:
    MOV BX,1200H
    JMP BX
    执行完上述指令后:
    IP=1200H

2.无条件段间转移
转移的目标地址不在当前代码段内。
目标地址为32位,包括段地址和偏移地址。

  • 段间直接转移
    转移的目标地址由指令直接给出
    格式:
    JMP FAR Label
  • 段间间接寻址
    转移的目标地址由指令中的32位操作数给出
    32位目标地址须存放于内存中
    例:
    JMP DWORD PTR[BX]
条件转移指令

在具备一定条件的情况下转移到目标地址

几种条件转移指令的应用

  • JC/JNC
    判断CF的状态。常用于比大小
  • JZ/JNZ
    判断ZF的状态。常用于循环体的结束判断
  • JO/JNO
    判断OF的状态。常用于有符号数溢出的判断
  • JP/JPE
    判断PF的状态。用于判断运算结果低8位中1的个数是否为偶数
  • JA/JAE/JB/JBE
    判断CF或CF+ZF的状态。常用于无符号数的大小比较
    在这里插入图片描述
    在这里插入图片描述
循环控制指令
  • 循环范围:
    以当前IP为中心的-128~+127范围内循环。
  • 循环次数由CX寄存器指定。
  • 循环指令:
    LOOP(无条件循环指令)
    LOOPZ
    LOOPNZ

无条件循环指令

  • 格式:
    LOOP LABEL
  • 循环条件:
    CX ≠ 0
  • 操作:
    DEC CX
    JNZ 符号地址
中断指令
  • 格式:
    INT n
  • 说明:
    nх4
    存放中断服务子程序入口地址的单元的偏移地址
    该单元在数据段,段地址=DS
  • 中断指令执行过程
    1.将FLAGS压入堆栈;
    2.将INT指令的下一条指令的CS、IP压栈;
    3.由n×4得到存放中断向量的地址;
    4.将中断向量(中断服务程序入口地址)送CS和IP寄存器;
    5.转入中断服务程序。

汇编例题

编写S=86H*34H-21H,式中三个数均为无符号数。

DATA SEGMENT
     NUM  DB  86H,34H,21H
     RESULT	DW  ?
DATA ENDS
CODE SEGMENT
     ASSUME CS:CODE,DS:DATA
START:MOV AX,DATA
      MOV DS,AX
      LEA SI,NUM
      MOV AL,[SI]
      MUL BYTE PTR [SI+1]
      MOV BL,[SI+2]
      MOV BH,0
      SUB AX,BX
      MOV  RESULT,AX
      MOV AH,4CH
      INT 21H
DATA ENDS 
     END START

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值