我正在处理一个等同于插入函数的程序集,我想知道我是如何将列表元素空间化的,这样我就可以将数据放在那里。我找到了应该插入信息的正确地址,但是我对如何编写数据而不覆盖其中的内容感到困惑。我的想法是
set givespace, %l1
!Next part is at the bottom in data section
.section ".data"
givespace:
.align 48
其中48是我元素的大小。这给了我一个错误无效的对齐边界。有什么想法吗?
答案 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)。