因此,寻址模式是指定操作数的方式(据我所了解),不同的架构提供了不同的模式,例如即时模式、寄存器间接模式等。
在这种情况下,我经常会遇到一个偏移量的规范,例如在直接模式中,您在指令中直接指定操作数的偏移量,比如ADD AL,[0301] --但是偏移量来自什么?一定有基址或偏移量所基于的东西?有没有什么起点,比如指令的地址?
发布于 2018-02-12 15:55:41
如果您正在查看正在运行的程序的反汇编(即从调试器),那么绝对内存模式可能就是这样。在您的情况下,它将是正在调试的进程的地址空间中的地址301。
然而,在某些处理器中,有一个CPU寄存器为数据访问提供基本地址。
例如,8086处理器,它是16位处理器的扩展版本,允许访问20位地址空间。扩展是螺旋式的,因为它们将两个16位值组合在一起计算一个20位地址(因此,使用32位来产生一个20位地址!)
公式为20位地址=段部分* 16 +偏移部分.
例如,在访问数据时,处理器维护一个名为DS的寄存器来保存基段,在指令中我们只指定偏移量,它将以形式出现,就像它是一个直接/绝对寻址模式一样,尽管处理器将实际计算DS:offset (即它们编写公式从段寄存器和偏移值计算20位地址的方式)。
程序集代码可能类似于:
dataSeg segment data
...
xyz db 5
...然后在代码中
mov ax, dataSeg #1
mov ds, ax
...
mov al, offset [xyz] #2
...
mov ax, offset xyz #3
mov bl, [ax] #4请注意,在#1中,DS regsiter加载了在段指令中声明的数据段值(两个指令序列,因为DS在使用它的指令中受到限制)。第一个输入是使用我们所称的即时模式,因为没有实际的内存被访问。
接下来,在#2中,我们要求处理器从AL将一个字节从DS:offset xyz加载到DS,其中D7保存dataSeg的段地址。指令只指定offset [xyz],而不指定段部分。我们可能会将此称为直接/绝对寻址模式,因为作为与内存的交互(这里是字节读取)的地址计算,直接涉及到一个部分。可以说,这是一种base+offset寻址模式,但基是隐式寄存器。
在#2中,我们要求处理器自己加载偏移量,而不是进行内存提取;偏移量被加载到AX中。这将是一种即时寻址模式,因为内存实际上没有被访问。
在#4中,我们使用#3加载的偏移量,因此将字节从内存中提取到BL来自DS:AX。我们可以简单地说这是间接的。再一次,人们可能会认为这是base+index,除了基是隐式段寄存器。
一旦x86家族进入32位寄存器(例如80386及以上),他们就取消了大部分片段/偏移量的内容。因此,直接/绝对寻址更直接,值引用地址空间。
然而,其他处理器do/已经使用了专门用于数据段加载时间重定位的寄存器。
https://softwareengineering.stackexchange.com/questions/365791
复制相似问题