第三周 指令系统概述与数据传送指令
大家好,又是我,沉迷学习无法自拔的小笨蛋康sir。 这个文集将会同步更新我观看吴宁老师的《微机原理与接口技术》教学视频写的笔记,学习笔记,大概每周一章。 有问题大家可以在评论下面留言讨论,欢迎纠错! 欢迎收藏阅读,动动小手给个硬币点个赞。 ——@正能量的康sir
也可移步我的博客(https://blog.csdn.net/qq_33956508)获得更好的阅读体验(暂不更新),也会更新一些其它技术类文章。

第三周 指令系统概述与数据传送指令
8088/8086指令系统主要内容:
有关指令系统的基本概念
对操作数的寻址方式
六大类指令的操作原理:操作码的含义、指令对操作数的要求、指令执行的结果
第14讲 指令系统基本概念
了解:指令及指令系统、指令的格式、指令中的操作数、指令字长与机器字长
指令与指令系统
指令:控制计算机完成某种操作的命令。
一条指令应包含的信息:运算数据的来源、运算结果的去向、执行的操作。
指令系统:处理器所能识别的所有指令的合集
指令的兼容性:同一系列机的指令是兼容的。
指令格式
操作码 [操作数],[操作数]这里的方括号表示操作数可选,可以有可以没有
操作码:执行何种操作。又叫指令码
操作数:指令执行的对象。前一个是目标操作数,后面的是源操作数。参加操作的数据或数据存放的地址。
指令格式按操作数数量划分可分为四类:
零操作数指令:操作码
单操作数指令:操作码 操作数
双操作数指令:操作码 操作数,操作数
多操作数指令:三操作数及以上
指令中的操作数
立即数:表征参加操作的数据本身
寄存器、存储器:表征数据存放的地址
立即操作数:
立即数是参加操作的数据,可以是8位或者16位,只能作为源操作数。立即数无法作为目标操作数。立即数可以说无符号数或带符号数,数值符合其取值范围。
例:MOV AX,1234H
MOV BL,22H
寄存器操作数
参加运算的数存在指令给出的寄存器中,可以是16位或8位。
例:MOV AX,BX
MOV DL,BX
存储器操作数
参加运算的数存放在存储器的某一个或某两个单元中。
表现形式:[操作数在内存中的偏移地址]
指令的操作数出现[],表示要寻址的数在内存中。
例:
MOV AL,[1200H]
MOV AX,[1200H]

(注意1200H是地址,第一条命令将偏移地址是1200H的内容送给AL,第二条因为AX是16位,将1200H的内容送给AL,将1201H的内容送给AH。内容是11H,22H所以AX=1122H(是内容不是地址了),AH(高八位)和AL(低八位)组成AX)
三种类型操作数的比较
立即数:
由指令直接给出,是常数性质
无地址含义,只表示运算的数据。不能作为目标操作数。
寄存器操作数:
表示运算的数据存放在寄存器中
多数情况下,寄存器操作数指通用寄存器
在三类操作数中所需运行时间最短
存储器操作数:
表示运算的数据存放在内存
指令中“[ ]”里是数据所在单元的偏移地址
在三类操作数中所需运行时间最长
第15讲 寻址方式
寻找操作数所在地址的方法
操作数在哪里?
目标操作数:运算结果的去向,另一个运算数据。
源操作数:运算数据的来源
寻址方式
操作数可能的来源或运算结果可能的去处:
由指令直接给出
寄存器
内存单元
寻找操作数所在地址的方法可以有三种大类型
指令直接给出的方式:运算对象由指令直接给出
存放于寄存器中的寻址方式:参加运算的数据存放在CPU的某个通用寄存器中
存放于存储器中的寻址方式
另外,还有隐含给出的方式
1、立即寻址
立即寻址仅适合于源操作数,即源操作数是参加操作的数据本身。这种方式应用比较少。
由指令直接给出运算的数据(操作数是立即数)。为常数形式或字符形式。
立即数只表示运算的数据,无地址含义;
例:MOV AX,1200H

2、寄存器寻址
参加操作的操作数在CPU的通用寄存器中
例:MOV AX,BX
AX<——BX
此种寻址方式中的寄存器主要是通用寄存器
不含控制寄存器。段寄存器限制使用。
3、 存储器操作数的寻址方式
关注点:
指令操作的对象在内存中,表现形式为:[ ]
指令中给出运算对象在内存某个逻辑段中的偏移地址[偏移地址]
逻辑段的段某地址通过默认或重设方式给出。
存储器操作数的字长本身不确定,其字长取决于指令中另一个寄存器操作数,或通过其他方式指定字长。
直接寻址
指令中直接给出操作数的偏移地址
例:MOV AX,[1200H]

直接寻址方式下,操作数默认为在数据段,但允许段重设,即由指令给出所在逻辑段。
例:
MOV AX,ES:[1200H] 这里的“ES:”为段重设符
寄存器间接寻址
操作数存放在内存中,数据在内存中的偏移地址为方括号中通用寄存器的内容
仅有4个通用寄存器可用于存放数据的偏移地址。间址寄存器BX,BP,SI,DI。
间接寻址的一般格式[间址寄存器]
例:MOV BX,1200H
MOV AX,[BX]

由寄存器间接给出操作数的偏移地址
存放偏移地址的寄存器(“方括号中能出现的寄存器”)称为间址寄存器——>BX,BP,SI,DI
操作数的段地址(数据处于哪个段)取决于选择哪一个间接寄存器:
BX,SI,DI默认在数据段, BP默认在堆栈段
可以段重设
寄存器相对寻址
操作数的偏移地址为寄存器的内容加上一个位移量。
如:MOV AX,[BX+DATA]段地址由所选间址寄存器决定,DATA是任意8bit或16bit常数。
例: MOV AX,2000H
MOV DS,AX
MOV BX,1200H
MOV AL,[BX]5相当于[BX+5],也可以写成5[BX]

相对寻址主要用于一维数组的操作
常将位移量作为“表头”地址,间址寄存器的值作为表内相对地址
基址、变址寻址
操作数的偏移地址为 一个基址寄存器(BX、BP)的内容+一个变址寄存器(SI、DI)的内容
操作数的段地址由选择的基址寄存器决定:
基址寄存器为BX,默认在数据段
基址寄存器为BP,默认在堆栈段
基址变址寻址方式与相对寻址方式一样,主要用于一维数组操作。
例:
执行下列指令:
MOV SI,1100H
MOV BX,SI
MOV AX,[SI+BX]也可表示为[BX][SI]

(5)基址、变址、相对寻址
操作数的偏移地址为:基址寄存器内容+变址寄存器内容+位移量
操作数的段地址由选择的基址寄存器决定。
基址变址相对寻址方式主要用于二维表格操作。
例: 执行以下程序段:
MOV DI,1100H
MOV BP,DI
MOV AL,[BP][DI]5也可表示为[BP+DI+5]
基址寄存器选择BP表示操作数在堆栈段

4、隐含寻址
指令中隐含了一个或两个操作数的地址,即操作数在默认的地址中。
例:
MUL BL MUL表示乘法。只给出BL,被乘数默认为AL,乘积默认为AX
指令执行:
ALxBL——AX
小结
寻址方式表示指令运算对象的来源和运算结果的去向
注意点:
立即寻址仅针对源操作数
寄存器寻址表示指令运算的数据在寄存器中(常为通用寄存器)
存储器寻址表示指令运算的对象在内存中
数据在内存中的偏移地址在[ ]中,段地址可以默认或重设
存储器寻址和寄存器寻址均可用于源或目标操作数
深入理解了寻址方式,才能理解指令的执行结果
寻址方式练习
设DS=6000H,ES=2000H,SS=1500H,SI=00A0H,BX=0800H,BP=1200H,字符常数VAR为0050H。说明以下各条指令源操作数的寻址方式及存储器操作数的物理地址。
MOV AX,BX 寄存器寻址
MOV DL,80H 立即寻址
MOV AX,VAR[BX][SI] 基址变址相对寻址 物理地址:608F0H
MOV AL,’B’ 立即寻址
MOV DI,ES:[BX] 寄存器间接寻址,物理地址:20800H
MOV DX,[BP] 寄存器间接寻址,物理地址:16200H
MOV BX,20H[BX] 寄存器相对寻址,物理地址:60820H
第16讲 通用数据传送指令
8086指令系统

从功能上包括六大类:数据传送、算术运算、逻辑运算和移位、串操作、程序控制、处理器控制
掌握:指令码的含义、指令对操作数的要求、指令的对标志位的影响、指令的功能
数据传送指令包括:通用数据传送指令、输入输出指令 、地址传送指令、标志传送指令。
除标志传送指令外,其它指令的执行对标志位不产生影响
一、通用数据传送指令
通用数据传送指令又可分为:一般数据传送指令、堆栈操作指令、交换指令、查表转换指令、字位扩展指令
注意该类所有指令的执行均不影响标志位。
一般数据传送指令
MOV
格式:MOV dest,src
操作:src——> dest
例:MOV AL,BL
注意点:
两操作数字长必须相同;
两操作数不允许同时为存储器操作数;
两操作数不允许同时为段寄存器;
在源操作数时立即数时,目标操作数不能是段寄存器;
IP和CS不作为目标操作数,FLAGS一般也不作为操作数在指令中出现。
判断下列指令的正确性:
MOV AL,BX 错,两操作数字长不想等
MOV AX,[SI]05H 对,源操作数为相对寻址
MOV [BX][BP],BX 错,目标操作数寻址方式错误,BX、BP都是基址寄存器
MOV DS,1000H 错,不能用立即寻址方式为段寄存器赋值
MOV DX,09H 对
MOV [1200],[SI] 错,两操作数不能同时为存储器操作数
一般数据传送指令应用例
将(*)的ASCII码2AH送入内存数据段1000H开始的100个单元。
题目分析:
确定首地址
确定数据长度
写一次数据
修改单元地址
修改长度值
判断写完否?
未完继续写入,否则结束

程序段:
MOV DI,1000H
MOV CX,64H ;即100次
MOV AL,2AH ;这里也可以写作MOV AL,’*’用单引号把字符包起来
AGAIN:MOV [DI],AL ;AGAIN只是一个标号
INC DI ;DI+1
DEC CX ;CX-1
JNZ AGAIN ;CX≠0则继续。JNZ(jmp not zero) 如果CX不为0则跳转,跳转到AGAIN
HLT ;暂停指令
(分号+文字,是注释的写法)
上段程序在代码段中的存放形式

在数据段中的分布

堆栈操作指令
堆栈操作的原则:
先进后出
以字为单位
(16位的系统中一个字的长度是 2 字节,也就是 16 位。所以堆栈指令一定是16位的操作数)
堆栈操作指令:
压栈指令 格式 PUSH OPRD
出栈指令 格式 POP OPRD
(OPRD代表16位寄存器或存储器两单元)
压栈指令PUSH
指令执行过程
SP-2——>SP
操作数高字节——>SP+1
操作数低字节——>SP

压栈指令的操作
设AX=1234H,SP=1200H
执行PUSH AX指令后堆栈区的状态:

出栈指令的操作
执行POP AX

堆栈操作指令说明
指令的操作数必须是16位
操作数可以是寄存器或存储器两单元,但不能是立即数;(约定单操作数格式指令声明字长)
不能从栈顶弹出一个字给CS;
PUSH和POP指令在程序中一般成对出现;
PUSH指令的操作方向是从高地址向低地址,而POP指令的操作正好相反
堆栈操作指令例
MOV AX,1234H
MOV SP,AX
MOV BX,5678H
MOV [BX],AH
MOV [BX+1],BL
PUSH AX
PUSH BX
PUSH WORD PTR[BX]
…
POP WORD PTR[BX]
POP AX
POP BX ;和上一句一起,使AX和BX的内容互换

交换指令
格式: XCHG REG,MEM/REG
注:两操作数必须有一个是寄存器(通用寄存器或存储器)操作数(不用区分源和目的)
不允许使用段寄存器
例:XCHG AX,BX
XCHG [2000],CL
查表指令
格式:XLAT
说明:用BX的内容代表表格首地址,AL内容为表内位移量,BX+AL得到要查找元素的偏移地址
操作:将BX+AL所指单元的内容送AL
字位扩展指令
将符号数的符号位扩展到高位
指令为零操作数指令,采用隐含寻址,隐含的操作数为AL及AX,DX
无符号数的扩展规则为在高位补0.
(1)字节到字的扩展指令
格式:CBW
操作:将AL内容扩展到AX
规则:
若最高位=1,则执行后AH=FFH
若最高位=0,则执行后AH=00H
(2)字到双字的扩展指令
格式:CWD
操作:将AX内容扩展到DX AX
规则:
若最高位=1,则执行后DX=FFFFH
若最高位=0,则执行后DX=0000H
第17讲 地址传送指令和标志传送指令
三、地址传送指令分三小类
地址传送指令分三小类:
取偏移地址指令LEA——>取近地址指针(取当前数据段某个区域的单元地址)
*LDS指令
*LES指令 后面这两个指令用来取远地址指针(在另外一个数据段或附加段中取)
LEA指令
操作:将变量的16位偏移地址写入到目标寄存器。(“变量”指内存单元的符号地址。属于存储器操作数)
当程序中用符号表示内存偏移地址时,须使用该指令。
格式:LEA REG,MEM (MEM是存储操作数)
指令要求:源操作数必须是一个存储器操作数,目标操作数通常是间址寄存器。
LEA指令与MOV指令执行结果对比
例一:
(1)MOV指令:MOV AL,i
结果:AL=4
MOV指令读取指定内存单元的内容源操作数为直接寻址方式
(2)LEA指令:LEA BX,I
结果:BX=i
LEA指令读取指定内存单元的偏移地址(获得i值本身)

(i是之前声明过的一个变量)
例二:
比较下列指令:
MOV SI,DATA1 ;DATA1是符号地址
结果SI=1234H
LEA SI,DATA1
结果SI=DATA1
MOV BX,1100H
MOV AX,[BX] ;结果AX=7788H
LEA BX,[BX] ;结果BX=1100H

LEA指令在程序中的应用
将数据段中首地址为MEM1 的50个字节的数据传送到同一逻辑段首地址为MEM2的区域存放。编写相应的程序段。

程序:
LEA SI,MEM1
LEA DI,MEM2
MOV CL,50
NEXT:MOV AL,[SI]
MOV [DI],AL
INC SI
INC DI
DEC CL
JNZ NEXT ;CL≠0则转NEXT
HLT

2. LDS、LES指令
LDS和LES均用于将一个32位的远地址指针写入到目标寄存器。
LDS(Load pointer using DS)的一般格式:LDS 通用寄存器,存储器操作数
(存储器操作数:将源操作数的偏移地址送目标寄存器,将源操作数的段地址送DS.)
LES(Load pointer using ES)的一般格式:LES 通用寄存器,存储器操作数
(存储器操作数:将源操作数的偏移地址送目标寄存器, 将源操作数的段地址送ES)
标志传送指令
标志传送指令
LAHF(Load AH from Flags)隐含操作数AH
SAHF(Store AH into Flags)隐含操作数AH
PUSHF(Push flags onto stack)隐含操作数FLAGS
POPF(Pop flags off stack)隐含操作数FLAGS
LAHF,SAHF
指令格式:LAHF
操作:将FLAGS的低8位装入AH

16位的FLAGS中7位空闲,9位有效。9位中低8位里的5个标志位状态同时传给AH
SAHF反之,即从AH传回FLAGS.
第18讲 输入输出指令
输入输出指令
掌握:
指令的格式及操作
指令的两种寻址方式
指令对操作数的要求
关于I/O端口
I/O端口:I/O接口中用于存储数据、可以直接被CPU访问的寄存器
计算机输入输出系统中可以包含若干接口控制电路(芯片),每个接口中都包含了1个或多个端口。

输入输出指令
专门面向I/O端口操作的指令
端口地址在指令中的表示方式——寻址方式
指令功能:从端口地址读入数据到累加器/将累加器的值输出到端口中
指令格式:
输入指令:IN acc,PORT ;(PORT表示端口地址)
输出指令:OUT PORT,acc;(acc是AL或AX,不能是AH)
指令寻址方式
根据端口地址码的长度,指令具有两种不同的端口地址表现形式。
直接寻址: 端口地址为8位时,指令中直接给出8位端口地址;寻址256个端口。
间接寻址:端口地址为16位时,指令中的端口地址必须由DX指定;可寻址64K个端口。
I/O指令例
IN AX,80H——>从80H端口读入16bit数据到AX
MOV DX,2400H
IN AL,DX——>从2400H端口读入8bit数据到AL
OUT 35H,AX——>将AX的值写入到35H端口中
OUT AX,35H——>错,格式错误
小结
例:
MOV SI,100
MOV DX,03F8H
IN AL,DX
如果AL的最高位=0,则转向③,否则继续下一步
MOV AX,[SI]
OUT 58H,AX
程序功能:
弹幕的答案
监听03F8H端口,如果最高位为1,就把数据段中偏移地址为100的内容输出到58H端口
本章命令总结:MOV、堆栈操作PUSH\POP、取偏移地址LEA、 输入输出IN\OUT这几个用的多,查表、交换、LDS\LES、SAHF\LAHF用的少。