寄存器及七种寻址方式

一、寄存器

总共有14个16位寄存器,8个8位寄存器

通用寄存器:

数据寄存器:

AH(8位)  AL(8位)  AX(16位)   (AX和AL又称累加器)

BH(8位)  BL(8位)  BX(16位)   (BX又称基址寄存器,唯一作为存储器指针使用寄存器)

CH(8位)  CL(8位)  CX(16位)   (CX用于字符串操作,控制循环的次数,CL用于移位)

DH(8位)  DL(8位)  DX(16位)   (DX一般用来做32位的乘除法时存放被除数或者保留余数)

指针寄存器:

SP 堆栈指针 (存放栈顶地址)

BP 基址指针 (存放堆栈基址偏移)

变址寄存器:主要用于存放某个存储单元地址的偏移,或某组存储单元开始地址的偏移,

即作为存储器(短)指针使用。作为通用寄存器,它们可以保存16位算术逻辑运算中的操

作数和运算结果,有时运算结果就是需要的存储单元地址的偏移.

SI 源地址  (源变址寄存器)

DI 目的地址 (目的变址寄存器)

控制寄存器:

IP 指令指针

FLAG 标志寄存器

 ① 进位标志 CF,记录运算时最高有效位产生的进位值。

   ② 符号标志 SF,记录运算结果的符号。结果为负时置1,否则置0。

   ③ 零标志  ZF,运算结果为0时ZF位置1,否则置0。

   ④ 溢出标志 OF,在运算过程中,如操作数超出了机器可表示数的范围称为溢出。溢出时OF位置1,否则置0。

   ⑤ 辅助进位标志 AF,记录运算时第3位(半个字节)产生的进位值。

   ⑥ 奇偶标志 PF,用来为机器中传送信息时可能产生的代码出错情况提供检验条件。当结果操作数中1的个数为偶数时置1,否则置0。

段寄存器

CS 代码段  IP

DS 数据段

SS 堆栈段  SP BP

ES 附加段

二、七种寻址方式:

1、立即寻址方式:

操作数就包含在指令中。作为指令的一部分,跟在操作码后存放在代码段。

这种操作数成为立即数。立即数可以是8位的,也可以是16位的。

例如:

指令: MOV AX,1234H

则: AX = 1234H

2、寄存器寻址方式:

操作数在CPU内部的寄存器中,指令指定寄存器号。

对于16位操作数,寄存器可以是:AX、BX、CX、DX、SI、DI、SP和BP等。

对于8位操作数,寄存器可以是AL 、AH、BL、BH、CL、CH、DL、DH。

这种寻址方式由于操作数就在寄存器中,不需要访问存储器来取得操作数

因而可以取得较高的运算数度。

3、直接寻址方式:

操作数在寄存器中,指令直接包含有操作数的有效地址(偏移地址)

注:操作数一般存放在数据段

所以操作数的地址由DS加上指令中直接给出的16位偏移得到。如果采用

段超越前缀,则操作数也可含在数据段外的其他段中。

例如:

MOV AX,[8054]

如(DS) = 2000H,

则执行结果为(AX) = 3050H

(物理地址=20000+8054=28054H)

28054H里的内容为3050H

在汇编语言指令中,可以用符号地址代替数值地址

如:MOV AX,VALUE

此时VALUE为存放操作数单元的符号地址。

如写成:MOV AX,[VALUE]也是可以的,两者是等效的。

如VALUE在附加段中,则应指定段超越前缀如下:

MOV AX,ES:VALUE 或 MOV AX,ES:[VALUE]

4、寄存器间接寻址方式:

操作数在寄存器中,操作数有效地址在SI、DI、BX、BP

这四个寄存器之一中。在一般情况下,如果有效地址在

SI、DI和BX中,则以DS段寄存器中的内容为段值。如果

有效地址在BP中,则以SS段寄存器中的内容为段值

例如:

MOV AX,[SI]

如果(DS) = 5000H (SI) = 1234H

则物理地址 =  50000 + 1234 = 51234H

51234H地址中的内容为:6789H

执行该指令后,(AX) = 6789H

5、寄存器相对寻址方式:

操作数在存储器中,操作数的有效地址是一个基址寄存器(BX、BP)

或变址寄存器(SI、DI)的内容加上指令中给定的8位或16位位移量之和

BX  8位 位移量

EA(有效地址) =  BP  +

SI  16位 位移量

DI

在一般情况下,如果SI、DI、或BX中的内容作为有效地址的一部分,那么

