汇编偏移在一个指令中使用两次,什么是偏移偏移?



我正在汇编中的一个项目,其中出现了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 中的值是变量的偏移量(我可以确定总是偏移量 = 偏移量吗?),为什么这些行不会产生任何错误?而且,如果偏移量有含义,它的含义是什么?(汇编程序在这些示例中遵循的含义)

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

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

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

以这种方式编写代码没有任何理由或好处,所以不要故意这样做。 可能制作工作的宏很方便,无论您在调用它时是否指定offset? 除此之外,保持你的来源简单。

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

最新更新