在装配中分配空间(插入功能)

时间:2012-11-29 18:44:13

标签: memory assembly sparc

我正在处理一个等同于插入函数的程序集,我想知道我是如何将列表元素空间化的,这样我就可以将数据放在那里。我找到了应该插入信息的正确地址,但是我对如何编写数据而不覆盖其中的内容感到困惑。我的想法是

    set givespace, %l1
    !Next part is at the bottom in data section
    .section ".data"
    givespace:
          .align 48

其中48是我元素的大小。这给了我一个错误无效的对齐边界。有什么想法吗?

1 个答案:

答案 0 :(得分:0)

如果我正确理解了这个问题,并且您需要为具有预定义大小的某些数据结构静态分配空间,则必须替换行

      .align 48

下一个

      times 48 db 0

这至少对NASM来说是真实的。在任何情况下,我都建议您查看汇编程序手册,以确保汇编编译器支持此构造。您的编译器极有可能支持与上例不完全相同的表示法,但无论如何它都支持某些类似的模拟。 'times'命令有下一个sintax:

    times <number of repeats> <body>

其中指定将主体插入到生成的代码中的次数,并包含一些标准的汇编指令。在上面的例子中,它是内存的字节分配,初始化为null。因此,例如,接下来的两个代码部分是相等的

     times 5 dd 012345678h

     dd 012345678h
     dd 012345678h
     dd 012345678h
     dd 012345678h
     dd 012345678h

.align指令对于内存空间分配不正确。它有另一个目的 - 将以下代码或数据块与一些预定义值对齐。例如,在这种情况下

    VAR1 db 0
    .align 48
    VAR2 db 0

如果VAR1的地址为0x1234,则编译器将插入44个未使用的字节,以确保VAR2的地址将被分配到48字节边界。在我们的例子中,它将是地址 - 0x1260(0x1260 = 0x62 * 30 + 0 )。如果说实话,编译器通常只允许对齐为2的幂的值,并且很可能在编译上面的示例汇编器时会出现错误,因为48不是2的幂。因此,很难控制.align指令将分配多少未使用的字节。它可以是从0到指令参数的任何值。此值将根据程序源代码中的更改进行更改。

但请注意!这是编译期间静态内存分配的一种方法!如果在运行时需要动态内存分配,则需要编写自己的内存或查找并采用某些第三方内存分配器。如果程序将在OS环境中运行,则可以使用OS API请求动态内存分配。 (例如WinAPI中的VirtualAlloc)。