CPU寻址方式

版权声明:本文为博主原创文章,转载请注明出处。 https://blog.csdn.net/qq_37653144/article/details/82812984

       汇编语言的语法是指令+“指令目的操作数,源操作数”。需要处理的数据(立即数、地址、寄存器存放的数据等)称为源操作数,而指令处理结果的存放目的地称为指令目的操作数(寄存器、地址等)。而处理器是根据地址从存储单元中取出指令来执行的,根据CPU访问数据(寻址)形式的不同划分了以下几种寻址方式:

寻址方式
寄存器寻址
立即数寻址
内存寻址 直接寻址
基址寻址
变址寻址
基址变址寻址

       此外,根据指令地址字段的形式地址是否是操作数的真正地址还分为直接寻址和间接寻址两大类。

寄存器寻址

       当操作数不放在内存中,而是放在CPU的寄存器中时,从寄存器中取操作数的方式称为寄存器寻址。寄存器寻址也分为寄存器间接寻址和寄存器直接寻址,两者的区别在于:寄存器间接寻址方式的指令格式中的寄存器内容不是操作数,而是操作数的地址,该地址指明的操作数在内存中。

mov ax, bx      ;寄存器直接寻址
mov ax, [bx]    ;寄存器间接寻址

立即数寻址

       立即数寻址的源操作数是常数,之所以叫立即数,是相对于其他寻址方式中处理器需要从寄存器或内存中获取操作数的方式而言的。立即数寻址中指令的地址字段指出的不是操作数的地址,而是操作数本身。立即寻址方式的特点是指令执行时间很短,因为它不需要访问内存取数,从而节省了访问内存的时间。

内存寻址

       相对于寄存器寻址的操作数在寄存器中和立即数寻址的操作数直接在指令中,操作数需要在内存中寻找的方式成为内存寻址。可供程序员操纵的寄存器数量有限,当操作数很多的时候采用寄存器寻址方式显得捉襟见肘。而立即数寻址必须提前知道立即数是多少,否则不可用,且大多数时候操作数位于内存中的某个位置,只知道操作数所在的内存地址而不知道操作数的值就更谈不上将其变为立即数用在指令中了。因此内存寻址的存在也就成了理所当然。

       在实模式下,访问内存时用“段基址: 段内偏移地址”的形式。默认情况下数据段寄存器是ds,即段基址已经有了,只要再给出段内偏移地址就可以访问内存了,最终起决定作用的、有效的是段内偏移地址,所以段内偏移地址称为有效地址。

直接寻址

       直接寻址就是直接在操作数中给出的数字作为内存地址,通过中括号的形式告诉CPU取此地址作为操作数。直接寻址和立即数寻址的区别在于,立即数寻址中的数字是直接拿来用作操作数,而直接寻址中的数字则是用来进一步寻址的。

基址寻址

       基址寻址就是在操作数中用基址寄存器(在实模式下只能用bp和bx寄存器)作为地址的起始,地址的变化以它为基础。就是将CPU中的基址寄存器的内容,加上变址寄存器的内容而形成操作数的有效地址。

add word[bx], 0x1234    ;将0x1234加上内存地址ds:bx处的值后再存入内存地址ds:bx中

       基址寻址的优点是可以扩大寻址能力,因为与形式地址相比,基址寄存器的位数可以设置得很长,从而可以在较大的存储空间中寻址。

变址寻址

       变址寻址和基址寻址类似,只是寄存器由bx、bp换成了si、和di。

mov [di], ax    ;将寄存器ax的值存入ds:di指向的内存

基址变址寻址

       基址寻址和变址寻址的结合,即基址寄存器bx或bp加上变址寄存器si或di。

扫描二维码关注公众号,回复: 3395036 查看本文章
mov [bx+di], ax    ;将ax中的值存入以ds为段基址,bx+di为偏移地址的内存中

猜你喜欢

转载自blog.csdn.net/qq_37653144/article/details/82812984