我需要声明两个指向两个数组的全局 dword 指针。据我所知,全局意味着在 .data 中声明。那是对的吗?声明这些双字指针的代码是什么,以便在使用 NASM 和 Intel 语法的 x86 程序集中将它们初始化为 0?
问问题
1086 次
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
这个主程序返回0xd
或13
存储在 中eax
,希望通过查看这个您可以了解发生了什么。
于 2015-04-14T06:30:39.550 回答