【问题标题】:x86 Assembly - $ not displaying correct addressx86 程序集 - $ 未显示正确的地址
【发布时间】:2017-10-08 08:54:07
【问题描述】:

我正在使用 Visual Studio 2017,并想测试 $ 符号。使用以下代码,我希望 var1 和 var2 的值不同,但它们是相同的。

.data
var1 DWORD $
var3 BYTE 16 dup (0FFh)
var2 DWORD $

这是 VS 在内存中显示的图像

var1 的值对我来说是有意义的,但如果 $ 应该显示下一个内存地址,为什么 var2 显示的 this 与 var1 相同?不应该显示004068A4吗?

【问题讨论】:

    标签: assembly x86 masm


    【解决方案1】:
    .data
    var1 DWORD $
    var3 BYTE 16 dup (0FFh)
    var2 DWORD $
    

    您不会看到任何区别,因为特殊的 $ 编译时符号表示程序 code (.code) 中的当前位置。

    在这里,您在具有单独地址空间的 .data 部分中使用它。

    【讨论】:

    • 在 NASM 中,section .data / var1 dd $ /... / var2 dd $ 确实 组装到每个包含其自己地址的 dword。 NASM 和 MASM 之间的另一个“有趣”区别。 (NASM 行为让您可以执行 msglen equ $ - msg 之类的操作。在 MASM 中,您是否必须在字符串末尾添加标签并使用 msg_end - msg?)我认为 NASM 行为更有用且不那么令人惊讶,除非有我缺少一个用例。
    • 据我了解,使用等号指令 (=) 有效,因为 $ 最终被放置在 .code 段而不是 .data 段中。但是,我不明白像 ListSize = ($ - list) 这样的东西是如何工作的,假设 list 只是字节数组的标识符。这与将 .code 偏移量减去一些 .data 偏移量不是一回事吗?在这种情况下 list 的值是否不引用我的数组的第一个字节?
    • $ 视为重载运算符。当单独使用时,汇编器更倾向于将其视为代码段中的位置计数器,但在像$ - list 这样的表达式中,汇编器知道 list 标签属于哪个段,因此能够计算无论如何都是相对值的预期结果。
    • 考虑jmp $,其中$ 指代代码段中的位置,然后查看ListSize = ($ - list),其中$ 指代数据段中的位置。当数据和代码共享同一部分时,这很容易。当他们不这样做时,必须强加优先级。
    猜你喜欢
    • 2016-02-18
    • 2020-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-23
    相关资源
    最近更新 更多