【发布时间】:2023-03-08 01:20:01
【问题描述】:
我想用特定的值在程序集中初始化一个数组。我首先尝试在循环中执行此操作,但在数组中出现了垃圾。然后我尝试手动操作并得到相同的垃圾。我希望数组重复 0 1 2 n 次。这是我尝试过的一些示例代码。
这是我手动加载数组的尝试。第一个值加载得很好。然而,当我在 GDB 中检查第二个值时,它会加载到垃圾中。
sub esp, 260
mov [ebp - 12], dword -1
mov [ebp - 16], byte 0
mov [ebp - 17], byte 1
mov [ebp - 18], byte 2
mov [ebp - 19], byte 0
mov [ebp - 20], byte 1
mov [ebp - 21], byte 2
mov [ebp - 22], byte 0
mov [ebp - 23], byte 1
mov [ebp - 24], byte 2
mov [ebp - 25], byte 0
这是我自动进行的尝试。
sub esp, 260
mov [ebp - 12], dword -1
again:
add [ebp - 12], dword 1
lea eax, [ebp - 16]
sub eax, [ebp - 12]
mov [eax], byte 0
add [ebp - 12], dword 1
lea eax, [ebp - 16]
sub eax, [ebp - 12]
mov [eax], byte 1
add [ebp - 12], dword 1
lea eax, [ebp - 16]
sub eax, [ebp - 12]
mov [eax], byte 2
cmp [ebp - 12], dword 255
jne again
jmp elsewhere
使用 NASM、x86-32、Intel 语法。
编辑:当我将此代码转换为将数组值存储为 DWORD 而不是字节时,这两种方法都有效。这是为什么?
【问题讨论】:
-
小贴士:用 C 语言编写您想要执行的操作并将编译器设置为输出程序集,查看编译器生成的内容并根据您的需要进行调整。
-
它做的事情与我的手动方式非常相似。我会尝试模仿它的作用,但我看不出我的有什么不同。
-
我无法逐行复制装配线,因为它由于某种原因无法编译。但无论如何我都会得到同样的垃圾。编辑当我将其转换为存储双字而不是字节时,它可以工作。这是为什么呢?
-
为了消除混淆,我假设您的问题是如何初始化分配在堆栈上的数组?