В процессе кода по условию создаю буфер buf db 10 dup (?) ; для dwtoa , но не суть... После выполнения кода его можно уничтожить?
TOLSTOPUZ 1) В процессе кода - это как? Примерно, как в процессе кирпичной стены? 2) В процессе исполнения кода нельзя создать буфер buf db 10 dup (?). Этот буфер создаётся либо загрузчиком, либо компилятором. Зависит от того, как рассматривается вопрос. В любом случае освобождение памяти, содержащей этот буфер, хоть и возможно, но чревато. Причём степень чреватости зависит от того, что ещё находится в одной секции с этим буфером. P.S. Слегка опоздал.
TOLSTOPUZ можно, я делаю так Код (Text): sub esp,64; создаю временный буфер из 64 байт (обязательно кратно 4) mov ebp,esp; запоминаю указатель на временный буфер (можно ebp, ebx, edi или esi) push eax; число которое преобразую в hex-формат функцией wsprintf call @f db 'eax=%Xh',0 ;передаю формат @@: push ebp;передаю указатель на временный буфер call _imp__wsprintfA push MB_OK call @f db "MessageBox",0;заголовок MsgBox'а @@: push ebp;указатель на временный буфер push 0 call _imp__MessageBoxA@16; вывожу значение в eax на экран add esp,64+12; выравниваю стек после wsprintf и удаляю временный буфер
Может я не так выразился... Я имел ввиду по условию... Вроде этого. .code ................... cmp eax , 0 jne @F .data buf db 10 dup (?) .code invoke dwtoa , addr buf ....................... @@ Т.е. буфер я создаю. Но после использования его наличие меня раздражает. Вот я и спросил, можно ли его уничтожить? P.S. Ага... Буфер с константой dup создаётся в любом случае, да? А можно сделать чтобы... Ну, только если условие вынуждает?
TOLSTOPUZ Код (Text): cmp eax , 0 jne @F .data buf db 10 dup (?) супер !!! совет один - учить матчасть, разобраться что такое сегмент данных и понять что db в него попадают на этапе компиляции, а не в процессе работы программы для создания временных буферов см. совет Mikl___, токо он там лишного намудрил и недзенный call вместо push + jmp приплёл, но это мелочи - ключевые слова: Код (Text): sub esp,64; создаю временный буфер из 64 байт (обязательно кратно 4) mov ebp,esp; запоминаю указатель на временный буфер (можно ebp, ebx, edi или esi) ... add esp,64+12; выравниваю стек после wsprintf и удаляю временный буфер
TOLSTOPUZ +1 к тому, что сказал Y_Mur. Единственное что... ... лучше сразу разбираться с секциями PE, чем сегментами данных. А то потом трудно будет понять, причём же всё таки были эти самые сегменты данных (кстати, ИМХО не причём).
по-подробнее пожалуйста, я записываю а как коротко (в байтах) втолкнуть в стек содержимое строки и указатель на неё? push <'abc',0> / push esp ?
Mikl___ call без ret нарушает работу предсказателя адресов возврата и на больших уровнях вложенности это уакнется тормозами всей вышестощей цепочки ret а хочешь краткости - вынеси db из исполнимой части кода не обязательно даже в сегмент данных
Mikl___ Дзенно и коротко - не всегда одно и то же. В точку. Для коротких строк сам так иногда делаю. ИМХО неплохой метод скрыть строки в коде. Благо fasm позволяет (про masm не в курсе). А если учесть, что младший байт по младшему адресу, то можно и нуль не писать: push 'ing' push ' str' push 'tack' push 'My s' push esp
С памятью у меня вообще напряжённые отношения. Активно друг друга не любим. Выделяю память: invoke VirtualAlloc, 0 , 10*1024*1024, MEM_RELEAS+MEM_TOPDOWN короче mov memaddr, eax invoke VirtualAlloc , memaddr , 64*1024, мем_коммит короче всё это работает только до какого-то предела. (В размере). Стоит поместить в эту память больше чем скажем 5 kb, какая-то непонятка перезаписывает некоторые байты в этом участке. и нет никакой возможности защитить этот участок кода. Почему такая фигня и что может перезаписать участок памяти. ставил даже NO_ACCESS но ноль эмоций. И переписывает не чем попало, а всякими db-строками из этой же программы. Вот если бы отойти от начала моей программы подальше. Но я не знаю, как можно узнать начальный адрес моей программы в памяти. Где это прячется?
Так ты же указал начальный адрес memaddr VirtualAlloc(<начальный адрес>,<размер в байтах>,<флаги>); Указывай 0 и всё будет в порядке.
Ааааааааа..... Попробую щас... Хотя вроде бы в своих статьях Y_MUR рекомендует резервировать память с начальным адресом ноль (типа система сама подберёт) а уже реально выделять VirtualAlloc , memaddr , и т.д. Наверное я что-то не так понял. щас попробую. Хорошо бы....
TOLSTOPUZ Можно и сразу MEM_COMMIT с нулевым адресом - система сама подберёт Резервировать адресное пространство нужно если ты "резиновый буфер" делаешь или свой менеджер блоков памяти Просто похоже ты напутал флаги как уже отметил Great И что-то мне подсказывает, что для твоей задачи HeapAlloc лучше будет А если буфер <4кБ и совсем временный (чуть-чуть попользовался и на выброс) то его имхо лучше в стеке как у Mikl___