【问题标题】:How to dereference a pointer in ASM data section?如何取消引用 ASM 数据段中的指针?
【发布时间】:2018-04-06 03:30:47
【问题描述】:

我有一个声明全局指针并初始化它的 C 代码。像这样的:

my_type* var = malloc(...)

当我在 ASM x86 中将 var 声明为外部符号时,我得到了对指针的引用,即双指针,这真的很不方便,因为每当我想访问内容时,我都必须这样做:

extern var
mov ax, [var]
mov dx, [ax]

我想在 ASM 中获得一个包含 malloc 返回值的符号,即我在 C 代码中的指向 my_type 的指针。

有没有办法做到这一点?

【问题讨论】:

  • 能否展示ASM代码的相关部分?
  • 你的意思是&var是一个双指针?所以你必须加载两次才能访问分配的内存?是的,当您将 malloc 返回值存储在内存中而不是在寄存器中传递它们时,就会发生这种情况。
  • 我在 ASM 中添加了一个代码示例。我想避免使用括号两次!
  • @NicolásHertzulis 正如我在回答中解释的那样,没有办法避免这种情况。这就是装配的工作原理。第一次加载获取指针,第二次获取指向的数据。

标签: c assembly symbols extern dereference


【解决方案1】:

这就是变量的工作方式。符号的值(即它的地址)在运行时不能改变,这就是为什么符号通常解析为数据的地址而不是数据本身。由于malloc 返回的地址在链接时无法知道,因此无法获得您想要的确切行为。

如果您想避免处理包含指针的变量,请考虑在静态存储中创建一个数组。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-25
    • 1970-01-01
    相关资源
    最近更新 更多