3

我需要声明两个指向两个数组的全局 dword 指针。据我所知,全局意味着在 .data 中声明。那是对的吗?声明这些双字指针的代码是什么,以便在使用 NASM 和 Intel 语法的 x86 程序集中将它们初始化为 0?

4

1 回答 1

3

我需要声明两个指向两个数组的全局 dword 指针。

如果我理解正确,这很简单,假设它们对所有文件都意味着全局,创建一个名为pointers.asm或其他东西的文件并输入:

[section] .bss
        global _pointer1, _pointer2

        _pointer1   resd 4 ; reserve 4 dwords
        _pointer2   resd 4

我们使用一个.bss部分,因为该内存设置为零,所以当您使用它时,您的变量是0 initialized

或者,.data如果您愿意,您可以只使用一个部分并将每个元素初始化为零:

[section] .data
        global _pointer1, _pointer2

        _pointer1   dd 0,0,0,0
        _pointer2   dd 0,0,0,0

同样仍然使用一个.data部分,它可以像这样完成,允许您指定一个缓冲区的大小,就像该.bss部分一样:

[section] .data
    global _pointer1, _pointer2

    _pointer1 times 4 dd 0
    _pointer2 times 4 dd 0

无论您决定采用哪种方式,都可以使用指向在单独文件中全局声明的数组的指针:

[section] .text

        global _main
        extern _pointer1

        bytesize equ 4 ; dword = 4 bytes

_main:
        ; write each element of the array
        mov dword [_pointer1 + 0 * bytesize], 0xa
        mov dword [_pointer1 + 1 * bytesize], 0xb
        mov dword [_pointer1 + 2 * bytesize], 0xc
        mov dword [_pointer1 + 3 * bytesize], 0xd

        ; read each element of the array
        mov eax, [_pointer1 + 0 * bytesize]
        mov eax, [_pointer1 + 1 * bytesize]
        mov eax, [_pointer1 + 2 * bytesize]
        mov eax, [_pointer1 + 3 * bytesize]

        ret

这个主程序返回0xd13存储在 中eax,希望通过查看这个您可以了解发生了什么。

于 2015-04-14T06:30:39.550 回答