TA的每日心情![](source/plugin/dsu_paulsign/img/emot/kx.gif) | 开心 2018-10-31 14:26 |
---|
签到天数: 18 天 [LV.4]偶尔看看III
![](data/attachment/common/c5/common_13_usergroup_icon.gif)
高级会员
- 积分
- 1019
![猴年](static/image/common/猴年yxlm23.gif)
|
1.什么是寻址方式
2.立即数寻址方式
3.寄存器寻址方式
4.存储器寻址方式
①存储器寻址方式-直接寻址方式
②存储器寻址方式-寄存器间接寻址方式
③存储器寻址方式-寄存器相对寻址方式
④存储器寻址方式-基址变址寻址方式
⑤存储器寻址方式-相对基址变址寻址方式
一,什么是寻址
关于这个问题,在王爽老师那本书和小甲鱼视频中提及中并没有过多的去提及这些问题。讲述的篇幅也不多。但是他们用了更加形象的语言和文字来说明-- 灵活的定位内存。寻址方式用比较官方的话来说就是寻找操作数或者操作数的地址。在科锐的视频中所提及的有三点①指令系统设计了多种操作数的来源。很好理解。就是指令系统在设计的时候就设计了很多种获取操作数的方式方法。②寻找操作数的过程就是操作数的寻址。这个也好理解,就是我们去某一个地方找操作数,找它过程就是操作数的寻址。③操作数采取哪一种寻址的方式就会影响机器的运行速度和效率。这个可以说比较关键了。举个比较简单的例子。我们把数据存在内存中。要取得内存中的数据作为自己的操作数据。和我们把数据存在了寄存器中。去寄存器里找数据哪个快?我们都知道寄存器肯定是要比内存快的,它更接近于CPU。这就是两两种不同的寻址方式了,前者属于存储器寻址方式,而后者属于寄存器寻址方式。
二,立即数寻址方式
立即数(imm)指令中的操作数直接存放在机器代码中紧跟在操作数之后,这种操作数被称为立即数。也就是说操作数是作为了指令的一部分是存放在操作码之后的主存单元中的。
它可以是8位的i8(00h~FFh)
例如:MOV AL,05H
也可以是16位的 i16(0000h~FFFFh)
例如:MOV AX,0102h
三,寄存器寻址方式
操作数存放在 CPU内部寄存器reg(register)中,可以是8位的寄存器r8,
8位寄存器有这些 al,ah,bl,bh,ch,cl,dh,dl
也可以是16位寄存器,r16 比如ax,bx,cx,dx等等
也其实也就是在寄存器里边找内容的一种寻找操作数的过程。
四,存储器寻址方式
存储器-内存
也就是从内存里边去找操作数或者说是我们要的那个值吧~~这样的话就和寄存器寻找方式差不多了。不过执行效率不用说也是寄存器寻址方式要高。
在鱼大视频中或者在王爽老师的视频中都讲述过定位一个物理地址的方法,段*16+偏移构成一个20位的物理地址。因此我们要定位这么一个内存单元当然也需要这些元素了。段地址and偏移地址。
存储器寻址方式分五种:
①存储器寻址方式-直接寻址方式
直接寻址方式就是有效地址在指令中直接给出。默认的情况下比如[2000h]这时候它哪有什么段地址?这明显坑人嘛不是?其实这是默认的情况,默认为ds数据段寄存器,但是可以使用段超越前缀来改变。哇靠~~~段超越前缀,V587 。大家千万别被这名词吓到了。在鱼大视频和王爽的书中提到了段前缀。但是没有什么段超越前缀这种说法(嗯也许是我看书或者看视频不认真,略过了)。段前缀倒是有过。废话一堆之后我就来说说段超越前缀是在科锐的视频中听到的(有的地方叫段跨越前缀)。所谓的段超越前缀就是在前边指定一个段,比如es:[2000h]什么的。(反正我是这么理解的,如果有什么纰漏朋友们给指出哈~~~)
像这种直接寻址方式呢比较适合单个的“变量”
②存储器寻址方式-寄存器间接寻址方式
寄存器间接寻址,如果理解了直接寻址方式的话下边的其实也好理解,它不是直接用寄存器里边的值(是的话那不成寄存器寻址方式了吗~~~),它是把寄存器(16位)里边的值,当作偏移地址的一种寻址方式
操作数在存储器中,操作数的有效地址在SI,DI,BX,BP这4个寄存器之一中。在不采用段前
缀的情况下, 对于DI,SI,BX默认段为DS,而BP为SS。
eg. mov ah,[bx]
mov ah,cs:[bx]
③存储器寻址方式-寄存器相对寻址方式
寄存器相对寻址方式,这玩意小甲鱼在视频中也说的非常清楚。它就比较灵活了,为了更好的理解它,这里先给出示例:
MOV AX, ES:[DI+10]
大家可以观察一下着句代码,ES指明了段,在附加段寄存器里边对吧~~那么然而里边有个寄存器,后边还加了一个10,这不坑嘛~~~你指明偏移地址就指明偏移地址。发什么疯要后边加一个十呢?这么给你们说吧比如有数据如下
DB 34H,35H,39H,38H,36H
DB 37H,34H,33H,36H,32H
观察数据,假设段地址为2000h偏移地址为0;那它指向第一个数据假如后边数据+10我给它改一数据,那是不是说第一行的第几个数据呢?如果DI=5它是不是就是到了37H呢?(+10为+0);那我DI=5 ES:[DI+1]DI是否指明了行呢?
④存储器寻址方式-基址变址寻址方式
有效地址由基地址寄存器(BX或者BP)的内容,加上变址寄存器(SI或者DI)的内容构成
有效地址==BX\BP+SI\DI
段地址对应BX基址寄存器默认DS
对应BP基地址寄存器默认是SS
可用段超越前缀改变
(两寄存器里边的东西相加)
例如:MOV AX, ES:[BX][SI]
注意:一条指令中同时使用基址寄存器或变址寄存器是错误的。
例如:MOV CL, [BX+BP]
或 MOV AX, [SI+DI]
均为非法指令。
这种寻址方式同样适用于数组或表格处理。
首地址可存放在基址寄存器中,而用变址寄存器来访问数组中的各个元素。由于两个寄存器的值都可以修改,所以它比寄存器相对寻址方式更加灵活。
例 MOV AX, [BX][DI]
(或写为 MOV AX, [BX+DI])
如 (DS ) = 2100H,(BX)= 0158H,(DI)= 10A5H
则 EA = 0158H +10A5H = 11FDH
物理地址 = 21000H +11FDH = 221FDH
最后的执行结果是(AX)= 1234H。
⑤存储器寻址方式-相对基址变址寻址方式
(此种寻址方式用于C语言中的二维数组的寻址)
有效地址是基址寄存器(BX\BP),变址寄存器(SI\DI)与一个八位或者十六位偏移量之和
有效地址=BX\BP+SI\DI+8\16位的偏移量
段地址对应BX基址寄存器默认是DS,对应BP基址寄存器默认是SS可用段超越前缀改变
(相对要加上后边的偏移量)
eg. mov ax,[bx+di-2]
mov ax,1234h[bx][di]
|
|