我正在组装一个项目,其中出现了某种奇怪的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 的 offset有一个含义,它的含义是什么?(这些例子中汇编器遵循的含义)
谢谢。如果相关,我正在使用程序集 x86、TASM、DOSBox 模拟器和 Turbo Debugger :)
的地址variable
本身并不存储在内存中的任何地方,添加更多offset
关键字不会创建指针对象并为您提供指向指针的指针的地址variable.
这显然与使用offset
once相同。这大概是 TASM 中解析器的一个怪癖:我猜解析逻辑会在offset
内部看到并设置一个标志,然后再次开始解析,直到它得到一个变量名。如果它offset
再次看到,它只是再次设置相同的标志并继续前进。
以这种方式编写代码没有任何理由或好处,所以不要故意这样做。无论offset
您在调用时是否指定,都可以方便地制作可以工作的宏?除此之外,请保持您的来源简单。
(有趣的事实:GNU 汇编器在.intel_syntax noprefix
模式下也不会拒绝这一点。我仍然怀疑这是一个有意的功能,只是一个未记录的怪癖。)
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句