assembly - 将数组初始化为程序集中的特定值 (x86)

标签 assembly x86 nasm

我想用特定值初始化汇编中的数组。我首先尝试在循环中执行此操作,但数组中出现了垃圾。然后我尝试手动执行并得到相同的垃圾。我希望数组重复 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/

相关文章:

c - NASM 中执行循环失败

linux - 如何将 **long_options option <offset aHelp, 0, 0, 68h>** 翻译成重新汇编代码?

linux - 在 nasm 中指定起始地址?

c - 在 NASM 中打印更大的数字

assembly - 为什么 pop 在汇编中需要一个参数?

c++ - C++ 是否编译为程序集?

assembly - "push ebp"在 x86 汇编中意味着什么?

linux - 打印第二个命令行参数

assembly - 所有asm标签都成为可执行文件中的符号

c - 在 C 的程序集中使用标签