首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >关于寻址模式-偏移从哪里开始?

关于寻址模式-偏移从哪里开始?
EN

Software Engineering用户
提问于 2018-02-12 13:04:33
回答 1查看 82关注 0票数 0

因此,寻址模式是指定操作数的方式(据我所了解),不同的架构提供了不同的模式,例如即时模式、寄存器间接模式等。

在这种情况下,我经常会遇到一个偏移量的规范,例如在直接模式中,您在指令中直接指定操作数的偏移量,比如ADD AL,[0301] --但是偏移量来自什么?一定有基址或偏移量所基于的东西?有没有什么起点,比如指令的地址?

EN

回答 1

Software Engineering用户

回答已采纳

发布于 2018-02-12 15:55:41

如果您正在查看正在运行的程序的反汇编(即从调试器),那么绝对内存模式可能就是这样。在您的情况下,它将是正在调试的进程的地址空间中的地址301。

然而,在某些处理器中,有一个CPU寄存器为数据访问提供基本地址。

例如,8086处理器,它是16位处理器的扩展版本,允许访问20位地址空间。扩展是螺旋式的,因为它们将两个16位值组合在一起计算一个20位地址(因此,使用32位来产生一个20位地址!)

公式为20位地址=段部分* 16 +偏移部分.

例如,在访问数据时,处理器维护一个名为DS的寄存器来保存基段,在指令中我们只指定偏移量,它将以形式出现,就像它是一个直接/绝对寻址模式一样,尽管处理器将实际计算DS:offset (即它们编写公式从段寄存器和偏移值计算20位地址的方式)。

程序集代码可能类似于:

代码语言:javascript
复制
dataSeg segment data
...
xyz     db 5
...

然后在代码中

代码语言:javascript
复制
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/已经使用了专门用于数据段加载时间重定位的寄存器。

票数 0
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/365791

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档