汇编OFFSET在一条指令中使用了两次,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中存储的值是变量的偏移量(我可以确定总是偏移量=偏移量吗?),为什么这些行不产生任何错误?并且,如果 offset的偏移量的含义是什么,它的含义是什么? (这些示例中汇编程序遵循的含义)

谢谢。 如果相关,我正在使用程序集x86,TASM,DOSBox仿真器和Turbo调试器:)

解决方法

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

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

以这种方式编写代码没有任何理由或好处,因此请不要故意这样做。不管调用时是否指定offset,使宏都能正常工作很方便吗?除此之外,请保持您的来源简单。

(有趣的事实:在offset模式下,GNU汇编器也不会拒绝它。我仍然怀疑这是一个有意的功能,只是一个未记录的怪癖。)