如何在x86中声明全局双指针?

时间:2015-04-14 01:54:20

标签: pointers x86 global nasm dword

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

1 个答案:

答案 0 :(得分:2)

  

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

如果我理解正确,这很简单,假设它们对所有文件都是全局的,请创建一个名为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中,希望通过查看此内容,您可以了解正在发生的事情。