поместить строку в стек

Тема в разделе "WASM.BEGINNERS", создана пользователем skyman1221, 29 дек 2011.

  1. skyman1221

    skyman1221 New Member

    Публикаций:
    0
    Регистрация:
    29 дек 2011
    Сообщения:
    24
    Снова здравствуйте,
    хочу заранее извинится если подобный вопрос уже поднимался на форуме
    к сожалению мои поиски по форуму не увенчались успехом

    Уверен, что для знатока masm вопрос простецкий

    Задача:
    написать макрос или процедуру которая:
    1. получает сроку
    2. выводит сроку в окно

    с выводом строки в окно все понятно
    не понятно где и как сохранять строку между получением
    и отправлением строки на вывод

    однако директивы .DATA и .DATA? при этом использовать нельзя

    пример

    Код (Text):
    1. trace macro mytext
    2.  
    3. ; тут полагается записать строку в память
    4. ; чтоб затем сослаться на эту ячейку памяти в DrawText
    5. ; но как ??
    6. invoke DrawText  … ; вывод строки
    7. endm
    хотел в стек записать

    Код (Text):
    1. ADD ESP,-100
    2. mov dword ptr [esp], 'тут любая строка '
    но больше dword в стек запихнуть не получается
    разрезать строку на dword’ы перспектива не улыбается

    какие есть выходы ?
     
  2. Phyber

    Phyber New Member

    Публикаций:
    0
    Регистрация:
    27 мар 2010
    Сообщения:
    96
    jmp @F
    lpszLine db 'some str', 0
    @@:
    push offset lpszLine
    call func



    делить строку на дворды тоже норм, только стек выравнять не забудте потом....
     
  3. Ursus

    Ursus Member

    Публикаций:
    0
    Регистрация:
    15 мар 2006
    Сообщения:
    238
    Адрес:
    Russia
    Дык тут строка будет не в стеке, а в секцыи кода. Ему надо было целиком строку в стек запихать, как я понял.
     
  4. Phyber

    Phyber New Member

    Публикаций:
    0
    Регистрация:
    27 мар 2010
    Сообщения:
    96
    дык
    Про кодовую секцию никто ничего не сказал.
     
  5. Ursus

    Ursus Member

    Публикаций:
    0
    Регистрация:
    15 мар 2006
    Сообщения:
    238
    Адрес:
    Russia
    Вот, например, код, который размещает в стеке строку "abcdef"

    Код (Text):
    1.     .686P
    2.     .XMM
    3.     .model  flat
    4.  
    5.  
    6. EXTRN   __imp__puts:PROC
    7. PUBLIC  _wmain
    8.  
    9. _TEXT   SEGMENT
    10. _temp$ = -8                     ; size = 7
    11. _argc$ = 8                      ; size = 4
    12. _argv$ = 12                     ; size = 4
    13. _wmain  PROC                        ; COMDAT
    14.  
    15.     push    ebp
    16.     mov ebp, esp
    17.     sub esp, 8
    18.  
    19.  
    20.     lea eax, DWORD PTR _temp$[ebp]
    21.     push    eax
    22.     mov DWORD PTR _temp$[ebp], 1684234849   ; 64636261H
    23.     mov WORD PTR _temp$[ebp+4], 26213       ; 00006665H
    24.     mov BYTE PTR _temp$[ebp+6], 0
    25.     call    DWORD PTR __imp__puts
    26.     add esp, 4
    27.  
    28.     xor eax, eax
    29.  
    30.     mov esp, ebp
    31.     pop ebp
    32.     ret 0
    33. _wmain  ENDP
    34. _TEXT   ENDS
    35. END
    На самом деле, это я сгенерил из сишного кода

    Код (Text):
    1. int _tmain(int argc, _TCHAR* argv[])
    2. {
    3.     char temp[] = { 'a', 'b', 'c', 'd', 'e', 'f', '\0' };
    4.  
    5.     puts(temp);
    6.     return 0;
    7. }
    но идея, я думаю, понятна.
     
  6. CyberManiac

    CyberManiac New Member

    Публикаций:
    0
    Регистрация:
    2 сен 2003
    Сообщения:
    2.473
    Адрес:
    Russia
    Вообще-то стек - такой же кусок памяти, как и все остальные. SUB ESP,256 - вот тебе 256 байт места на стеке. Единственное ограничение в том, что значение ESP надо держать выровненным на границу 4, чтобы чего не вышло. Ну и ещё стек как бы не резиновый, мегабайты туда швырять не рекомендуется.
     
  7. Blackbeam

    Blackbeam New Member

    Публикаций:
    0
    Регистрация:
    28 дек 2008
    Сообщения:
    960
    как-то возникла проблема: для обработки файла понадобилось сохранять и манипулировать несколькими блоками памяти

    не придумал ничего лучше буферов:

    pStr1 db 131072 dup (?)

    и т.д. несколько штук

    131072 байта маловато, однако если попытаться увеличивать размеры буферов, время компиляции начинало резко возрастать. что насторожило. ненормально это как-то.

    попытка выделить один бок памяти, разбить его на сектора и писать туда не удалась, похоже хрюша этого не разрешает. а может я что-то не так делал

    если у кого есть умные мысли по этому вопросу, буду благодарен
     
  8. AsmGuru62

    AsmGuru62 Member

    Публикаций:
    0
    Регистрация:
    12 сен 2002
    Сообщения:
    689
    Адрес:
    Toronto
    Blackbeam
    VirtualAlloc хорошо для выделения больших блоков.
    Чтобы писать в файл секторами надо три вещи:

    1. Файл открыть с флагом: FILE_FLAG_NO_BUFFERING
    2. Адрес буфера для WriteFile выровнять на границу сектора (512 байт обычно) - VirtualAlloc
    3. nBytesToWrite параметер для WriteFile кратно сектору: 512,1024, и т.п.

    Размер сектора получаем из: GetDiskFreeSpace.
     
  9. skyman1221

    skyman1221 New Member

    Публикаций:
    0
    Регистрация:
    29 дек 2011
    Сообщения:
    24
    всем спасибо за советы
    код Ursus натолкнул меня на мысль ипользывать сегменты

    получился вот такой код

    Код (Text):
    1. trace macro mytext, hdcv
    2.  
    3.     stack segment stack
    4.     frd  BYTE mytext,0
    5.     hdcq DWORD 00000000h
    6.     pscv PAINTSTRUCT <0,0,<>,0,0>
    7.     rectz RECT <0,0,0,0>
    8.     stack ends
    9.    
    10.     push eax
    11. invoke BeginPaint,hdcv, ADDR pscv
    12. mov hdcq,eax
    13. invoke GetClientRect,hdcv, ADDR rectz
    14. invoke SetTextColor, hdcq, 0
    15. invoke SetBkMode, hdcq, TRANSPARENT
    16. invoke DrawText, hdcq, ADDR frd,-1, ADDR rectz, DT_SINGLELINE or DT_BOTTOM
    17. invoke EndPaint,hdcv, ADDR pscv
    18.     pop eax
    19. endm
    получился не плохой отладочный макрос
    похожий на аналогичную функцию во flash

    работает в пределах функции обработки окна
    Код (Text):
    1. trace "привет мир", hWnd
    теперь за каждой мелочью OLLYDBG не надо будет запускать
     
  10. Fedor666

    Fedor666 Fedor

    Публикаций:
    0
    Регистрация:
    27 май 2009
    Сообщения:
    30
    Адрес:
    М.О., г.Королев
    Код (Text):
    1. MyProc      proc
    2. local       temp[1024]:byte
    3.         ...
    4. MyProc      endp
    А для макро есть опять же директива local и использовать .data и .data? очень даже можно!
     
  11. Blackbeam

    Blackbeam New Member

    Публикаций:
    0
    Регистрация:
    28 дек 2008
    Сообщения:
    960
    AsmGuru62 спасибо, про флаг не знал. попробую может получится
     
  12. skyman1221

    skyman1221 New Member

    Публикаций:
    0
    Регистрация:
    29 дек 2011
    Сообщения:
    24
    уважаемый Fedor666
    освободить место в стеке я знаю как
    я не знаю как записать туда строку если она не была заранее обьявленна в data и .data?

    вот как мне засунуть к примеру в стек строку больше 4 символов длинной исходя из ващей процедуры

    Код (Text):
    1. MyProc        proc
    2. local        temp[1024]:byte
    3. mov  DWORD PTR temp, "1234"  ; больше 4 символов не лезет
    4. MyProc        endp
     
  13. Blackbeam

    Blackbeam New Member

    Публикаций:
    0
    Регистрация:
    28 дек 2008
    Сообщения:
    960
    1.есть предел и извращениям

    2.стек не предназначен для....

    3. DWORD это и есть 4 байта


    4. путевые парни как правило всегда резервируют память например:

    buffer db 256 dup (?)

    который обычно на что-то пригождается, например запихнуть туда строку

    чполучить указатель на первый байт:

    lea eax,buffer

    вроде так
     
  14. CyberManiac

    CyberManiac New Member

    Публикаций:
    0
    Регистрация:
    2 сен 2003
    Сообщения:
    2.473
    Адрес:
    Russia
    Blackbeam
    Строки в 256 байт - это уже не модно. Даже MAXPATH нынче 512 символов, но и он с некоторых пор совсем не панацея.
     
  15. Dmitry_Milk

    Dmitry_Milk Member

    Публикаций:
    0
    Регистрация:
    20 ноя 2007
    Сообщения:
    535
    А еще можно так извратиться:
    Код (Text):
    1. someproc    proc
    2.         local lpstrStroka:DWORD
    3. ...
    4.         invoke  LocalAlloc,LMEM_FIXED,сколько_надо_в_байтах
    5.         mov lpstrStroka,eax
    6.         ...
    7.         invoke  SomeFunc,lpstrStroka
    8.         ...
    9.         invoke  LocalFree
    10. ...
    11. someproc    endp