Сам себе Iczelion

Тема в разделе "WASM.BEGINNERS", создана пользователем Mikl_, 11 май 2007.

Метки:
  1. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.203
    Y_Mur
    #193: Ваш вариант можно немного подправить, если использовать
    %~dpn1.asm, %~dpn1.obj и т.д. почитайте об этом в help к команде for. Это же действует и на параметры bat файлов
     
  2. heed

    heed New Member

    Публикаций:
    0
    Регистрация:
    16 авг 2009
    Сообщения:
    21
    Незнаю как с остальными компиляторами ,) с фасм самое то что нужно , непонятный слишком синтаксис.
    только Авира антивирь ругается если не делать секцию .data и эвристическая проверка хотябы на среднем уровне включена.

    Если можно напишите пожалуйста самый простейший пример как может на fasm выглядеть
    Например в masm есть такой файл
    masm32\m32lib\readdisk.asm
    там функция
    Код (Text):
    1. read_disk_file proc lpfname:DWORD,lpMem:DWORD,lpLen:DWORD
    2.  
    3. comment * -----------------------------------------------------
    4.         the return value is zero on error else non-zero
    5.  
    6.         lpMem has the memory address written to it
    7.         lpLen has the file length written to it
    8.  
    9.         the memory address written to lpMem must be
    10.         deallocated using GlobalFree()
    11.         ----------------------------------------------------- *
    12.     LOCAL hFile :DWORD
    13.     LOCAL fl    :DWORD
    14.     LOCAL hMem  :DWORD
    15.     LOCAL bRead :DWORD
    16.  
    17.     mov hFile, FUNC(CreateFile,lpfname,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,NULL,NULL)
    18.     cmp hFile, INVALID_HANDLE_VALUE
    19.     jne @F
    20.     xor eax, eax                                    ; return zero on error
    21.     ret
    22.   @@:
    23.     mov fl, FUNC(GetFileSize,hFile,NULL)            ; get the file length
    24.     add fl, 32                                      ; add some spare bytes
    25.     mov hMem, alloc(fl)                             ; allocate a buffer of that size
    26.     invoke ReadFile,hFile,hMem,fl,ADDR bRead,NULL   ; read file into buffer
    27.     invoke CloseHandle,hFile                        ; close the handle
    28.  
    29.     mov eax, lpMem                                  ; write memory address to
    30.     mov ecx, hMem                                   ; address of variable
    31.     mov [eax], ecx                                  ; passed on the stack
    32.  
    33.     mov eax, lpLen                                  ; write byte count to
    34.     mov ecx, bRead                                  ; address of variable
    35.     mov [eax], ecx                                  ; passed on the stack
    36.  
    37.     mov eax, 1                                      ; non zero value returned on success
    38.     ret
    39.  
    40. read_disk_file endp
    Всё понятно до CloseHandle
    дальше вообще не пойму , для чего в masm квадратные скобки, и что происходит с параметрами

    например: mov [eax], ecx ;passed on the stack
    это как будет на fasm ?
     
  3. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.797
    heed
    как может на fasm выглядеть например такой файл masm32\m32lib\readdisk.asm
    Код (Text):
    1. format PE GUI
    2. include 'win32ax.inc'
    3. ; import data in the same section
    4. lpLen   equ ebp+10h
    5. lpMem   equ ebp+0Ch
    6. lpfname equ ebp+8
    7. hFile   equ ebp-4
    8. fl      equ ebp-8
    9. hMem    equ ebp-0Ch
    10. bRead   equ ebp-10h
    11. ;---------------------------
    12.         push ebp
    13.         mov ebp,esp
    14.         add esp,-10h
    15.     invoke CreateFile,dword[lpfname],GENERIC_READ,FILE_SHARE_READ,0,OPEN_EXISTING,0,0
    16.     mov [hFile], eax
    17.     cmp dword[hFile], INVALID_HANDLE_VALUE
    18.     jne @F
    19.     xor eax, eax                                    ; return zero on error
    20.         leave
    21.     retn 0Ch
    22.   @@: invoke GetFileSize,dword[hFile],0
    23.     mov [fl],eax       ; get the file length
    24.     add dword[fl],32                                      ; add some spare bytes
    25.     invoke GlobalAlloc,40h,dword[fl]
    26.     mov [hMem],eax                             ; allocate a buffer of that size
    27.     lea eax,[bRead]
    28.     invoke ReadFile,dword[hFile],dword[hMem],dword[fl],eax,0   ; read file into buffer
    29.     invoke CloseHandle,dword[hFile]                        ; close the handle
    30.     mov eax,[lpMem]                                  ; write memory address to
    31.     mov ecx,[hMem]                                   ; address of variable
    32.     mov [eax], ecx                                  ; passed on the stack
    33.     mov eax,[lpLen]                                  ; write byte count to
    34.     mov ecx,[bRead]                                  ; address of variable
    35.     mov [eax],ecx                                  ; passed on the stack
    36.     mov eax, 1                                      ; non zero value returned on success
    37.         leave
    38.     retn 0Ch
    39. ;---------------------------------------------------------------------
    40. data import
    41.  
    42.  library kernel32,'KERNEL32.DLL'
    43.  import kernel32,\
    44.         CreateFile,'CreateFileA',\
    45.         GetFileSize,'GetFileSize',\
    46.         GlobalAlloc,'GlobalAlloc',\
    47.         ReadFile,'ReadFile',\
    48.         CloseHandle,'CloseHandle'
    49.  
    50. end data
     
  4. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.797
    heed
    А это то же самое с оптимизацией
    Код (Text):
    1. push ebp
    2.     mov ebp,esp
    3.     add esp,-10h
    4.     xor ebx,ebx
    5.     invoke CreateFile,dword[lpfname],GENERIC_READ,FILE_SHARE_READ,ebx,OPEN_EXISTING,ebx,ebx
    6.     inc eax; if eax==INVALID_HANDLE_VALUE then eax+1==0
    7.     je @F    ; return zero in eax on error
    8.     dec eax
    9.     mov [hFile],eax
    10.     invoke GetFileSize,eax,ebx
    11.     add eax,32         ; add some spare bytes
    12.     mov [fl],eax       ; get the file length
    13.     invoke GlobalAlloc,GMEM_FIXED or GMEM_ZEROINIT,eax
    14.     mov [hMem],eax                             ; allocate a buffer of that size
    15.     lea ecx,[bRead]
    16.     invoke ReadFile,dword[hFile],eax,dword[fl],ecx,ebx   ; read file into buffer
    17.     invoke CloseHandle,dword[hFile]                        ; close the handle
    18.     mov eax,[lpMem]                                  ; write memory address to
    19.     mov ecx,[hMem]                                   ; address of variable
    20.     mov [eax], ecx                                  ; passed on the stack
    21.     mov eax,[lpLen]                                  ; write byte count to
    22.     mov ecx,[bRead]                                  ; address of variable
    23.     mov [eax],ecx                                  ; passed on the stack
    24.     mov eax, 1                                      ; non zero value returned on success
    25. @@: leave
    26.     retn 0Ch
     
  5. shoo

    shoo New Member

    Публикаций:
    0
    Регистрация:
    17 июл 2003
    Сообщения:
    1.537
    Адрес:
    Ukraine
    точно так же, основная разница между фасмом и масмом при работе с символическими именами переменных
     
  6. Plis

    Plis New Member

    Публикаций:
    0
    Регистрация:
    2 июн 2008
    Сообщения:
    26
    Mikl___ - Все демонстрационные файлы не открываются. В процессах появляются названия , а окно не создаётся. Установил XP на VMware - всё работает на чистой системе.
    Что может мешать на основной?
    Антивирусы - Avast и Outpost.
    На виртуалке установил Outpost - всё работает значит дело не в нём.
    Где косяк?
     
  7. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.797
    Plis
    Писалось и проверялось под WinXP HomeEdition, SP1, SP2, SP3, вероятно не работает из-за экспериментов с PE-заголовком: align=4 и массив директорий (IMAGE_OPTIONAL_HEADER.DataDirectory) состоит из не 16 элементов, а из 4 или 2 хотя есть уроки Iczeliona написанные на FASM, GoAsm и NASM (с #110 по #118) и там с заголовками не эксперименировал, попробуй их
     
  8. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.797
    Plis
    Да, забыл, там еще DOS-stub 4 байта, еще было в #156
     
  9. Plis

    Plis New Member

    Публикаций:
    0
    Регистрация:
    2 июн 2008
    Сообщения:
    26
    Mikl___
    На эмуляторе XP SP2, на основной системе XP SP3 - устанавливались с одного диска.
    На эмуляторе работают все примеры и с экспериментами, и без экспериментов над PE-заголовком.
    На основной работает только первый урок, с MessageBox. Остальные - окно не рисуется.
     
  10. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.797
    Plis
    Возможно из за смешения кода и данных link /MERGE:.data=.text
    Если начиная с 3 урока там везде WNDCLASSA вместо WNDCLASSEXA и предварительное заполнение WNDCLASS
    Код (Text):
    1. style           dd CS_HREDRAW or CS_VREDRAW; Стиль нашего окна
    2.     lpfnWndProc     dd OFFSET WndProc;Адрес процедуры обработки событий
    3.     cbClsExtra      dd 0        ;это нам пока не нужно
    4.     cbWndExtra      dd 0        ;и это тоже
    5.     hInstance       dd 400000h  ;Адрес нашей проги в памяти (Windows всегда её грузит по этому адресу)
    6.     hIcon           dd 10003h   ;Иконка окна по умолчанию
    7.     hCursor         dd 10011h   ;Курсор окна по умолчанию (здесь указан ID обычной стрелки)
    8.     hbrBackground   dd COLOR_WINDOW ;Фон нашего окна
    9.     lpszMenuName    dd 0        ;Меню у нас отсутствует
    10.     lpszClassName   dd OFFSET szWinClass; Указатель на имя нашего класса
    возможно основной системе с XP SP3 (хотя у меня тоже SP3) не нравится 400000h, 10003h, 10011h?
    Может быть при старте приложения в EAX не ноль? Тогда замените xchg ebx,eax на xor ebx,ebx
    Возможно что для CreateWindow название класса окна не нравится - я использую под название класса заголовок окна
    Возможно не нравится отсутствие ShowWindow и UpdateWindow но, добавление к стилю окна стиля WS_VISIBLE делало ненужным у меня и ShowWindow, и UpdateWindow
     
  11. Plis

    Plis New Member

    Публикаций:
    0
    Регистрация:
    2 июн 2008
    Сообщения:
    26
    Mikl___
    Взгляни, я просто скопировал ( заменил из твоего примера Iczelion-овские строки ), или так не пойдёт, нужно всё заменять?
    2.imp файл создал с помощью программы scan, которую посоветовал kero.
     
  12. Plis

    Plis New Member

    Публикаций:
    0
    Регистрация:
    2 июн 2008
    Сообщения:
    26
    Код (Text):
    1. .386
    2. .model flat,stdcall
    3. option casemap:none
    4.  
    5. include H:\masm32\include\windows.inc
    6. ;nclude H:\masm32\include\user32.inc
    7. includelib H:\masm32\lib\user32.lib ; calls to functions in user32.lib and kernel32.lib
    8. ;include H:\masm32\include\kernel32.inc
    9. includelib H:\masm32\lib\kernel32.lib
    10.  
    11. include 2.imp
    12.  
    13. WinMain proto :DWORD,:DWORD,:DWORD,:DWORD
    14.  
    15. ;extern _imp__DefWindowProcA@16:dword;стандартная обработка сообщения     /
    16. ;extern _imp__DispatchMessageA@4:dword;отправка сообщения                /
    17. ;extern _imp__GetMessageA@16:dword;получение сообщения                    /
    18. ;extern _imp__LoadCursorA@8:dword;получить указатель на ресурс курсора   /
    19. ;extern _imp__PostQuitMessage@4:dword;выход из программы                 /
    20. extern _imp__RegisterClassA@4:dword;регистрация класса окна             /
    21. ;extern _imp__MessageBoxA@16:dword
    22. ;extern _imp__IsDialogMessageA@8:dword
    23. ;extern _imp__SetDlgItemTextA@12:dword
    24. ;extern _imp__TranslateMessage@4:dword
    25. ;extern _imp__CreateDialogParamA@20:dword
    26. ;extern _imp__SendMessageA@16:dword
    27. ;extern _imp__GetDlgItemTextA@16:dword
    28. ;extern _imp__CreateWindowExA@48:dword
    29.  
    30. .DATA                           ; initialized data
    31.  
    32. ClassName db "SimpleWinClass",0 ; Имя нашего класса окна
    33. AppName db "Our First Window",0 ; Имя нашего окна
    34.  
    35. cbSize      dd SIZEOF WNDCLASSA
    36.     style           dd CS_HREDRAW or CS_VREDRAW; Стиль нашего окна
    37.     lpfnWndProc     dd offset WndProc;Адрес процедуры обработки событий
    38.     cbClsExtra      dd 0        ;Эта хрень нам не нужна
    39.     cbWndExtra      dd 0        ;и эта тоже
    40.     hInstance       dd 400000h  ;Адрес нашей проги в памяти (Windows всегда её грузит по этому адресу)
    41.     hIcon           dd 10003h   ;Иконка окна по умолчанию
    42.     hCursor         dd 10011h   ;Курсор окна по умолчанию (здесь указан ID обычной стрелки)
    43.     hbrBackground   dd COLOR_BTNFACE+1  ;Фон нашего окна
    44.     lpszMenuName    dd NULL;Меню у нас отсутствует
    45.     lpszClassName   dd offset ClassName; У
    46.  
    47. .DATA?                  ; Hеиницилизиpуемые данные
    48.  
    49. ;hInstance HINSTANCE ?   ; Хэндл нашей пpогpаммы
    50. CommandLine LPSTR ?
    51. hwnd HWND ?
    52. msg MSG <>
    53.  
    54.  
    55. .CODE                ; Здесь начинается наш код
    56.  
    57. start:
    58. ;invoke GetModuleHandle, NULL ; Взять хэндл пpогpаммы
    59.                              ; Под Win32, hmodule==hinstance mov hInstance,eax
    60. ;mov hInstance,eax
    61.  
    62. ;invoke GetCommandLine   ; Взять командную стpоку. Вы не обязаны
    63.            ;вызывать эту функцию ЕСЛИ ваша пpогpамма не обpабатывает командную стpоку.
    64. ;mov CommandLine,eax
    65. ;invoke WinMain, hInstance,NULL,CommandLine, SW_SHOWDEFAULT  ; вызвать основную функцию
    66. ;invoke ExitProcess, eax ; Выйти из пpогpаммы.
    67.                         ; Возвpащаемое значение, помещаемое в eax, беpется из WinMain'а.
    68.  
    69. ;WinMain proc hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,CmdShow:DWORD
    70. ;    LOCAL wc:WNDCLASSEX      ; создание локальных пеpеменных в стеке
    71.  ;   LOCAL msg:MSG
    72. ;    LOCAL hwnd:HWND
    73.  
    74.     xor ebx,ebx
    75.     lea edi,cbSize
    76.     assume edi:ptr WNDCLASSA
    77.     push edi
    78.     call _imp__RegisterClassA@4
    79.     mov ecx,CW_USEDEFAULT
    80.     push ebx       
    81.     push [edi].hInstance
    82.     push ebx   
    83.     push ebx   
    84.     push ecx   
    85.     push ecx   
    86.     push ecx   
    87.     push ecx   
    88.     push WS_OVERLAPPEDWINDOW + WS_VISIBLE
    89.     push [edi].lpszClassName       
    90.     push [edi].lpszClassName
    91.     push ebx
    92.     call _imp__CreateWindowExA@48
    93.  
    94.   ;  mov   wc.cbSize,SIZEOF WNDCLASSEX   ; заполнение стpуктуpы wc
    95.    ; mov   wc.style, CS_HREDRAW or CS_VREDRAW
    96.  ;   mov   wc.lpfnWndProc, OFFSET WndProc
    97.  ;   mov   wc.cbClsExtra,NULL
    98.  
    99.   ;  mov   wc.cbWndExtra,NULL
    100.  ;   push  hInstance
    101.   ;  pop   wc.hInstance
    102.   ;  mov   wc.hbrBackground,COLOR_WINDOW+1
    103.  
    104.   ;  mov   wc.lpszMenuName,NULL
    105.   ;  mov   wc.lpszClassName,OFFSET ClassName
    106.   ;  invoke LoadIcon,NULL,IDI_APPLICATION
    107.   ;  mov   wc.hIcon,eax
    108.  
    109.  ;   mov   wc.hIconSm,eax
    110.   ;  invoke LoadCursor,NULL,IDC_ARROW
    111.   ;  mov   wc.hCursor,eax
    112.   ;  invoke RegisterClassEx, addr wc  ; pегистpация нашего класса окна
    113.   ;  invoke CreateWindowEx,NULL,\
    114.    ;             ADDR ClassName,\
    115.    ;             ADDR AppName,\
    116.    ;             WS_OVERLAPPEDWINDOW,\
    117.    ;             CW_USEDEFAULT,\
    118.    ;             CW_USEDEFAULT,\
    119.    ;             CW_USEDEFAULT,\
    120.    ;             CW_USEDEFAULT,\
    121.    ;             NULL,\
    122.    ;             NULL,\
    123.   ;              hInst,\
    124.   ;              NULL
    125.     mov   hwnd,eax
    126.  
    127.  ;   invoke ShowWindow, hwnd,CmdShow ; отобpазить наше окно на десктопе
    128.  ;   invoke UpdateWindow, hwnd ; обновить клиентскую область
    129.  
    130.     .WHILE TRUE   ; Enter message loop
    131.        invoke GetMessage,ADDR msg,NULL,0,0
    132.     .BREAK .IF (!eax)
    133.        invoke TranslateMessage, ADDR msg
    134.        invoke DispatchMessage, ADDR msg
    135.     .ENDW
    136.      mov     eax,msg.wParam ; сохpанение возвpащаемого значения в eax
    137.      ret
    138.  
    139. ;WinMain endp
    140.  
    141. WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
    142.  
    143.     .IF uMsg==WM_DESTROY            ; если пользователь закpывает окно
    144.         invoke PostQuitMessage,NULL ; выходим из пpогpаммы
    145.     .ELSE
    146.         invoke DefWindowProc,hWnd,uMsg,wParam,lParam ; Дефаултная функция обpаботки окна
    147.         ret
    148.     .ENDIF
    149.     xor eax,eax
    150.  
    151.     ret
    152. WndProc endp
    153.  
    154.  
    155. end start
     
  13. Plis

    Plis New Member

    Публикаций:
    0
    Регистрация:
    2 июн 2008
    Сообщения:
    26
    Косяк нашёл - установочный пакет SP3 глючный. Качаю новый с Микрософта....
     
  14. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.797
    Найдите 10 отличий или сколькими способами можно вызвать MessageBox?
    Во вложениии сорц и ехе 12 способов, которыми можно вызвать MessageBox (просьба сильно не пинать!)
     
  15. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.797
    Видео плеер для WinXP в 324 байт, написано на nasmw без линкера и компилятора ресурсов. А Вам слабо? :)
     
  16. pinyurij

    pinyurij New Member

    Публикаций:
    0
    Регистрация:
    16 ноя 2009
    Сообщения:
    2
    Mikl__
    Запускаю bat из #17 для lesson03.asm. Получаю lesson03.exe размером 896 б., 2 секции.
    Меняю в /MERGE:.data на .rdata - уже 848 б., 1 секция. Но всё-таки не 536, как в архиве.
    Как Вы добились такого размера?
    И ещё вопрос: можно ли убрать warning-и?
     
  17. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.797
    pinyurij
    EXE'шники, которые приводятся в "Сам себе Iczelion" собираются с 4-байтным стабом stubby.exe='M','Z',0,0 и переделанным polink1 (смотрите аттач к #69) и пояснения в #71 А если дойти до #159 там PE-заголовок сжимается еще больше :)
     
  18. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.797
    Обычно не отключал но знаю что у ml есть ключи /w /wx /wномер наверное ими стоит поэксперементировать.
    На WASM.RU есть статья Компиляция файлов .asm с помощью компилятора ml.exe Этот материал дополняет статью MS Developer Studio - среда разработки для ASM. Здесь приведен формат командной строки компилятора MASM 6.1+, расшифровка ее опций и комментарии по их применению при работе в среде MS Developer Studio.
    /w Same as /W0 /WX То же, что /W0 /WX См. далее.
    /WX Treat warnings as errors Трактовать предупреждения как ошибки Обычно в применении нет необходимости. В случае возникновения предупреждений компиляция завершается неуспешно.
    /W<number> Set warning level Установить уровень предупреждеинй Обычно в применении нет необходимости. Устанавливает перечень событий компиляции, трактуемых как предупреждения.
    Для tasm32 ключи /w0, /w1, /w2 set warning level: w0=none, w1=w2=warnings on
    /w-xxx, /w+xxx disable (-) or enable (+) warning xxx
     
  19. pinyurij

    pinyurij New Member

    Публикаций:
    0
    Регистрация:
    16 ноя 2009
    Сообщения:
    2
    Mikl___
    Спасибо, получилось. Правда, пока 564, а не 536. Буду разбираться...
    Кстати, polink1 warning-ами не ругается!
     
  20. Semiono

    Semiono Member

    Публикаций:
    0
    Регистрация:
    27 ноя 2005
    Сообщения:
    785
    Извините, а нет примерчика тут на чтение строки REG_SZ / EXPAND_SZ из реестра, ну хотя бы в MsgBox на экран вывести? Я видел как типы данных получаются и как дворд кажись,
    сам сколько крутил эти коды ничего не получается - wsprintf вообще убил...
    Походу я вилосипед изобретаю, такую фигню никаких уроков не могу нагуглить!
    моё - http://slil.ru/28230433