汇编 OFFSET 在一条指令中使用了两次,什么是 offset of offset?

Assembly OFFSET used twice in one instruction, what is offset of offset?

我正在使用 Assembly 进行一个项目,其中出现了 属性 的 offset 指令。我写下了以下指令:

mov ax, offset offset variable

当我执行程序时,我预计会出现错误,但程序 运行 没有显示任何错误,并且行 mov ax, offset offset variable 在调试工具中显示为 mov ax, 0784,这是同样的指令mov ax, offset variable出现(0784是变量在数据段的偏移量)。一头雾水后,我执行了这条指令:mov ax, offset offset offset offset offset offset variable(是的,有点搞笑)同样的效果,同样的结果(ax值变成了变量的偏移量)

我的问题是为什么存储在寄存器AX中的值是变量的偏移量(我能确定偏移量总是偏移量=偏移量吗?),为什么那些行不产生任何错误?并且,如果offsetoffset of offset有一个意思,那它是什么意思呢? (汇编程序在这些示例中遵循的含义)

谢谢。 我正在使用程序集 x86、TASM、DOSBox 模拟器和 Turbo 调试器(如果相关的话):)

variable 的地址本身并没有存储在内存中的任何地方,添加更多 offset 关键字不会创建指针对象并为您提供指向指向指针的指针的地址variable.

这显然与使用 offset 一次. 一样,这大概是 TASM 中解析器的一个怪癖:我猜测解析逻辑看到 offset 并在内部设置一个标志,然后再次开始解析,直到它得到一个变量名。如果它再次看到 offset,它只会再次设置相同的标志并继续。

以这种方式编写代码没有任何理由或好处,所以不要故意这样做。可能无论在调用时指定 offset 还是不指定,都可以方便地使宏正常工作?除此之外,请保持来源简单。

(有趣的事实:在 .intel_syntax noprefix 模式下,GNU 汇编程序也不拒绝这一点。我仍然怀疑这是一个有意的特性,只是一个未记录的怪癖。)