2015-04-14 2 views
1

Мне нужно объявить два глобальных указателя слова, указывающих на два массива. Насколько мне известно, глобальные средства объявляются в .data. Это верно? Что такое код для объявления этих указателей dword, чтобы они были инициализированы на 0 в сборке x86 с использованием синтаксиса NASM и Intel?Как объявить глобальный указатель слова в x86?

+0

@ Z̷͙̗̻͖̣̹͉̫̬̪̖̤͆ͤ̓ͫͭ̐͜͞αлγo. Да, я знаю, что могу это сделать Google. Но я не могу найти ответ, который я ищу. Вот почему я задал вопрос. И да, я знаю, что речь идет не только о одном вопросе, но все они подходят друг другу. – CarrotSlat

+0

Да, но * «Что означает слово dword? ... Что это значит, когда его указатель?» * Они оба доступны как для Google, так и для StackOverflow. –

+0

@ Z̷͙̗̻͖̣̹͉̫̬̪̖̤͆ͤ̓ͫͭ̐͜͞αлγo. Хорошо, это может быть, но я не могу найти никаких объявлений нигде. Я изменил вопрос. – CarrotSlat

ответ

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 

Это основная программа возвращается с 0xd или 13, хранящегося в eax, надеюсь, посмотрев на это, вы сможете понять, что происходит.

Смежные вопросы