前言
由于一直没弄清楚myvm中的寻址方式是什么,故我这几天到处找书本看来学习相关的寻址方式。
寻址方式
ps:计算机指令是由操作码字段和操作数地址码字段两部分组成的,操作码字段指示计算机要执行的操作,操作数地址码字段则指出在指令执行操作的过程中所需要操作数的地址。
- 立即寻址:指令中的操作数为常数,则存储时紧跟在操作码之后,作为指令的一部分存在代码段里,这种操作数称为立即数。
实例:
MOV AL ,05H /执行后(AL)=05H
MOV AX ,1234H /执行后(AX)=1234H
说明:立即数寻找方式用于给寄存器或存储单元赋初值,只能用于源操作数字段,不能用于目的操作数数字段。
- 寄存器寻址:操作数在CPU内部的寄存器中,指令中指定寄存器名,寄存器可以是8位、16位或32位的.
实例:
MOV AX ,01E0H /(AX)<—01E0H
MOV AX , BX /(AX)<—(BX)
指令中源操作数和目的操作数都是寄存器寻址。这钟情况下,两个寄存器的长度必须一样;
这种寻址方式的指令执行速度最快,是由于操作数在CPU内部的寄存器中,不需要通过访问存储器来取得操作数。
- 直接寻址:有效地址EA在指令中直接给出,它存放在代码段中指令操作码之后,但操作数一般存放在数据段(DS)中,所以必须先求出操作数的物理地址,然后在访问存储器才能取得操作数。
实例:
MOV AX,[1200H] /指令中直接给出了源操作数存放在数据段中,有效地址EA=1200H,设DS=2000H,则物理地址为:PA=(DS)*10H+EA=20000H+1200H=21200H
- 寄存器间接寻址:操作数的有效地址在基址寄存器BX、BP或变址寄存器SI、DI中,而操作数在存储器中。
实例:
MOV AX ,[SI] /书写格式是寄存器加上方括号
/指令的功能是数据段中以SI寄存器的内容为偏移地址的字存储单元(即SI指向的存储单元)内容传送给AX寄存器
- 寄存器相对寻址:操作数的有效地址是一个基址或变址寄存器的内容和指令中指定的8位或16位的位移量之和.
EA=(寄存器)+位移量 /EA即为有效地址
- 基址加变址寻址:操作数的有效地址是一个基址寄存器和一个变址寄存器的内容之和。
物理地址=10H*(DS)+(BX)+(DI)或(SI)
物理地址=10H*(SS)+(BP)+(DI)或(SI)
MOV AX,[BX][SI] /基址加变址寻址的书写格式
- 相对基址加变址寻址:操作数的有效地址是一个基址寄存器和一个变址寄存器的内容和8位或16位位移量之和。
物理地址=10H*(DS)+(BX)+(DI)或(SI)+8或16位位移量
物理地址=10H*(SS)+(BP)+(DI)或(SI)+8或16位位移量
MOV AX,ARRAY[BX][SI] /相对基址加变址寻址
- 比例变址寻址:比例变址是指一对寄存器中的第二用比例因子2、4或8来乘,产生操作数的内存地址。
MOV EDX,[EAX+4*EBX] /指令将由EAX加上4倍EBX寻址的数据段存储单元的内容装入EDX
ps:我发现还有程序存储器寻址方法没有进行总结,明天对照myvm反汇编来总结其使用的寻址方式,并且总结程序存储器寻址方式。