Снова здравствуйте, хочу заранее извинится если подобный вопрос уже поднимался на форуме к сожалению мои поиски по форуму не увенчались успехом Уверен, что для знатока masm вопрос простецкий Задача: написать макрос или процедуру которая: 1. получает сроку 2. выводит сроку в окно с выводом строки в окно все понятно не понятно где и как сохранять строку между получением и отправлением строки на вывод однако директивы .DATA и .DATA? при этом использовать нельзя пример Code (Text): trace macro mytext ; тут полагается записать строку в память ; чтоб затем сослаться на эту ячейку памяти в DrawText ; но как ?? … invoke DrawText … ; вывод строки … endm хотел в стек записать Code (Text): ADD ESP,-100 mov dword ptr [esp], 'тут любая строка ' но больше dword в стек запихнуть не получается разрезать строку на dword’ы перспектива не улыбается какие есть выходы ?
jmp @F lpszLine db 'some str', 0 @@: push offset lpszLine call func делить строку на дворды тоже норм, только стек выравнять не забудте потом....
Дык тут строка будет не в стеке, а в секцыи кода. Ему надо было целиком строку в стек запихать, как я понял.
Вот, например, код, который размещает в стеке строку "abcdef" Code (Text): .686P .XMM .model flat EXTRN __imp__puts:PROC PUBLIC _wmain _TEXT SEGMENT _temp$ = -8 ; size = 7 _argc$ = 8 ; size = 4 _argv$ = 12 ; size = 4 _wmain PROC ; COMDAT push ebp mov ebp, esp sub esp, 8 lea eax, DWORD PTR _temp$[ebp] push eax mov DWORD PTR _temp$[ebp], 1684234849 ; 64636261H mov WORD PTR _temp$[ebp+4], 26213 ; 00006665H mov BYTE PTR _temp$[ebp+6], 0 call DWORD PTR __imp__puts add esp, 4 xor eax, eax mov esp, ebp pop ebp ret 0 _wmain ENDP _TEXT ENDS END На самом деле, это я сгенерил из сишного кода Code (Text): int _tmain(int argc, _TCHAR* argv[]) { char temp[] = { 'a', 'b', 'c', 'd', 'e', 'f', '\0' }; puts(temp); return 0; } но идея, я думаю, понятна.
Вообще-то стек - такой же кусок памяти, как и все остальные. SUB ESP,256 - вот тебе 256 байт места на стеке. Единственное ограничение в том, что значение ESP надо держать выровненным на границу 4, чтобы чего не вышло. Ну и ещё стек как бы не резиновый, мегабайты туда швырять не рекомендуется.
как-то возникла проблема: для обработки файла понадобилось сохранять и манипулировать несколькими блоками памяти не придумал ничего лучше буферов: pStr1 db 131072 dup (?) и т.д. несколько штук 131072 байта маловато, однако если попытаться увеличивать размеры буферов, время компиляции начинало резко возрастать. что насторожило. ненормально это как-то. попытка выделить один бок памяти, разбить его на сектора и писать туда не удалась, похоже хрюша этого не разрешает. а может я что-то не так делал если у кого есть умные мысли по этому вопросу, буду благодарен
Blackbeam VirtualAlloc хорошо для выделения больших блоков. Чтобы писать в файл секторами надо три вещи: 1. Файл открыть с флагом: FILE_FLAG_NO_BUFFERING 2. Адрес буфера для WriteFile выровнять на границу сектора (512 байт обычно) - VirtualAlloc 3. nBytesToWrite параметер для WriteFile кратно сектору: 512,1024, и т.п. Размер сектора получаем из: GetDiskFreeSpace.
всем спасибо за советы код Ursus натолкнул меня на мысль ипользывать сегменты получился вот такой код Code (Text): trace macro mytext, hdcv stack segment stack frd BYTE mytext,0 hdcq DWORD 00000000h pscv PAINTSTRUCT <0,0,<>,0,0> rectz RECT <0,0,0,0> stack ends push eax invoke BeginPaint,hdcv, ADDR pscv mov hdcq,eax invoke GetClientRect,hdcv, ADDR rectz invoke SetTextColor, hdcq, 0 invoke SetBkMode, hdcq, TRANSPARENT invoke DrawText, hdcq, ADDR frd,-1, ADDR rectz, DT_SINGLELINE or DT_BOTTOM invoke EndPaint,hdcv, ADDR pscv pop eax endm получился не плохой отладочный макрос похожий на аналогичную функцию во flash работает в пределах функции обработки окна Code (Text): trace "привет мир", hWnd теперь за каждой мелочью OLLYDBG не надо будет запускать
Code (Text): MyProc proc local temp[1024]:byte ... MyProc endp А для макро есть опять же директива local и использовать .data и .data? очень даже можно!
уважаемый Fedor666 освободить место в стеке я знаю как я не знаю как записать туда строку если она не была заранее обьявленна в data и .data? вот как мне засунуть к примеру в стек строку больше 4 символов длинной исходя из ващей процедуры Code (Text): MyProc proc local temp[1024]:byte mov DWORD PTR temp, "1234" ; больше 4 символов не лезет MyProc endp
1.есть предел и извращениям 2.стек не предназначен для.... 3. DWORD это и есть 4 байта 4. путевые парни как правило всегда резервируют память например: buffer db 256 dup (?) который обычно на что-то пригождается, например запихнуть туда строку чполучить указатель на первый байт: lea eax,buffer вроде так
Blackbeam Строки в 256 байт - это уже не модно. Даже MAXPATH нынче 512 символов, но и он с некоторых пор совсем не панацея.
А еще можно так извратиться: Code (Text): someproc proc local lpstrStroka:DWORD ... invoke LocalAlloc,LMEM_FIXED,сколько_надо_в_байтах mov lpstrStroka,eax ... invoke SomeFunc,lpstrStroka ... invoke LocalFree ... someproc endp