Форум программистов, компьютерный форум, киберфорум
Assembler, MASM, TASM
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.82/11: Рейтинг темы: голосов - 11, средняя оценка - 4.82
0 / 0 / 0
Регистрация: 20.02.2011
Сообщений: 10

Область видимости и работа с памятью

20.02.2011, 09:42. Показов 2347. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Вопрос касается работы с переменными в ассемблере. а именно области видимости и работы с памятью.

Если я объявлю переменную в какойнибудь процедуре, то есть

myProc:
...
myVar dw 512 dup(0)
mov eax, myVar
...
ret

_main:
call myProc
;будет ли тут доступна переменная myVar по своему имени (упоминанию метки myVar)?
;если не будет (т.е. она создавалась локальна и область видимости была только функция), то будет ли очищена (освобождена) память, выделенная в myProc?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
20.02.2011, 09:42
Ответы с готовыми решениями:

Работа с таблицами, область видимости
Привет. Не могу понять как работать с БД после выгрузки. соединяюсь с БД, делаю выгрузку и тд тп Теперь у меня есть DataReader с нужными...

Область видимости
Объясните с чем связана такая область видимости локальных переменных <?php $a = 5; function foo() { echo $a; } foo(); ...

Область видимости
Всем привет! С приходом ES6 в JS в полной мере заработала блочная область видимость и вот буквально на днях задался таким вопросом: const...

5
2014 / 1286 / 61
Регистрация: 05.06.2010
Сообщений: 2,213
20.02.2011, 10:44
Цитата Сообщение от bkmltahfyc Посмотреть сообщение
myProc:
...
myVar dw 512 dup(0)
mov eax, myVar
...
ret
не совсем корректный код. Данные нельзя смешивать с кодом, они будут распознаваться как команды, надо размещать так, чтобы на них не передавалось управление, например после ret.

Цитата Сообщение от bkmltahfyc Посмотреть сообщение
;будет ли тут доступна переменная myVar по своему имени (упоминанию метки myVar)?
да, она будет доступна, это не локальная переменная, для создания локальных переменных резервируется место в стеке.

Цитата Сообщение от bkmltahfyc Посмотреть сообщение
то будет ли очищена (освобождена) память, выделенная в myProc?
память будет освобождена после выхода из программы и удаления сегмента из памяти.
Все сказанное выше - для сегментной модели памяти(дос)
0
0 / 0 / 0
Регистрация: 20.02.2011
Сообщений: 10
20.02.2011, 11:27  [ТС]
спасибо за ответ!
только возникает такой вопрос: как сделать "аналог" new в ассемблере?
допустим у меня описана структура (переменные должны быть в секции .data или .rodata, а структуры где описываются?):
mas struc
size dw ?
pmas dw ?; pointer on mas
mas ends

и макрос создания экземпляра
выделяет память под массив из masSize элементов и записывает в register начало массива (структуры)

newmas macro register, masSize;
tmp dw masSize dup (0); //(*)
tmpMas mas <masSize, tmp>
push tmpMas; как я понимаю запишет адрес начала структуры в стек
pop register
endm

как я понял из ответа, объявить так (строчка (*)) переменную в коде нельзя
а как тогда? я предполагаю, что только через стек. где-то так?:

newmas2 macro register, masSize;
push esp
pop regiter
push dw masSize;
;тут я пытаюсь сказать, что засовываю в стек слово. так это делается?
sub esp, masSize + 1; стек растёт вниз и здесь я резервирую массив
endm

два дополнительных вопроса
1) как изменить программу или что сделать вообще, чтоб я спокойно использовал эту часть стека как мою объявленную струтуру-массив?
2) если б я делал это не макросом, а меткой и вызывал бы с помощью оператора CALL, то в стек бы передавался бы ещё адрес возврата. то чтобы правильно со стеком проработать выше описанные операции надо было бы сохранить адрес возврата и в конце подпрограммы (после выделения памяти в стеке под массив) пушнуть его в стек?
Заранее спасибо.
0
4190 / 1838 / 221
Регистрация: 06.10.2010
Сообщений: 4,124
20.02.2011, 15:39
как сделать "аналог" new в ассемблере?
Так же как и везде - использовать функции ОС. Для windows - VirtualAlloc, для DOS - функция 48h прерывания 21h.
0
0 / 0 / 0
Регистрация: 20.02.2011
Сообщений: 10
20.02.2011, 18:23  [ТС]
Так же как и везде - использовать функции ОС. Для windows - VirtualAlloc, для DOS - функция 48h прерывания 21h.
Спасибо, но:
1. а можно так как я сделал через стек?
2. ну а главное, не могли бы Вы написать для примера как это сделать ("использовать функции ОС. Для windows - VirtualAlloc"), тк это ответит и на другие вопросы (переменные должны быть в секции .data или .rodata, а структуры где описываются? если вызов функции VirtualAlloc заменит строчку (*) в моём предыдущем сообщении, то тогда остаются "два дополнительных вопроса: 1) как сделать так, чтоб я спокойно использовал эту выделенную часть памяти мою объявленную струтуру-массив? 2) если б я делал это не макросом, а меткой (и через стек) и вызывал бы с помощью оператора CALL, то в стек бы передавался бы ещё адрес возврата. то чтобы правильно со стеком проработать выше описанные операции надо было бы сохранить адрес возврата и в конце подпрограммы (после выделения памяти в стеке под массив) пушнуть его в стек?",...)
0
4190 / 1838 / 221
Регистрация: 06.10.2010
Сообщений: 4,124
21.02.2011, 16:13
Вот пример с функцией, структурой и VirtualAlloc
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
.486
.model flat, stdcall
option casemap:none
include ..\include\windows.inc
include ..\include\kernel32.inc
include ..\include\user32.inc
includelib ..\lib\user32.lib
includelib ..\lib\kernel32.lib
 
.data
mas struc
  _size dd ?
  pmas  dd ?
mas ends
 
.code
start:
  call   func
  invoke ExitProcess,0
 
func:
  assume ebp:ptr mas
  lea    ebp,[esp-sizeof(mas)]
  invoke VirtualAlloc,0,256,MEM_COMMIT,PAGE_READWRITE ;выделяем память
  mov    [[ebp]._size],256
  mov    [[ebp].pmas],eax
 
  ;здесь работаем с массивом
 
  invoke VirtualFree,[[ebp].pmas],256,MEM_DECOMMIT ;освобождаем память
ret
 
end start
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
21.02.2011, 16:13
Помогаю со студенческими работами здесь

Область видимости
Здравствуйте, помогите решить задачу, пожалуйста имеем такой код: for(var i in scrolling){ ...

Область видимости в С++
В книге С++ Бархатный путь. ( http://khpi-iip.mipk.kharkiv.edu/library/extent/prog/cppvw/cpp_047.html) сказано, что область действия имен...

Область видимости
есть некий код: class test(object): import test2 def __init__(self): self.value = 10 test2.py

Область видимости
Дня два назад меня дёрнуло наконец понять что из себя представляет до - диез. Начал я с банальной вещи - квадратное уравнение. ...

Область видимости
Даю фрагмент программы: #include &lt;iostream&gt; #include &lt;stdio.h&gt; #include &lt;cmath&gt; struct elem //тип элемента двусвязного списка ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru