注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

My Unix World

不要迷恋Unix,Unix只是计算世界很小的一部分!

 
 
 

日志

 
 

【Copy】8086寄存器组和寻址方式  

2008-12-16 09:44:03|  分类: C-CPU |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

come from: http://www.eetop.cn/blog/html/64/64964-2380.html

8086寄存器组

通用寄存器:
EAX: (Accumulator) 累加器. 也被IO指令使用.
EBX: (base) 计算存储器地址时常用作基址寄存器.
ECX: (count) 在移位.循环.串处理指令中用作隐含的计数器.
EDX: (data) 做双字长的运算时.和AX连用. 另外.它存放IO端口地址.
变址寄存器:
ESP: (Stack Point) 堆栈指针寄存器. 指示段顶的偏移地址.
EBP: (Base Point) 基址指针寄存器. 可与SS连用确定堆栈段中的某一地址.
EDI: (Destination Index) 目的变址寄存器. DI 和 ES连用.
ESI: (Source Index) 源变址寄存器. SI 和 DS 连用.
专用寄存器:
EIP: 指令指针寄存器. 与CS连用确定下一条指令的地址.
EFLAGS: 标志寄存器.常用标志如下:
         OF 溢出   SF 符号   ZF 零   CF 进位   AF 辅助进位(第3位进位)   PF 奇偶(结果的1的个数)
         DF 方向   TF 陷阱(调试时若置位则每条指令后产生陷阱)   IF 中断(1表示允许相应可屏蔽中断)
段寄存器:
CS: (code segement) 代码段
DS: (data segement) 数据段
ES: (extra segement) 附加段
SS: (stack segement) 堆栈段
FS: 80386后增加的附加数据段
GS: 80386后增加的附加数据段


实模式存储器寻址
用来解决16位字长的机器里提供20位地址的问题.
解决的办法是分段. 20位物理地址由16位段地址和16位偏移地址组成.
段地址是一个段的起始地址(低4位为0).又称段基地址.

段    偏移
cs    ip
ss    sp   bp
ds    bx   di   si   或一个16位数
es    di


3. 80x86指令系统和寻址方式

3.1 寻址方式
立即数 如 5H
寄存器 如 AX
直接寻址 如 [2000H]
寄存器间接寻址 如   [BX] ,当寄存器用EBP或ESP时.段寄存器为SS. 否则段寄存器为DS.
寄存器相对寻址 如 COUNT[SI]. 或 [COUNT+SI]
基址变址寻址: 如 [BX][DI] 或 [BX + DI]
相对基址变址寻址 如   COUNT[BX][DI] 或 [COUNT + BX + DI]
比例变址寻址 如   COUNT[ESI*4]

转移地址

段内直接:如:
     JMP NEAR PTR PROGIA   
     JMP SHORT QUEST
其中PROGIA 和 QUEST 为断内符号地址. 在机器指令中它是一个位移量. 用IP和位移量的和做IP值.
NEAR 和 SHORT 表示近转移和短转移.

段内间接: 如:
     JMP BX
     JMP WORD PTR[BP+TABLE]
用寻址到的内存单元的值做IP值. 第2句的WORD PTR表示这是一个字的有效地址.

段间直接: 如:
     JMP FAR PTR NEXT
其中FAR PTR 表示段间转移. 它用NEXT符号地址的偏移值做IP值.用NEXT的段地址做CS值.

段间间接: 如:
     JMP DWORD PTR[INTERS+ BX]
其中DOWRD PTR 是双字操作符.表示在该地址上取双字. 其中一个字放入IP.一个字放入CS.


========================================================================================

                                                                                  寻址方式