引用的段寄存器是DS;如果BP中的内容作为有效地址的一部分,那么引用的

段寄存器是SS。

物理地址 = 16d × (DS) + (BX) + 8

或(SI)或16位位移量

或(DI)

物理地址 = 16d × (SS) + (BP) + 8位位移量

或16位位移量

在指令中给定的8位或16位位移量采用补码形式表示。在计算有效地址时,如

位移量是8位,则被带符号扩展成16位。

例如:

MOV AX,[DI+1223H]

假设,(DS) = 5000H,(DI) = 3678H

则物理地址 = 50000 + 3678 + 1233 = 5489BH

5489BH地址中的内容:55AAH

执行该指令后AX = 55AAH

下面指令中,源操作数采用寄存器相对寻址,引用的段寄存器是SS: MOV BX,[BP-4]

下面指令中,目的操作数采用寄存器相对寻址,引用的段寄存器是ES: MOV ES:[BX+5],AL

指令:MOV AX,[SI+3]与MOV AX,3[SI]是等价的

6、基址加变址寻址方式:

操作数在寄存器中,操作数的有效地址由:

基址寄存器之一的内容与变址寄存器之一的内容相加

BX   SI

即: EA =    +

BP   DI

在一般情况下,如果BP之内容作为有效地址的一部分,则以SS之内容为段值,否则已DS

为段值。

例如:

MOV AX,[BX][DI]

如:(DS)=2100H,

(BX)=0158H,

(DI)=10A5H

则EA=0158 + 10A5 = 11FD

物理地址=21000 + 11FD = 221FDH

221FDH地址中的内容:1234H

执行该指令后AX = 1234H

下面指令中,目的操作数采用基址加变址寻址,

引用的段寄存器是DS: MOV DS:[BP+SI],AL

下面指令中,源操作数采用基址加变址寻址,

引用的段寄存器ES: MOV AX,ES:[BX+SI]

这种寻址方式使用与数组或表格处理。用基址寄存器存放数组首地址,而用变地寄存器

来定位数组中的各元素,或反之。由于两个寄存器都可改变,所以能更加灵活地访问数

组或表格中的元素。

下面的两种表示方法是等价的:

MOV AX,[BX+DI]

MOV AX,[DI][BX]

7、相对基址加变址寻址方式:

操作数在存储器中,操作数的有效地址由于基址寄存器之一的内容与变址寄存器之一的

内容及指令中给定的8位或16位位移量相加得到。

BX    SI    8位

即: EA =     +     +      位移量

BP    DI    16位

在一般情况下,如果BP中的内容作为有效地址的一部分,则以SS段寄存器中的内容为段

值,否则以DS段寄存器中的内容为段值。

在指令中给定的8位或16位位移量采用补码形式表示。

在计算有效地址时,如果位移量是8位,那么被带符号扩展成16位。

当所得的有效地址操作FFFFH时,就取其64K的模

例如:

MOV AX,[BX+DI-2]

假设,(DS) = 5000H, (BX) = 1223H, DI = 54H, (51275) = 54H, (51276) = 76H

物理地址= 50000 + 1223 + 0054 + FFFE(-2 各位取反末位加一) = 51275H

执行该指令后 (AX) = 7654H

相对基址加变址这种寻址方式的表示方法多种多样,以下四种方法均是等价的:

MOV AX,[BX+DI+1234H], MOV AX,1234H[BX][DI]

MOV AX 1234H[BX+DI],  MOV AX,1234H[DI][BX]

寄存器及七种寻址方式

时间: 2024-10-25 14:18:27

寄存器及七种寻址方式的相关文章

寄存器与七种寻址方式

一.寄存器 总共同拥有14个16位寄存器,8个8位寄存器 通用寄存器: 数据寄存器: AH(8位)  AL(8位)  AX(16位)   (AX和AL又称累加器) BH(8位)  BL(8位)  BX(16位)   (BX又称基址寄存器,唯一作为存储器指针使用寄存器) CH(8位)  CL(8位)  CX(16位)   (CX用于字符串操作,控制循环的次数,CL用于移位) DH(8位)  DL(8位)  DX(16位)   (DX一般用来做32位的乘除法时存放被除数或者保留余数) 指针寄存器:

8086 七种寻址方式

