【问题标题】:How to declare a global dword pointer in x86?如何在 x86 中声明全局双字指针?
【发布时间】:2015-06-19 12:09:29
【问题描述】:

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

【问题讨论】:

  • @Z̷͙̗̻͖̣̹͉̫̬̪̖̤͆ͤ̓ͫͭ̀̐͜͞ͅͅαлγo。是的,我知道我可以谷歌它。但我似乎无法找到我正在寻找的答案。这就是我问这个问题的原因。是的,我知道这不仅仅是一个问题,但它们都适合。
  • 是的,但是 “dword 必然意味着什么?...当它是指针时它意味着什么?” 这些都可以通过 Google 和 StackOverflow 轻松获得。
  • @Z̷͙̗̻͖̣̹͉̫̬̪̖̤͆ͤ̓ͫͭ̀̐͜͞ͅͅαлγo。好的,那些可能是,但我在任何地方都找不到任何声明。我修改了问题。
  • @Thename'sBob.MSBob。如果您认为问题是重复的,请标记为重复,并提供指向先前提出的问题的链接。顺便说一句,这个名字非常非常烦人......

标签: pointers x86 global nasm dword


【解决方案1】:

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

如果我理解正确,这很简单,假设它们对所有文件都意味着全局,创建一个名为 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 中,希望通过查看这个你可以了解发生了什么。

【讨论】:

    猜你喜欢
    • 2019-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-17
    • 2017-10-22
    • 2021-08-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多