8086/8088的指令都有哪些寻址方式
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了8086/8088的指令都有哪些寻址方式相关的知识,希望对你有一定的参考价值。
概念:1.指令集:cpu能够执行的指令的集合。
2.指令:cpu所能够执行的操作。
3.操作数:参加指令运算的数据。
4.寻址方式:在指令中得到操作数的方式。
现在就重点讨论寻址方式,说白了也就是cpu怎么样从指令中得到操作数的问题。另外再强调一点操作数还分种类:
1)数据操作数:全都是在指令当中参加操作的数据。
1.立即操作数:它在指令中直接给出。
2.寄存器操作数:它被放到寄存器中。
3.存储器操作数:当然在存储器也就是内存中。
4.i/o操作数:它在你给出的i/o端口中。
2)转移地址操作数:在指令当中不是参加运算或被处理的数据了,而是转移地址。
还可以按照下面分类方式:
1)源操作数src
2)目的操作数dst
源操作数都是指令当中的第2个操作数,在执行完指令后操作数不变。而目的操作数是指令当中的第1个操作数,在执行完操作指令后被新的数据替代。
我们就围绕这几种操作数,也就是操作数所在的位置展开讨论。
先说数据操作数,它分3大类共7种。
1)立即数寻址方式:是针对立即操作数的寻址方式。在指令当中直接给出,它根本就不用寻址。
例1:mov ax,1234h
mov [bx],5678h
在这里1234h和5678h都是立即操作数,在指令当中直接给出。
2)寄存器寻址方式:是针对寄存器操作数的寻址方式,它在寄存器中我们就用这中方式来找到它。
例2:mov bx,ax
mov bp,[si]
在这里ax,bx,ds都算是寄存器寻址,例1中的ax也是寄存器寻址方式。
3)存储器寻址方式:针对在内存中的数据(存储器操作数)都用这种方式来寻找,一共有5种(这是我自己的说法,便于记忆)。
不得不提及以下的概念:由于8086/8088的字长是16bit,能够直接寻址2的16次方也就是64kb,而地址总线是20bit,能够直接寻址2的20次方也就是1M空间,所以把内存分为若干个段,每个段最小16byte(被称为小节),最大64kb,它们之间可以相互重叠,这样一来内存就被分成以16byte为单元的64k小节,cpu就以1小节为单位寻址:在段寄存器中给出段地址(16bit),在指令当中给出段内偏移地址(16bit),然后把段地址左移4bit再与偏移地址求和就得到数据在内存当中的实际物理地址了,因而可以找到数据。
1.存储器直接寻址方式:在指令当中以 [地址] 的方式直接给出数据所在内存段的偏移地址。
例3:mov ax,es:[1234h]
mov dx,VALUE
mov dx,[VALUE]
在这里[1234h]和VALUE就是在指令中直接给出的数据所在内存段的偏移地址(16bit)。
VALUE是符号地址,是用伪指令来定义的,它代表一个在内存中的数据(也就是它的名字)。es:是段前缀符,用来指出段地址,在这之前应该将段地址添入段中,本例中是es,默认是ds,也就是不需给出。应该注意 [地址] 与立即寻址的区别,在直接给出的数据两边加 [] 表示存储器直接寻址,以区别立即寻址。另外 VALUE=[VALUE]。
2.寄存器间接寻址:不是在指令中直接给出数据在内存中的偏移地址,而是把偏移地址放到了寄存器中。
例4:mov ax,[bx]
这里[bx]就是寄存器间接寻址,bx中应方入段内偏移地址。其中:若使用bx,si,di默认段地址为ds,若使用bp则默认段地址为ss,并且允许段跨越,也就是加段前缀符。注意:在寄存器两边加 [] 以与寄存器寻址区别。
3.寄存器间接相对寻址:偏移地址是bx,bp,si,di中的内容再与一个8bit或16bit 的位移量之和。
例5:mov ax,[bx]+12h
mov ax,[si]+5678h
mov ax,[bp]+1234h
在这里[bx]+12h,[si]+5678h,[bp]+1234h都是寄存器间接相对寻址。12h是8bit位移量,1234h和5678h是16bit位移量。若使用bx,si,di则默认段寄存器是ds,若使用bp则默认段寄存器是ss,并且允许段跨越。
4.基址变址寻址:偏移地址是一个基址寄存器和一个变址寄存器内容的和,既:bx或bp中的一个与si或di中的一个求和而得到。
例6:mov ax,[bx+si]
mov ax,[bp+di]
上面[bx+si]和[bp+di]都是基址变址寻址。若使用bx做基址寄存器则默认段地址为ds,若使用bp为基址寄存器则默认段为ss,允许段跨越。
5.基址变址相对寻址:偏移量是一个基址寄存器一个变址寄存器只和再与一个8bit或一个16bit位移量只和得到。
例7:mov ax,[bx+si]+12h
mov ax,[bp+di]+1234h
[bx+si]+12h和[bp+di]+1234h就是基址变址相对寻址。若使用bx做基址寄存器则默认段是ds,若使用bp做基址寄存器则默认段为ss。允许段跨越。
下面是转移地址操作数的寻址方式:
1)段内直接转移
1.段内直接短转移:cs(代码段)内容不变,而ip(指令指针寄存器)内容由当前ip内容+(-127~127),在指令中直接给出。
例8:jmp short SHORT_NEW_ADDR
其中,short是段内短转移的操作符,用以指出是转移到当前位置前后不超过±127字节的地方。而NEW_ADDR是要转移到的符号地址,它的位置应该在当前ip指针所在偏移地址不超过
±127的地方。否则语法出错。
2.段内直接近转移:cs内容不变,而ip内容由当前ip内容+(-32767~32767),在指令中直接给出。
例9:jmp near ptr NEAR_NEW_ADDR
其中near ptr是段内近转移的操作符,用以指出转移到当前位置前后不超过±32767的地方。NEAR_NEW_ADDR是要转移到的符号地址。
2)段内间接转移:cs的内容不变,而ip的内容放在寄存器中或者存储器中给出。
例10:jmp bx
jmp word ptr [bx]+1234h
这种寻址方式是在寄存器或存储器中找到要转移到的地址,而地址是16bit的,因而寄存器必须为16bit,如:bx,我们用word ptr来指定存储器单元也是16bit的。注意:它是间接的给出,只能使用类似于数据操作数中的除立即寻址以外的6种寻址方式(就在上面)。
3)段间直接寻址:cs和ip的内容全都变化,由指令当中直接给出要转移到的某一个段内的某一个偏移地址处。
例11:jmp 1234h:5678h
jmp far ptr NEW_ADDR
1234h送入cs中作为新的段地址,5678h送入ip中作为新的偏移地址。far ptr是段间直接转移操作符,NEW_ADDR是另外一个段内的偏移地址,在这个指令中把NEW_ADDR的段地址送入cs(不用你给出),把它的段内偏移地址送入ip中作为新的偏移地址。
4)段间间接寻址:cs和ip的内容全变化,由指令当中给出的一个4字节连续存储单元,其中低2字节送入ip作为偏移地址,高2字节送入cs作为段地址。
例12:jmp dword ptr [bx][si]+1234h
jmp dword ptr [1234h]
jmp dword ptr [si]
dword ptr是双字(4个字节连续存储单元)操作符,用来指出下面的存储单元是4个字节的。由于它是4个字节的,所以只能使用类似于数据操作数中的存储器寻址方式(共5种,还记得吗?)。
另外作为特殊的寻址方式还有三种:I/O寻址,串寻址,隐含寻址。它们都分别针对I/O指令,串操作指令以及无操作数的指令,而且都比较简单,读者自行总结。
到此为止说明了8086/8088cpu中的所有寻址方式,我这里只是个总结,具体的细节还要大家自己钻研课本,才能理解。
写的有些仓促可能有些遗漏或错误,还请谅解。 参考技术A 概念:
1.指令集:cpu能够执行的指令的集合。
2.指令:cpu所能够执行的操作。
3.操作数:参加指令运算的数据。
4.寻址方式:在指令中得到操作数的方式。
现在就重点讨论寻址方式,说白了也就是cpu怎么样从指令中得到操作数的问题。另外再强调一点操作数还分种类:
1)数据操作数:全都是在指令当中参加操作的数据。
1.立即操作数:它在指令中直接给出。
2.寄存器操作数:它被放到寄存器中。
3.存储器操作数:当然在存储器也就是内存中。
4.i/o操作数:它在你给出的i/o端口中。
2)转移地址操作数:在指令当中不是参加运算或被处理的数据了,而是转移地址。
还可以按照下面分类方式:
1)源操作数src
2)目的操作数dst
源操作数都是指令当中的第2个操作数,在执行完指令后操作数不变。而目的操作数是指令当中的第1个操作数,在执行完操作指令后被新的数据替代。
我们就围绕这几种操作数,也就是操作数所在的位置展开讨论。
先说数据操作数,它分3大类共7种。
1)立即数寻址方式:是针对立即操作数的寻址方式。在指令当中直接给出,它根本就不用寻址。
例1:mov ax,1234h
mov [bx],5678h
在这里1234h和5678h都是立即操作数,在指令当中直接给出。
2)寄存器寻址方式:是针对寄存器操作数的寻址方式,它在寄存器中我们就用这中方式来找到它。
例2:mov bx,ax
mov bp,[si]
在这里ax,bx,ds都算是寄存器寻址,例1中的ax也是寄存器寻址方式。
3)存储器寻址方式:针对在内存中的数据(存储器操作数)都用这种方式来寻找,一共有5种(这是我自己的说法,便于记忆)。
不得不提及以下的概念:由于8086/8088的字长是16bit,能够直接寻址2的16次方也就是64kb,而地址总线是20bit,能够直接寻址2的20次方也就是1M空间,所以把内存分为若干个段,每个段最小16byte(被称为小节),最大64kb,它们之间可以相互重叠,这样一来内存就被分成以16byte为单元的64k小节,cpu就以1小节为单位寻址:在段寄存器中给出段地址(16bit),在指令当中给出段内偏移地址(16bit),然后把段地址左移4bit再与偏移地址求和就得到数据在内存当中的实际物理地址了,因而可以找到数据。
1.存储器直接寻址方式:在指令当中以 [地址] 的方式直接给出数据所在内存段的偏移地址。
例3:mov ax,es:[1234h]
mov dx,VALUE
mov dx,[VALUE]
在这里[1234h]和VALUE就是在指令中直接给出的数据所在内存段的偏移地址(16bit)。
VALUE是符号地址,是用伪指令来定义的,它代表一个在内存中的数据(也就是它的名字)。es:是段前缀符,用来指出段地址,在这之前应该将段地址添入段中,本例中是es,默认是ds,也就是不需给出。应该注意 [地址] 与立即寻址的区别,在直接给出的数据两边加 [] 表示存储器直接寻址,以区别立即寻址。另外 VALUE=[VALUE]。
2.寄存器间接寻址:不是在指令中直接给出数据在内存中的偏移地址,而是把偏移地址放到了寄存器中。
例4:mov ax,[bx]
这里[bx]就是寄存器间接寻址,bx中应方入段内偏移地址。其中:若使用bx,si,di默认段地址为ds,若使用bp则默认段地址为ss,并且允许段跨越,也就是加段前缀符。注意:在寄存器两边加 [] 以与寄存器寻址区别。
3.寄存器间接相对寻址:偏移地址是bx,bp,si,di中的内容再与一个8bit或16bit 的位移量之和。
例5:mov ax,[bx]+12h
mov ax,[si]+5678h
mov ax,[bp]+1234h
在这里[bx]+12h,[si]+5678h,[bp]+1234h都是寄存器间接相对寻址。12h是8bit位移量,1234h和5678h是16bit位移量。若使用bx,si,di则默认段寄存器是ds,若使用bp则默认段寄存器是ss,并且允许段跨越。
4.基址变址寻址:偏移地址是一个基址寄存器和一个变址寄存器内容的和,既:bx或bp中的一个与si或di中的一个求和而得到。
例6:mov ax,[bx+si]
mov ax,[bp+di]
上面[bx+si]和[bp+di]都是基址变址寻址。若使用bx做基址寄存器则默认段地址为ds,若使用bp为基址寄存器则默认段为ss,允许段跨越。
5.基址变址相对寻址:偏移量是一个基址寄存器一个变址寄存器只和再与一个8bit或一个16bit位移量只和得到。
例7:mov ax,[bx+si]+12h
mov ax,[bp+di]+1234h
[bx+si]+12h和[bp+di]+1234h就是基址变址相对寻址。若使用bx做基址寄存器则默认段是ds,若使用bp做基址寄存器则默认段为ss。允许段跨越。
下面是转移地址操作数的寻址方式:
1)段内直接转移
1.段内直接短转移:cs(代码段)内容不变,而ip(指令指针寄存器)内容由当前ip内容+(-127~127),在指令中直接给出。
例8:jmp short SHORT_NEW_ADDR
其中,short是段内短转移的操作符,用以指出是转移到当前位置前后不超过±127字节的地方。而NEW_ADDR是要转移到的符号地址,它的位置应该在当前ip指针所在偏移地址不超过
±127的地方。否则语法出错。
2.段内直接近转移:cs内容不变,而ip内容由当前ip内容+(-32767~32767),在指令中直接给出。
例9:jmp near ptr NEAR_NEW_ADDR
其中near ptr是段内近转移的操作符,用以指出转移到当前位置前后不超过±32767的地方。NEAR_NEW_ADDR是要转移到的符号地址。
2)段内间接转移:cs的内容不变,而ip的内容放在寄存器中或者存储器中给出。
例10:jmp bx
jmp word ptr [bx]+1234h
这种寻址方式是在寄存器或存储器中找到要转移到的地址,而地址是16bit的,因而寄存器必须为16bit,如:bx,我们用word ptr来指定存储器单元也是16bit的。注意:它是间接的给出,只能使用类似于数据操作数中的除立即寻址以外的6种寻址方式(就在上面)。
3)段间直接寻址:cs和ip的内容全都变化,由指令当中直接给出要转移到的某一个段内的某一个偏移地址处。
例11:jmp 1234h:5678h
jmp far ptr NEW_ADDR
1234h送入cs中作为新的段地址,5678h送入ip中作为新的偏移地址。far ptr是段间直接转移操作符,NEW_ADDR是另外一个段内的偏移地址,在这个指令中把NEW_ADDR的段地址送入cs(不用你给出),把它的段内偏移地址送入ip中作为新的偏移地址。
4)段间间接寻址:cs和ip的内容全变化,由指令当中给出的一个4字节连续存储单元,其中低2字节送入ip作为偏移地址,高2字节送入cs作为段地址。
例12:jmp dword ptr [bx][si]+1234h
jmp dword ptr [1234h]
jmp dword ptr [si]
dword ptr是双字(4个字节连续存储单元)操作符,用来指出下面的存储单元是4个字节的。由于它是4个字节的,所以只能使用类似于数据操作数中的存储器寻址方式(共5种,还记得吗?)。
另外作为特殊的寻址方式还有三种:I/O寻址,串寻址,隐含寻址。它们都分别针对I/O指令,串操作指令以及无操作数的指令,而且都比较简单,读者自行总结。
到此为止说明了8086/8088cpu中的所有寻址方式,我这里只是个总结,具体的细节还要大家自己钻研课本,才能理解。
写的有些仓促可能有些遗漏或错误,还请谅解。
参考资料:http://blog.chinaunix.net/u/12973/showart_123394.html
本回答被提问者采纳5.2-寻址方式
寻址方式的概念
- 指令或操作数在存储器中的地址:某个操作数或某条指令存放在某个存储单元时,其存储单元的编号
- 在存储器中,操作数或指令字写入或读出的方式,有:地址指定方式、相联存储方式和堆栈存取方式
- 采用 地址指定方式 形成操作数或指令地址的方式,称为寻址方式
- 寻址方式分为 2 类,即:指令寻址方式 和 数据寻址方式
指令寻址方式
指令的寻址方式有 2 种:① 顺序寻址方式;② 跳跃寻址方式
顺序寻址方式
- 程序的指令序列在主存顺序存放,当执行一段程序时,通常是一条指令接一条指令的顺序执行
- 即从存储器取出第一条指令,然后执行这条指令
- 接着从存储器取出第二条指令,在执行第二条指令
- 接着再取出第三条指令
- ……
- CPU中设置 [程序计数器PC (又称指令指针寄存器)] 对指令的顺序号进行计数。PC开始时存放程序的首地址,每执行一条指令,PC 加 "1",指出下条指令的地址,直到程序结束
- 演示
跳跃寻址方式
- 当程序要转移执行的顺序时,指令的寻址就采取跳跃寻址方式
- 跳跃,又称跳转,是指下条指令的地址码不是由程序计数器给出,而是由本条指令给出
- 注意!程序跳跃后,按新的指令地址开始顺序执行;指令计数器的内容也必须相应改变,以便及时跟踪新的指令地址
- 演示
数据寻址方式
隐含寻址
- 有些指令的操作码中不仅包含了操作的性质,还隐含了部分操作数的地址
- 举例:MUL BL
- 乘法指令MUL,在这条指令中只需指明乘数的地址,被乘数以及乘积的地址是隐含且固定的
- 把AL中的内容与BL中的内容相乘,乘积送到AX寄存器,即 AL x BL → AX
立即寻址
寄存器寻址
直接寻址
- 操作数位于存储器中,操作数所在的存储器单元的地址存放在指令的地址字段A中,即:
- DATA = (EA):指令字中的 形式地址A 就是操作数的 有效地址E
- EA = A:该类指令中的形式地址A又称为 "直接地址"
- 举例
- 操作数的字长取决于指令中的另一个寄存器操作数,e.g. AX→读2个单元,AL/AH→读1个单元
寄存器直接寻址
存储器直接寻址方式
- 一般简称直接寻址方式,其指令地址码字段直接给出存放在存储器中操作数的存储地址。其表示形式见前面
- 特点
- 提供访问主存的操作
- 获得数据要访问主存,指令执行速度慢
- 地址字段的位数决定了访存空间大小
间接寻址
- 倘若指令字中的形式地址不直接指出操作数的地址,而是指出操作数有效地址所在的存储单元地址,也就是说,有效地址是由形式地址间接提供的,即为间接寻址,即DATA = (EA),EA = (A),A为操作数地址的地址
- 直接寻址 & 间接寻址
寄存器间接寻址
- 寄存器间接寻址时,地址码字段给出的是寄存器编号R。需先访问寄存器,从寄存器读出操作数地址后,再访问存储器才能取得操作数
- EA=(R),即Data=(EA)=((R))
- 特点
- 解决了直接寻址方式下地址字段的位数限制访存范围大小的问题
- 获得数据只需访问主存1次
- 寄存器寻址 & 寄存器间接寻址
存储器间接寻址
- 存储器间接寻址时,地址码字段给出的是操作数主存地址的地址。需访问两次存储器才能取得数据,第1次先从存储器读出操作数地址,第2次才能根据读出的操作数地址再取出真正的操作数
- EA=(A),即Data=(EA)=((A))
- 特点
- 解决了直接寻址方式下地址字段的位数限制访存范围大小的问题
- 获得数据要访问主存2次,指令执行速度太慢
相对寻址
- 所谓相对寻址方式,是指根据一个基准地址及其相对量来寻找操作数地址的方式
- 根据基准地址的来源不同,它又分为基址方式和变址方式、以及PC相对寻址方式,这里主要指后者
- PC相对寻址方式,一般简称相对寻址方式,是指将程序计数器 PC的内容(即当前执行指令的地址)与地址码部分给出的位移量Disp通过加法器相加,所得之和作为操作数的有效地址的方式
- EA=(PC) + Disp
- 举例
- 特点
- 可节省指令中的地址位数,便于程序在内存中成块移动
- 注意PC的改变对计算E的影响,+指令字长
基址寻址
- 计算机设置一个寄存器,专门用来存放基准地址,该寄存器就是基址寄存器(RB)。RB既可在CPU中专设,也可由指令指定某个通用寄存器担任
- 基址寻址方式是将CPU中基址寄存器RB的内容加上指令格式中的形式地址A而形成操作数的有效地址
- EA=(RB) + Disp // 地址码A 在这种方式下通常被称为位移量(Disp)
- 特点
- 使用基址寄存器(位数比通用寄存器多) 可以访问更大的主存空间
- 对某一程序而言,基址值设定后不变,故要访问不同数据需修改Disp,而Disp又是指令的形式地址部分的值,所以必须要改变指令
变址寻址
-
变址寻址方式与基址寻址方式计算有效地址的方法很相似,它把CPU中某个变址寄存器的内容与偏移量D相加来形成操作数有效地址
-
使用变址寻址方式的目的不在于扩大寻址空间,而在于实现程序块的规律性变化
-
EA=(RI) +Disp
-
特点
- 不改变指令即可改变数据的有效地址,可在循环中使用
- 在字符串处理,向量运算等等成批数据处理中非常有用
-
变址寻址 & 基址寻址区别
- 采用 [基址寻址] 时,基址寄存器提供地址基准量,指令提供偏移量
- 采用 [变址寻址] 时,变址寄存器提供修改量,指令提供基准量
堆栈寻址
堆栈寻址主要用来暂存中断和子程序调用时现场数据及返回地址
- 存储器堆栈
- 堆栈的结构
数据寻址方式总结
例题
以上是关于8086/8088的指令都有哪些寻址方式的主要内容,如果未能解决你的问题,请参考以下文章