8086/8088 CPU寻址方式 <1> 立即寻址 操作数在指令中,紧跟在操作码之后,这样的操作数成为立即数,可以是8bit或者16bit. 例如: MOV AL,12H MOV AX,1234H <2> 直接寻址 操作数的地址中的偏移量直接跟在操作码之后,默认情况下基址存放在DS中,这个时候不需要加前缀,如果是加了别的前缀,如ES,则表示基址在ES中. 例如: movax,[4000h] movax,value   (如果我们在前面定义了"符号地址"valu

8086中的七种寻址方式

寻址方式 8086/8088有七种基本的寻址方式:立即寻址,寄存器寻址,直接寻址,寄存器间接寻址,寄存器相对寻址,基址变址寻址,相对基址变址寻址. 其中,后五种寻址方式(即直接寻址.寄存器间接寻址.寄存器相对寻址.基址变址寻址和相对基址变址寻址)属于存储器寻址,用于说明操作数或操作数地址所在存储单元的地址.这五种方式也就是确定存放操作数的存储单元有效地址EA的方法,这里所说的有效地址就是在前面一节讲存储器分段中所说的段内偏移地址. 除了这些基本的寻址方式以外,还有固定寻址和I/O端口寻址等,但不

7种寻址方式

一.立即寻址方式 操作数作为指令的一部分而直接写在指令中,这种操作数称为立即数,这种寻址方式也就称为立即数寻址方式. 立即数可以是8位.16位或32位,该数值紧跟在操作码之后.如果立即数为16位或32位,那么,它将按“高高低低”的原则进行存储.例如: MOV AH, 80H ADD AX, 1234H MOV ECX, 123456HMOV B1, 12H MOV W1, 3456H ADD D1, 32123456H 其中:B1.W1和D1分别是字节.字和双字单元. 以上指令中的第二操作数都是

段寄存器和8种地址寻址方式

段寄存器是因为对内存的分段管理而设置的. 16位CPU有四个段寄存器,其程序可同时访问四个不同含义的段,引用方面有如下规定:1. 取命令:段寄存器CS指向存放程序的内存段,IP是用来存放下条待执行的指令在该段的偏移量,把它们合在一起可在该内存段内取到下次要执行的指令.2. 取堆栈:段寄存器SS指向用于堆栈的内存段,SP是用来指向该堆栈的栈顶,把它们合在一起可访问栈顶单元.另外,当偏移量用到了指针寄存器BP,则其缺省的段寄存器也是SS,并且用BP可访问整个堆栈,不仅仅是只访问栈顶.3. 取数据:段

windows堆栈溢出利用的七种方式

文本由 www.169it.com 搜集整理 windows下的堆栈溢出攻击和unix下的,原理基本相同.但是,由于windows用户进程地址空间分配和堆栈处理有其独立的特点,导致了windows 环境下堆栈溢出攻击时,使用的堆栈溢出字符串,与unix下的,区别很大.另外,windows的版本也导致了windows下的exploit不具有通用性.windows版本不同,而exploit使用了很多动态链接库里面的库函数,其地址都是与dll的版本有关系的.不同的dll版本,里面的库函数的偏移地址就可

Android设计模式之单例模式的七种写法

一 单例模式介绍及它的使用场景 单例模式是应用最广的模式,也是我最先知道的一种设计模式.在深入了解单例模式之前.每当遇到如:getInstance()这样的创建实例的代码时,我都会把它当做一种单例模式的实现. 事实上常常使用的图片载入框架ImageLoader的实例创建就是使用了单例模式.由于这个ImageLoader中含有线程池.缓存系统.网络请求,非常消耗资源,不应该创建多个对象,这时候就须要用到单例模式. ImageLoader的创建代码例如以下: ImageLoader.getInsta

进行有效编辑的七种习惯

如果你的很多时间是用来敲纯文本,写程序或HTML,那么有效地使用一个好的编辑器能节省你不少时间.这篇文章里的指导和提示将有助于你更快工作,更少犯错误. 文中采用开源文本编辑器Vim(Vi IMproved)说明有效编辑的思想,但这些思想也适用于其他编辑器.择合适的编辑器只是有效编辑的第一步,对于哪个编辑器更好的讨论将占很大地方,这里就不提了.如果你不知道该用哪个编辑器,或者对现在所使用的不太满意,不妨试试Vim:你是不会失望的. 第一部分:编辑一个文件  快速定位 编辑中大部分时间是花费在阅读.

ARM七种异常源和异常处理流程(四大步三小步)

ARM七种异常源和异常处理流程 2014-11-30  北京海淀区  张俊浩 ARM七种异常源及其工作模式                                                                                             异常源                                              含义                      ARM工作模式