8086/8088概念系列微机原理
8086/8088-微型计算机原理 8086/8088-微处理器功能结构 8086/8088-内部寄存器原理 8086/8088-指令系统 8086/8088-数据传输指令
更新ing
微机原理8086/8088——指令系统与寻址方式
- 8086/8088概念系列微机原理
-
- 更新ing
- 前言
- 一、指令是做什么用的?
- 二、数据搜索方式
-
- 1.立即寻址
- 2.寄存器搜索方式
- 3.存储器搜索方式
-
- a直接寻址
- b间接搜索寄存器
- c相对地址的寄存器
- d寻址基址
- e相对基址变址寻址
前言
本文主要介绍了微型计算机指令系统和寻址方法
一、指令是做什么用的?
指令是程序的组成部分,它对应于一个基本操作,计算机能做什么样的操作取决于它的指令系统。 一般来说,每台计算机都有自己的指令系统,相互不兼容。同一系列的计算机指令系统确实是向上兼容的(也就是说,旧版本可以使用,新版本也可以使用,新版本不能用于旧版本)
二、数据寻址方式
寻址就是寻找指令或数据
1.立即寻址
操作码 数字表达式
MOV AX, 267 MOV AL, 10010011B AND 0FEH 此处的AL是由16位的AX两个寄存器之一,另一个是AH,所以AX接收16位数据,AL只能接收8位数据
这意味着你只能把这个数字移给别人,而不是反过来
MOV 267, AX 这样是错的
2.寄存器搜索方式
操作码 寄存器名
MOV AX, BX MOV AL, BL 可见这里也有16位传16位,8位传8位,只是把数字换成了寄存器的名字,相当于被赋值的变量名
这样的优点: 1.地址码短,缩短指令,节省内存 2.从寄存器取数字更快(原本从存储器取),提高指令执行时间
3.存储器搜索方式
a直接寻址
这个[ ]有点像指针。如果我没有学过指针,我就这么说吧
MOV AL, 10
这个是把10给AL寄存器
MOV AL, [1000]
这也是给10000的AL吗? **肯定不是!**1000换成2进制,AL可是AX超过了一半。
对段寄存器的概念还不清楚的同学可以把寄存器器这篇文章。 既然可以理解[ ]了,那不带[ ]没有太多的解释,例子可以 假如TABLE数组的第一个地址(变量名)由数据段定义,其偏移值为1000,因此:
MOV AL, [1000] MOV AL, [TABLE] 二者相同
计算一个主题
MOV AX, [1000H] 如果(DS)=3000H,(31000H)=12H,(31001H)=34H,那么(AX)=3412H
[1000]此时实际指向地址内容,该地址为3万H 1000H=31000H,寄存器是8位,AX是16位,读完3.1万H读取31001后的数据H在任何时候,高位是高字节,低位是低字节取12H到低位,再把34H放高位
这意味着只在原偏移地址处添加数字,原理相同
MOV AL, [1000 2] MOV AL, [TABLE 2] 二者一样
b间接搜索寄存器
操作码 [基址寄存器名或变址寄存器名] 回忆起基址寄存器和变址寄存器是什么? 基址寄存器:BX、BP 地址寄存器:SI、DI
MOV AX, [BX] 理解和上面一样,只是用寄存器代替了它
注意:如果[ ]里面是BX、SI、DI,然后默认操作数在数据段,使用段地址DS如果是,值BP,在堆栈中默认操作数SS的值
c相对地址的寄存器
后面的寻址方式都差不多
MOV SI, 5 MOV AX, TABLE[SI]也可以写成 MOV AX, [TABLE SI]
如果(SI)是00A0,(DS)=2000H,(201A0H)=12H,TABLE=0100H,(201A1H)=34H,那么TABLE[SI]也就是[TABLE SI]它仍然代表一个单元的内容,地址为2万 0100H 00A0H=201A0H然后取低字节和高字节
d寻址基址
MOV AX,[BX][SI]
或者是
MOV AX, [BX SI]
(DS)=2000H(BX)=0500H(SI)=0010H 偏移地址=0500H 0010H=0510H 加上段地址=20510H (20510H)=12H,(20511H)=34H 则(AX)=3412H
e相对基址变址寻址
事实上,你已经发现他们的原则完全相同,但形式上有一些差异
MOV AL, TABLE[BX SI] 或者 MOV AL, [TABLE BX SI]