我想用特定值初始化汇编中的数组。我首先尝试在循环中执行此操作,但数组中出现了垃圾。然后我尝试手动执行并得到相同的垃圾。我希望数组重复 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 而不是字节时,两种方法都有效。这是为什么?
最佳答案
借助 NASM,您可以使用 times
前缀轻松初始化重复数据。例如,要按照问题中的要求重复序列“0 1 2”n 次,您可以执行类似于以下操作的操作:
section .data
my_array: times n db 0, 1, 2
只需将 n
替换为您想要的常量值即可。有关 times
前缀的更多信息可以在 NASM Manual 中找到。 .
关于assembly - 将数组初始化为程序集中的特定值 (x86),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43430805/