计算机是通过执行指令序列来解决问题的,因而每种计算机都有一组指令集供给用户使用,这组指令集就称为计算机的指令系统
计算机中的指令由操作码字段和操作数字段两部分组成。操作码字段指示计算机所要执行的操作,而操作数字段则指出在指令执行操作的过程中所需要的操作数
指令的格式一般是:
操作码,操作数&hellIP;操作数
操作数字段可以有一个、两个或三个,通常称为一地址、二地址或三地址指令
计算机只能识别二进制代码,所以机器指令是由二进制代码组成的,汇编语言是一种符号语言,它用助记符来表示操作码,用符号或符号地址来表示操作数或操作数地址,它与机器指令是一一对应的
1、与数据有关的寻址方式
这种寻址方式用来确定操作数地址从而找到操作数
(1)立即寻址方式
操作数直接存放在指令中,紧跟在操作码之后,它作为指令的一部分存放在代码段里,这种操作数称为立即数。
(2)寄存器寻址方式
操作数在寄存器中,指令指定寄存器号
除 了上述两种寻址方式外,以下各种寻址方式的操作数都在除代码段以外的存储区中,通过不同的寻址方式求得操作数地址,从而取得操作数。操作数地址是由段基地 址和偏移地址相加而取得的。段基地址在实模式和保护模式下可以从不同途径取得。在80x86里,把操作数的偏移地址称为有效地址(EA),下述各种寻址方 式即为求得有效地址(EA)的不同途径
有效地址可以由以下四种成分组成:
位移量是存放在指令中的一个8位、16位或32位的数,但它不是一个立即数,而是一个地址
基址是存放在基址寄存器中的内容,它是有效地址中的基址部分,通常用来指向数据段中数组或字符串的首地址
变址是存放在变址寄存器中的内容,它通常用来访问数组中的某个元素或字符串中的某个字符
比例因子是386及其后续机型新增加的寻址方式中的一个术语,其值可以是1,2,4或8。在寻址中,可用变址寄存器中的内容乘以比例因子来取得变址值
有效地址的计算可以下式表示:
EA=基址+(变址*比例因子)+位移量
16位寻址时有效地址四种成分的组成:
位移量:0,8,16位
基址寄存器:BX,BP
变址寄存器:SI,DI
比例因子:无
32位寻址时有效地址四种成分的组成:
位移量:0,8,16,32位
基址寄存器:任何32位通用寄存器
变址寄存器:除ESP以外的32位通用寄存器
比例因子:1,2,4,8
各种访存类型下所对应的段的默认选择:
指令:代码段,CS寄存器,用于取指
堆栈:堆栈段,SS寄存器,所有的堆栈的进栈和出栈,任何用ESP或EBP作为基址寄存器的访存
局部数据:数据段,DS寄存器,除相对于堆栈以及串处理指令的目的串以外的所有数据访问
目的串:附加数据段,ES寄存器,串处理指令的目的串
实际上,在某些情况下,80x86允许程序员用段跨越前缀来改变系统所指定的默认段
(3)直接寻址方式
操作数的有效地址只包含位移量一种成分,其值就存放在代码段中指令的操作码之后。位移量的值即操作数的有效地址
80x86中为了使指令字不要过长,规定双操作数指令的两个操作数中,只能由一个用存储器寻址方式,这就是一个变量常常先要送到寄存器的原因
(4)寄存器间接寻址方式
操作数的有效地址只包含基址寄存器内容或变址寄存器内容一种成分。有效地址就在某个存储器中,而操作数则在存储器中
(5)直接变址寻址方式
操作数的有效地址为基址寄存器或变址寄存器的内容和指令中指定的位移量之和,有效地址由两部分组成
(6)基址变址寻址方式
操作数的有效地址是一个基址寄存器和一个变址寄存器的内容之和,所以有效地址由两种成分组成
(7)相对基址变址寻址方式
操作数的有效地址是一个基址寄存器与一个变址寄存器的内容和指令中指定的位移量之和,所以有效地址由三部分组成
(8)比例变址寻址方式
操作数的有效地址是变址寄存器的内容乘以指令中指定的比例因子再加上位移量之和,所以有效地址由三部分组成
(9)基址比例变址寻址方式
操作数的有效地址是变址寄存器的内容乘以比例因子再加上基址寄存器的内容之和,所以有效地址由三种成分组成
(10)相对基址比例变址寻址方式
操作数的有效地址是变址寄存器的内容乘以比例因子,加上基址寄存器的内容,再加上位移量之和,所以有效地址由四种成分组成
2、与转移地址有关的寻址方式
这种寻址方式用来确定转移指令及CALL指令的转向地址
(1)段内直接寻址
转向的有效地址是当前IP寄存器的内容和指令中指定的8位或16位位移量之和
(2)段内间接寻址
转向的有效地址是一个寄存器或是一个存储单元的内容。这个寄存器或存储单元的内容可以用数据寻址方式中除立即数以外的任何一种寻址方式取得,所得到的有效地址用来取代IP寄存器中的内容
(3)段间直接寻址
在指令中直接提供了转向段地址和偏移地址,所以只要用指令中指定的偏移地址取代IP寄存器的内容,用指令中指定的段地址取代CS寄存器的内容就完成了从一个段到另一个段的转移操作
(4)段间间接寻址
用存储器中的两个相继字的内容来取代IP和CS寄存器的原始内容,以达到段间转移的目的。这里,存储单元的地址是由指令指定除立即数方式和寄存器方式以外的任何一种数据寻址方式取得
=========================================================================================
一数据存储器(存放数据)
AX(AL和AH)累加器
BX(BL和BH)基址寄存器
CX(CL和CH)计数器
DX(DL和DH)数据存储器

