欢迎光临散文网 会员登陆 & 注册

第三周 指令系统概述与数据传送指令

2020-12-20 21:05 作者:康康Loong  | 我要投稿


大家好,又是我,沉迷学习无法自拔的小笨蛋康sir。 这个文集将会同步更新我观看吴宁老师的《微机原理与接口技术》教学视频写的笔记,学习笔记,大概每周一章。 有问题大家可以在评论下面留言讨论,欢迎纠错! 欢迎收藏阅读,动动小手给个硬币点个赞。                                                                 ——@正能量的康sir  

也可移步我的博客(https://blog.csdn.net/qq_33956508)获得更好的阅读体验(暂不更新),也会更新一些其它技术类文章。

第三周 指令系统概述与数据传送指令

8088/8086指令系统主要内容:

有关指令系统的基本概念

对操作数的寻址方式

六大类指令的操作原理:操作码的含义、指令对操作数的要求、指令执行的结果


第14讲 指令系统基本概念

了解:指令及指令系统、指令的格式、指令中的操作数、指令字长与机器字长

  1. 指令与指令系统

指令:控制计算机完成某种操作的命令。

一条指令应包含的信息:运算数据的来源、运算结果的去向、执行的操作。

指令系统:处理器所能识别的所有指令的合集

指令的兼容性:同一系列机的指令是兼容的。

  1. 指令格式

操作码  [操作数],[操作数]这里的方括号表示操作数可选,可以有可以没有

操作码:执行何种操作。又叫指令码

操作数:指令执行的对象。前一个是目标操作数,后面的是源操作数。参加操作的数据或数据存放的地址。

指令格式按操作数数量划分可分为四类:

零操作数指令:操作码

单操作数指令:操作码 操作数

双操作数指令:操作码 操作数,操作数

多操作数指令:三操作数及以上

  1. 指令中的操作数

立即数:表征参加操作的数据本身

寄存器、存储器:表征数据存放的地址

  1. 立即操作数:

立即数是参加操作的数据,可以是8位或者16位,只能作为源操作数。立即数无法作为目标操作数。立即数可以说无符号数或带符号数,数值符合其取值范围。

例:MOV AX,1234H

  MOV BL,22H

  1. 寄存器操作数

参加运算的数存在指令给出的寄存器中,可以是16位或8位。

例:MOV AX,BX

  MOV DL,BX

  1. 存储器操作数

参加运算的数存放在存储器的某一个或某两个单元中。

表现形式:[操作数在内存中的偏移地址]

指令的操作数出现[],表示要寻址的数在内存中。

  例:

MOV AL,[1200H]

MOV AX,[1200H]


(注意1200H是地址,第一条命令将偏移地址是1200H的内容送给AL,第二条因为AX是16位,将1200H的内容送给AL,将1201H的内容送给AH。内容是11H,22H所以AX=1122H(是内容不是地址了),AH(高八位)和AL(低八位)组成AX)


  1. 三种类型操作数的比较

立即数:

由指令直接给出,是常数性质

无地址含义,只表示运算的数据。不能作为目标操作数。

寄存器操作数:

表示运算的数据存放在寄存器中

多数情况下,寄存器操作数指通用寄存器

在三类操作数中所需运行时间最短

存储器操作数:

表示运算的数据存放在内存

指令中“[ ]”里是数据所在单元的偏移地址

在三类操作数中所需运行时间最长

第15讲 寻址方式

寻找操作数所在地址的方法

操作数在哪里?

目标操作数:运算结果的去向,另一个运算数据。

源操作数:运算数据的来源


寻址方式

操作数可能的来源或运算结果可能的去处:

由指令直接给出

寄存器

内存单元

寻找操作数所在地址的方法可以有三种大类型

指令直接给出的方式:运算对象由指令直接给出

存放于寄存器中的寻址方式:参加运算的数据存放在CPU的某个通用寄存器中

存放于存储器中的寻址方式

另外,还有隐含给出的方式


1、立即寻址

立即寻址仅适合于源操作数,即源操作数是参加操作的数据本身。这种方式应用比较少。

由指令直接给出运算的数据(操作数是立即数)。为常数形式或字符形式。

立即数只表示运算的数据,无地址含义;

例:MOV AX,1200H




2、寄存器寻址

参加操作的操作数在CPU的通用寄存器中

例:MOV AX,BX

AX<——BX

此种寻址方式中的寄存器主要是通用寄存器

不含控制寄存器。段寄存器限制使用。

3、 存储器操作数的寻址方式

关注点:

指令操作的对象在内存中,表现形式为:[ ]

指令中给出运算对象在内存某个逻辑段中的偏移地址[偏移地址]

逻辑段的段某地址通过默认或重设方式给出。

存储器操作数的字长本身不确定,其字长取决于指令中另一个寄存器操作数,或通过其他方式指定字长。

  1. 直接寻址

指令中直接给出操作数的偏移地址

例:MOV AX,[1200H]



直接寻址方式下,操作数默认为在数据段,但允许段重设,即由指令给出所在逻辑段。

例:

MOV AX,ES:[1200H] 这里的“ES:”为段重设符

  1. 寄存器间接寻址

操作数存放在内存中,数据在内存中的偏移地址为方括号中通用寄存器的内容

仅有4个通用寄存器可用于存放数据的偏移地址。间址寄存器BX,BP,SI,DI。

间接寻址的一般格式[间址寄存器]

例:MOV BX,1200H

MOV AX,[BX]



由寄存器间接给出操作数的偏移地址

存放偏移地址的寄存器(“方括号中能出现的寄存器”)称为间址寄存器——>BX,BP,SI,DI

操作数的段地址(数据处于哪个段)取决于选择哪一个间接寄存器:

BX,SI,DI默认在数据段, BP默认在堆栈段

可以段重设

  1. 寄存器相对寻址

操作数的偏移地址为寄存器的内容加上一个位移量。

如:MOV AX,[BX+DATA]段地址由所选间址寄存器决定,DATA是任意8bit或16bit常数。

例: MOV AX,2000H

MOV DS,AX

MOV BX,1200H

MOV AL,[BX]5相当于[BX+5],也可以写成5[BX]


相对寻址主要用于一维数组的操作

常将位移量作为“表头”地址,间址寄存器的值作为表内相对地址

  1. 基址、变址寻址

操作数的偏移地址为 一个基址寄存器(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指令系统


从功能上包括六大类:数据传送、算术运算、逻辑运算和移位、串操作、程序控制、处理器控制

掌握:指令码的含义、指令对操作数的要求、指令的对标志位的影响、指令的功能


数据传送指令包括:通用数据传送指令、输入输出指令 、地址传送指令、标志传送指令。

除标志传送指令外,其它指令的执行对标志位不产生影响


一、通用数据传送指令

通用数据传送指令又可分为:一般数据传送指令、堆栈操作指令、交换指令、查表转换指令、字位扩展指令

注意该类所有指令的执行均不影响标志位。

  1. 一般数据传送指令

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 ;暂停指令

(分号+文字,是注释的写法)

上段程序在代码段中的存放形式


在数据段中的分布


  1. 堆栈操作指令

堆栈操作的原则:

先进后出

以字为单位

(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的内容互换



  1. 交换指令

格式: XCHG REG,MEM/REG

注:两操作数必须有一个是寄存器(通用寄存器或存储器)操作数(不用区分源和目的)

不允许使用段寄存器

例:XCHG AX,BX

XCHG [2000],CL

  1. 查表指令

格式:XLAT

说明:用BX的内容代表表格首地址,AL内容为表内位移量,BX+AL得到要查找元素的偏移地址

操作:将BX+AL所指单元的内容送AL

  1. 字位扩展指令

将符号数的符号位扩展到高位

指令为零操作数指令,采用隐含寻址,隐含的操作数为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指令 后面这两个指令用来取远地址指针(在另外一个数据段或附加段中取)


  1. 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)


标志传送指令

  1. 标志传送指令

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讲 输入输出指令

  1. 输入输出指令

掌握:

指令的格式及操作

指令的两种寻址方式

指令对操作数的要求


关于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用的少。



第三周 指令系统概述与数据传送指令的评论 (共 条)

分享到微博请遵守国家法律