寄存器与寻址

寄存器与寻址寄存器16位CPU所含有的寄存器有:4个数据寄存器(AX、BX、CX和DX)2个变址和指针寄存器(SI和DI)2个指针寄存器(SP和BP),32位CPU增加2个16位的段寄存器:FS和GS。4个段寄存器(ES、CS、SS和DS)1个指令指针寄存器(IP)1个标志寄存器(Flags)AX――累加器(Accumulator),使用频度最高BX――基址

大家好,欢迎来到IT知识分享网。

   寄存器


16位CPU所含有的寄存器有:


4个数据寄存器(AX、BX、CX和DX)
2个变址和指针寄存器(SI和DI) 2个指针寄存器(SP和BP) ,32位CPU增加2个16位的段寄存器:FS和GS。
4个段寄存器(ES、CS、SS和DS)
1个指令指针寄存器(IP) 1个标志寄存器(Flags)

AX――累加器(Accumulator),使用频度最高
BX――基址寄存器(Base Register),常存放存储器地址
CX――计数器(Count Register),常作为计数器
DX――数据寄存器(Data Register),存放数据
SI――源变址寄存器(Source Index),常保存存储单元地址
DI――目的变址寄存器(Destination Index),常保存存储单元地址
BP――基址指针寄存器(Base Pointer),表示堆栈区域中的基地址
SP――堆栈指针寄存器(Stack Pointer),指示堆栈区域的栈顶地址
IP――指令指针寄存器(Instruction Pointer),指示要执行指令所在存储单元的地址。IP寄存器是一个专用寄存器。

到了32位机寄存器扩展为:EAX、EBX、ECX、EDX、ESI、EDI、EBP和ESP;当然ax,bx继续代表低16位,ah,al,bh,bl继续维持以前的意义不变。

  寻址

1.立即寻址方式 MOV AH, 60H(将60H赋值给寄存器A的高位)
2. 寄存器寻址方式(源或者目的地址有一个是寄存器)

eg.
a. 源操作数是寄存器寻址方式:
如:ADD VARD, EAX
其中:VARD表示双子,也可以是VARW(字)和VARB(字节)类型的内存变量。


b. 目的操作数是寄存器寻址方式
如:ADD BH, 78h    ADD AX, 1234h   MOV EBX, 12345678H等。
c. 源和目的操作数都是寄存器寻址方式
如:MOV EAX, EBX   MOV AX, BX     MOV DH, BL等。


3. 直接寻址方式(地址值在括号里)
MOV BX, [1234H] (默认使用DS)
MOV ES:[1000H], AX


4. 寄存器间接寻址方式(寄存器在括号里)
MOV BX,[DI]
操作数的有效地址用SI、DI、BX和BP等四个寄存器之一来指定,称这种寻址方式为寄存器间接寻址方式。
若有效地址用SI、DI和BX来指定,则其缺省的段寄存器为DS;
若有效地址用BP来指定,则其缺省的段寄存器为SS(即:堆栈段)。


5. 寄存器相对寻址方式(一个寄存器和一个立即数在括号里,并且还要计算)
MOV BX, [SI+100H]


6. 基址加变址寻址方式(两个寄存器在括号里,并且还要计算)
MOV BX, [BX+SI]


7. 相对基址加变址寻址方式(两个寄存器在括号里和一个立即数在括号里,并且还要计算)
MOV AX, [BX+SI+200H]

几个例子:
例子1. MOV BX, [SI+100H]
寻址路线为:
PA=(DS)*16+(SI)+100H

例子2. MOV BX, [BX+SI]
寻址路线为:
PA=(DS)*16+=(BX)+(SI)

例子3. MOV AX, [BX+SI+200H]
寻址路线为:
PA=(DS)*16+(BX)+(SI)+200H

取数据的规则:高高低低
比如内存单元12445H的Byte值为15H,12446的Byte内容为27H,那么12445的Word值为2715H,而BX的值也是2715.

注:为了简化理解,低地址在上面,高地址在下面(所谓向下生长)
与堆栈模型一致,参考:
http://www.cnblogs.com/findumars/archive/2012/10/28/2743121.html

8. 32位地址的寻址方式
在用16位寄存器来访问存储单元时,只能使用基地址寄存器(BX和BP)和变址寄存器(SI和DI)来作为地址偏移量的一部分。
但在用32位寄存器寻址时,不存在上述限制:
32位基址寄存器是:EAX、EBX、ECX、EDX、ESI、EDI、EBP和ESP;
32位变址寄存器是:EAX、EBX、ECX、EDX、ESI、EDI和EBP(除ESP之外)。
计算公式:基址寄存器+变址寄存器+比例因子+偏移常量。
段寄存器的判断与使用:
1)地址中寄存器的书写顺序决定该寄存器是基址寄存器,还是变址寄存器,例如:
[EBX+EBP]中的EBX是基址寄存器,EBP是变址寄存器。
[EBP+EBX]中的EBP是基址寄存器,EBX是变址寄存器。
2)基址寄存器是EBP或ESP时,默认的段寄存器是SS,否则,默认的段寄存器是DS,例如:
MOV AX, [123456H] ;默认段寄存器DS
MOV EAX, [EBX+EBP] ;默认段寄存器DS
MOV EBX, [EAX+100H] ;默认段寄存器DS
MOV EBX, [EBP+EBX] ;默认段寄存器SS
MOV [ESP+EDX*2], AX ;默认段寄存器SS
MOV AX, [ESP] ;默认段寄存器SS
3)在指令中,如果使用段前缀的方式,那么,显式段寄存器优先。
MOV EDX, ES:[EAX*4+200H] ;显式段寄存器ES
MOV EBX, GS:[EAX+EDX*2+300H] ;显式段寄存器GS

为了明确指令中存储单元的属性,可把指令“MOV [BX], 1H”可改写成:
MOV byte ptr [BX], 1H   或  MOV word ptr [BX], 1H

一个字节的内容是该字节单元内存放的二进制信息;
一个字的内容是该字地址所指向的单元及其后继一个单元的内容拼接而成;
一个双字的内容是该字地址所指向的单元及其后继三个单元的内容拼接而成.

参考: http://www.cnblogs.com/findumars/archive/2013/09/05/3302457.html



免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/23220.html

(0)

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信