二段寄存器组
CS代码段寄存器
SS堆栈段寄存器
DS数据段寄存器
ES附加段寄存器

三指针寄存器和变址寄存器
SP堆栈指针
BP基址指针
SI源变址寄存器
DI目的变址寄存器

四控制寄存器组
IP 指令指针
FLAGS标志寄存器

8086/8088CPU的寻址方式
1 指令寻址
指令指针IP的内容自动加一,即可形成下条指令地址
2 操作数的寻址方式
操作数的来源
1)包含在指令中,叫做立即操作数
2)在CPU的某个寄存器(数据存储器)中
3)在内存的某个存储单元中,这时给出的是操作数直接的地址或者是产生地址的方法
4)在某个I/O端口中
寻址方式
1)隐含寻址
2)立即数寻址
将一个立即数直接放进寄存器(一)中
MOV AL, 2CH;
MOV AH, 2C40H;
3)寄存器寻址器
操作数放在CPU的寄存器(一,三)中,指令中直接以寄存器的名字来调用;8位操作数的话只能是AH BH CH DH或AL BL CL DL
INC CX;
MOVAX, BX;
以上三种寻址方式都是在CPU内部完成的。
下面的五种是存储器的寻址方式
4)直接寻址
操作数在存储器中的16位有效地址EA直接由指令给出
物理地址PA计算公式:
MOV AX, [1400H]
默认段基址为DS
PA=(DS×10H)+1400H
段超越
MOV AX,ES/SS:[2100H]
PA=(ES/SS×10H)+2100H
5)寄存器间接寻址
操作数的EA在某个寄存器(BX,BP,SI,DI)中
BX,BP,DI都默认DS为段基址
SI默认SS为段基址
MOV AX, [DI]
PA=(AX×10H)+(DI)
MOV AX, [SI]
PA=(AX×10H)+(SI)
也允许段超越
MOV AX, ES:[DI]
PA=(ES×10H)+(DI)
MOV AX, DS:[SI]
PA=(DS×10H)+(SI)
6)寄存器相对寻址
MOV AX, 1011H[DI]
或 MOV AX, [DI+1011H]
PA=(DS×10H)+(DI)+1011H
7)基址变址寻址
操作数的有效地址EA由指令指定的一个基址寄存器(BX/BP)和一个变址寄存器(SI/DI)的内容之和组成。
BX确定操作数存放在数据段中,BP确定操作数存放在堆栈段中
MOV AX, [BX][DI]
或 MOV AX, [BX+DI]
PA=(DS×10H)+[BX]+[DI]
8)相对基址变址寻址
MOV AX, 1460H[BP][SI]
或 MOV AX, 1460H[BP+SI]
或 MOV AX, [BP+SI+1460H]
PA=(SS×10H)+(SI)+1460H
  评论这张
 
阅读(322)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017