网站视觉规范,万能建站网站,大数据是干什么的,网站设计网站类型概念
在计算机系统中#xff0c;处理器操作和处理的是数值#xff0c;那么#xff0c;必定涉及数值从哪里来#xff0c;处理后送到哪里去#xff0c;这称为寻址方式(Addressing Mode)。
简单地说#xff0c;寻址方式就是如何找到要操作的数据#xff0c;以及如何找到存…概念
在计算机系统中处理器操作和处理的是数值那么必定涉及数值从哪里来处理后送到哪里去这称为寻址方式(Addressing Mode)。
简单地说寻址方式就是如何找到要操作的数据以及如何找到存放操作结果的地方。
寄存器寻址
最简单的寻址方式是寄存器寻址。就是说指令执行时操作的数位于寄存器中可以从寄存器里取得。
mov ax,cx
add bx,0xf000
inc dx
上述代码中 第一条指令的两个操作数都是寄存器是典型的寄存器寻址第二条指令的目的操作数是寄存器因此该操作数也是寄存器寻址 立即寻址
立即寻址又叫立即数寻址。也就是说指令的操作数是一个立即数
add bx,0xf000
mov dx,label_a
以上 第一条指令的目的操作数采用了寄存器寻址方式用于提供被加数 第二个操作数源操作数用于给出加数0xf000。这是一个直接给出的数值不需要通过其他方式寻找故称为立即数。这种寻址方式称为立即寻址。在第二条指令中目的操作数也采用的是寄存器寻址方式。 尽管源操作数是一个标号但是标号是数值的等价形式代表了它所在位置的汇编地址。因此在编译阶段它会被转化为一个立即数。因此该指令的源操作数也采用了立即寻址方式 内存寻址
寄存器寻址的操作数位于寄存器中立即寻址的操作数位于指令中是指令的一部分。
传统上这是两种速度较快的寻址方式。但是它们也有局限性。 一方面我们不可能总是知道要操作的数是多少因此也就不可能总是在指令中使用立即数另一方面寄存器的数量有限不可能总指望在寄存器之间来回倒腾。 考虑到内存容量巨大所以在指令中使用内存地址来操作内存中的数据是最理想不过了。正是因为内存访问如此重要处理器才拥有好几种内存寻址方式。 所谓的内存寻址方式就是如何在指令中指定操作数的偏移地址供处理器访问内存时使用这个偏移地址也叫有效地址(Effective Address, EA)。 换句话说内存寻址方式就是在指令中指定偏移地址有效地址如何计算。 直接寻址
在这种寻址方式中偏移地址或者说有效地址是直接给出的是一个用标号或者数字直接给出的具体数值
mov ax,[0x5c0f]
add word [0x0230],0x5000
xor byte [es:label_b],0x05 但凡是表示内存地址的都必须用中括号括起来 第一条指令中源操作数使用的是直接寻址方式当这条指令执行时处理器将数据段寄存器DS的内容左移4位加上这里的0x5c0f形成20位物理地址。接着从该物理地址处取得一个字传送到寄存器AX中。
在第二条指令中目的操作数采用的是直接寻址方式。当这条指令执行时处理器用同样的方法访问由段寄存器DS指向的数据段并把指令中的立即数加到该段中偏移地址为0x0230的字单元里
基址寻址
所谓基址寻址就是先指定一个基准位置数据的偏移地址有效地址取决于它到基准位置的位移或者说距离(Displacement)。
要使用基址寻址必须在指令的地址部分使用基址寄存器BX或者BP来提供一个基准地址。
mov [bx],dx
add byte [bx],0x55
第一条指令中的目的操作数采用了基址寻址。
在指令执行时处理器将数据段寄存器DS的内容左移4位加上基址寄存器BX中的内容形成20位的物理地址。然后把寄存器DX中的内容传送到该地址处的字单元里。
第二条指令中的目的操作数也采用的是基址寻址。
指令执行时将数据段寄存器DS的内容左移4位加上寄存器BX中的内容形成20位的物理地址。然后将指令中的立即数0x55加到该地址处的字节单元里。 基址寻址的动机是采用“基地址位移”的方式计算有效地址 在基址寻址方式中基址寄存器也可以是BP
mov ax,[bp]
这条指令的源操作数采用了基址寻址方式。但是与前面的指令相比它采用是基址寄存器BP在形成20位的物理地址时默认的段寄存器是SS。也就是说它经常用于访问栈。
这条指令执行时处理器将栈段寄存器SS的内容左移4位加上寄存器BP的内容形成20位的物理地址并将该地址处的一个字传送到寄存器AX中
变址寻址
变址寻址类似于基址寻址唯一不同之处在于这种寻址方式使用的是变址寄存器或称索引寄存器SI和DI
mov [si],dx
add ax,[di]
xor word [si],0x8000
和基址寻址一样当带有这种操作数的指令执行时除非使用了段超越前缀处理器会访问由段寄存器DS指向的数据段偏移地址由寄存器SI或者DI提供。
同样的变址寻址方式也允许带一个偏移量
mov [si0x100],al
and type [dilabel_a],0x80
以上第二条指令中尽管使用的是标号但本质上属于一个编译阶段确定的数值
基址变址寻址
使用基址变址的操作数可以使用一个基址寄存器BX或者BP外加一个变址寄存器SI或者DI。
在这种寻址方式下
基址寄存器BX或者BP是固定不变的是真正作为基地址来使用的变址寄存器SI或者DI是可变的用来提供位移
它的基本形式是这样的
mov ax,[bxsi]
add word [bxdi],0x3000
以上第一条指令的源操作数采用了基址变址寻址。当处理器执行这条指令时把数据段寄存器DS的内容左移4位加上基址寄存器BX的内容再加上变址寄存器SI的内容共同形成20位的物理地址。然后从该地址处取得一个字传送到寄存器AX中。
第二条指令与第一条指令类似只不过是加法指令它的目的操作数采用了基址变址寻址源操作数采用的是立即寻址。这条指令执行时处理器访问由段寄存器DS指向的数据段加上由BX和DI相加形成的偏移地址共同形成20位的物理地址然后将立即数0x3000加到该地址处的字单元里。
以下是使用基址变址寻址实现的代码其功能是将一个字符串进行翻转