我需要声明两个指向两个数组的全局双字指针。据我所知,全局意味着在.data中声明。那是对的吗?声明这些双字指针的代码是什么,以便在使用NASM和Intel语法的x86程序集中初始化为0?
答案 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
此主程序返回时0xd
或13
存储在eax
中,希望通过查看此内容,您可以了解正在发生的事情。