TASM Синтаксическая ошибка в имени файла, имени папки или метке тома.

Тема в разделе "WASM.BEGINNERS", создана пользователем SerafimR, 17 мар 2009.

  1. SerafimR

    SerafimR New Member

    Публикаций:
    0
    Регистрация:
    7 фев 2009
    Сообщения:
    24
    Google'ом поискал по форуму ничего не нашёл на эту тему.
    Пишу и компиплирую программы в TASM, сначала всё работало хорошо, всё компилировалось, но затем TASM начал выдавать ошибку "Синтаксическая ошибка в имени файла, имени папки или метке тома." При этом даже перезагрузка не помогает и программы, которые компилировались раньше, начинают выдавать ту же ошибку.
    Кто знает что с этим делать и от чего появляется эта ошибка?
     
  2. SerafimR

    SerafimR New Member

    Публикаций:
    0
    Регистрация:
    7 фев 2009
    Сообщения:
    24
    Опс, прошу прощения, это я сам неправильно отредактировал заголовочный файл, TASM из-за этого не мог скомпилировать файл, и ошибка появлялась из-за del *.obj в bat файле. Вернул на место начальный заголовочный файл, теперь всё работает правильно.
    Но появился ещё один вопрос, напишу его тут же. Пишу базовое Win32 API приложение и мне компилятор выдаёт

    call CreateWindow, offset WindowClassName, offset WindowTitle, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 640, 480, 0, 0, wc.hInstance, 0;
    **Error** Assembler.asm(50) CALLPROC(2) Argument to operation or instruction has illegal size

    Кто знает в чём тут дело?
     
  3. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    SerafimR
    Хочешь получить ответ, _полностью_ покажи минимальный код, который воспроизводит ошибку, + укажи версию tasm'а.
     
  4. SerafimR

    SerafimR New Member

    Публикаций:
    0
    Регистрация:
    7 фев 2009
    Сообщения:
    24
    Эту ошибку я уже исправил, там при передаче hInstance в CreateWindow TASM почему-то не нравилась wc.hInstance, я её переписал на
    push ww_hInstance;
    Сейчас компилируется, но при запуске окно не отображается, программа проходит регистрацию класса, создание окна и отображение окна, по крайней мере
    test eax, eax;
    jz Exit;
    не завершает процесс и он висит в памяти, его приходится TaskMeneger'ом закрывать.

    Версия TASM 5.0 от tE! с его же заголовочным файлом.

    Может кто-нибудь может подсказать что я пишу не так?

    Вот код

    .486
    .model flat, stdcall

    locals

    includelib D:\Utilities\Writing\TASM5Plus\LIB\imp32i.lib
    include D:\Utilities\Writing\TASM5Plus\INCLUDE\w32.inc



    ;===Data segment======================================================================
    .DATA
    WindowTitle db 'Assembler', 0;
    WindowClassName db 'Assembler', 0;

    Message db 'Assembler', 0;
    MessageReg db 'Registered window class.', 0;
    MessageCreatedWindow db 'Created window.', 0;

    WindowMsg MSG < 0 >;
    wc WNDCLASS < 0 >;

    hWndMain dd ?;
    ww_hInstance dd ?;
    Quit dd ?;



    ;===Uninitialized data segment========================================================
    ;.DATA?
    ; hWndMain dd ?;
    ; ww_hInstance dd ?;
    ; Quit dd ?;



    ;===Code segment======================================================================
    .CODE
    Start : pushad
    call GetModuleHandle, 0;
    test eax, eax;
    jz Exit;

    mov ww_hInstance, eax;

    mov Quit, 0;

    ;---Registering window class--------------------------------------------------
    call GetModuleHandle, 0;
    mov wc.w_Style, CS_HREDRAW + CS_VREDRAW + CS_OWNDC;
    mov wc.w_lpfnWndProc, offset WindowProc;
    mov wc.w_hInstance, eax;
    mov wc.w_lpszClassName, offset WindowClassName;

    call RegisterClass, offset wc;
    test eax, eax
    jz Exit

    call MessageBox, 0, offset MessageReg, offset WindowTitle, MB_OK;

    ;---CreatingWindow------------------------------------------------------------
    push 0;
    push ww_hInstance;
    push 0;
    push 0;
    push 480;
    push 640;
    push CW_USEDEFAULT;
    push CW_USEDEFAULT;
    push WS_OVERLAPPEDWINDOW;
    push offset WindowTitle;
    push offset WindowClassName;
    push 0;

    call CreateWindowExA;

    test eax, eax
    jz Exit

    call MessageBox, 0, offset MessageCreatedWindow, offset WindowTitle, MB_OK;

    mov hWndMain, eax;
    call ShowWindow, eax, SW_SHOWNORMAL;
    call UpdateWindow, hWndMain;

    call MessageBox, 0, offset Message, offset WindowTitle, MB_OK;



    ;---Message loop--------------------------------------------------------------
    MsgLoop :
    call GetMessage, offset WindowMsg, 0, 0, 0;
    call TranslateMessage, offset WindowMsg;
    call DispatchMessage, offset WindowMsg;

    cmp Quit, 1;
    je Exit;

    jmp MsgLoop;



    Exit : popad
    call ExitProcess, 0
    RET



    ;===Procedures and functions==========================================================
    WindowProc proc _hWnd : HWND, WindowMessage : UINT, _wParam : WPARAM, _lParam:LPARAM;
    uses ebx, edi, esi;

    mov eax, WindowMessage;

    cmp eax, WM_CLOSE;
    jz close;

    call DefWindowProc, _hWnd, WindowMessage, _wParam, _lParam;

    close :
    mov Quit, 1;

    RET;

    WindowProc ENDP;



    END Start;
     
  5. censored

    censored New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2005
    Сообщения:
    1.615
    Адрес:
    деревня "Анонимные Прокси"
    А почему после каждой строчки ';'?
     
  6. SerafimR

    SerafimR New Member

    Публикаций:
    0
    Регистрация:
    7 фев 2009
    Сообщения:
    24
    Привычка, после Pascal :).
     
  7. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    SerafimR
    > test eax, eax;
    > jz Exit;
    > не завершает процесс
    В твоем коде три таких куска, на какой из них ты ссылаешься?

    > при запуске окно не отображается, программа проходит ... и отображение окна
    Как тебя понимать?

    > приходится TaskMeneger'ом закрывать
    Твоя оконная процедура никуда не годится. Например, В ответ на любое сообщение она устанавливает Quit в _единицу_.

    ps для оформления кода в сообщениях есть специальный тег.
     
  8. SerafimR

    SerafimR New Member

    Публикаций:
    0
    Регистрация:
    7 фев 2009
    Сообщения:
    24
    Код (Text):
    1. test eax, eax;
    2. jz Exit;
    Переводит выполнение на
    Код (Text):
    1. Exit :    popad
    2. call    ExitProcess, 0
    3. RET
    , которое как раз и завершает процесс, насколько я понял, когда eax равен нолю, т.е. когда функции выполняются с ошибками, срабатывает
    Код (Text):
    1. test eax, eax;
    2. jz Exit;
    и завершает программу. Я имею ввиду все 3 этих куска кода, все их программа проходит.
    То, что программа проходит показ окна это значит, что она не завершается до
    Код (Text):
    1. mov  hWndMain, eax;
    2. call ShowWindow, eax, SW_SHOWNORMAL;
    3. call UpdateWindow, hWndMain;
    Опеределяю я это по
    Код (Text):
    1. call MessageBox, 0, offset Message, offset WindowTitle, MB_OK;
    да и по тому что программа висит в памяти, она скорее всего доходит до цикла и в нём работает.

    Функцию я уже переправил на
    Код (Text):
    1. WindowProc proc _hWnd : HWND, WindowMessage : UINT, _wParam : WPARAM, _lParam:LPARAM;
    2.     uses    ebx, edi, esi;
    3.  
    4.     mov     eax, [WindowMessage];
    5.  
    6.     cmp eax, WM_CLOSE;
    7.     jz  close;
    8.  
    9.         call    DefWindowProc, [_hWnd], [WindowMessage], [_wParam], [_lParam];
    10.  
    11.         RET;
    12.  
    13. close :
    14.         mov [Quit], 1;
    15.    
    16.     RET;
    17.  
    18. WindowProc ENDP;
     
  9. SerafimR

    SerafimR New Member

    Публикаций:
    0
    Регистрация:
    7 фев 2009
    Сообщения:
    24
    В общем я взял пример отсюда http://www.wasm.ru/srclist.php?list=1, по моему этот http://www.wasm.ru/baixado.php?mode=src&id=32, взял INC файл и скрипт компиляции из этого же примера и переписал программу к виду

    Код (Text):
    1. .586
    2. .model flat, stdcall
    3.  
    4. locals
    5.  
    6. include D:\Utilities\Writing\TASM5Plus\INCLUDE\win32.inc
    7.  
    8.  
    9.  
    10. ;===Data segment======================================================================
    11. .DATA
    12.   WindowTitle     db 'Assembler', 0;
    13.   WindowClassName db 'Assembler', 0;
    14.   MenuName        db 0;
    15.  
    16.   Message               db 'Assembler', 0;
    17.   MessageReg            db 'Registered window class.', 0;
    18.   MessageCreatedWindow  db 'Created window.', 0;
    19.  
    20.   WindowMsg     MSGSTRUCT < ? >;
    21.   wc            WNDCLASS  < ? >;
    22.  
    23.  
    24.  
    25. ;===Uninitialized data segment========================================================
    26. .DATA?
    27.   hWndMain        dd ?;
    28.   ww_hInstance    dd ?;
    29.   Quit            dd ?;
    30.  
    31.  
    32.  
    33. ;===Code segment======================================================================
    34. .CODE
    35. Start : ;pushad
    36.         call GetModuleHandle, 0;
    37.         test    eax, eax;
    38.     jz  Exit;
    39.  
    40.     mov  wc.clsHInstance, eax;
    41.  
    42.         mov  Quit, 0;
    43.  
    44.         ;---Registering window class--------------------------------------------------
    45.     mov   wc.clsStyle, CS_HREDRAW + CS_VREDRAW + CS_OWNDC;
    46.         mov   wc.clsLpfnWndProc, offset WindowProc;
    47.         mov   wc.clsCbClsExtra, 0;
    48.         mov   wc.clsCbWndExtra, 0;
    49.         mov   wc.clsHbrBackground, 0;
    50.         mov  dword ptr wc.clsLpszMenuName, offset MenuName;
    51.         mov  dword ptr wc.clsLpszClassName, offset WindowClassName;
    52.  
    53.         call  RegisterClassA, offset wc;
    54.         test    eax, eax
    55.     jz  Exit
    56.  
    57.  
    58.        
    59.         ;---CreatingWindow------------------------------------------------------------
    60.         push 0;
    61.         push wc.clsHInstance;
    62.         push 0;
    63.         push 0;
    64.         push 480;
    65.         push 640;
    66.         push CW_USEDEFAULT;
    67.         push CW_USEDEFAULT;
    68.         push WS_OVERLAPPEDWINDOW;
    69.         push offset WindowTitle;
    70.         push offset WindowClassName;
    71.         push 0;
    72.  
    73.         call CreateWindowExA;
    74.  
    75.         test    eax, eax
    76.     jz  Exit
    77.  
    78.     mov  hWndMain, eax;
    79.         call ShowWindow, hWndMain, SW_SHOWNORMAL;
    80.         call UpdateWindow, hWndMain;
    81.  
    82.  
    83.  
    84.     ;---Message loop--------------------------------------------------------------
    85.         MsgLoop :
    86.                   call GetMessageA, offset WindowMsg, 0, 0, 0;
    87.                   call TranslateMessage, offset WindowMsg;
    88.                   call DispatchMessage, offset WindowMsg;
    89.  
    90.                   cmp Quit, 1;
    91.                   je  Exit;
    92.  
    93.                   jmp short MsgLoop;
    94.  
    95.  
    96.  
    97. Exit :  ;popad
    98.     call    ExitProcess, 0
    99.     RET
    100.  
    101.  
    102.  
    103. ;===Procedures and functions==========================================================
    104. WindowProc proc uses    ebx edi esi, _hWnd : DWORD, WindowMessage : DWORD, _wParam : DWORD, _lParam:DWORD;
    105.     cmp     WindowMessage, WM_CLOSE;
    106.     je  close;
    107.  
    108.         call    DefWindowProc, _hWnd, WindowMessage, _wParam, _lParam;
    109.  
    110.         RET;
    111.  
    112. close :
    113.         mov Quit, 1;
    114.    
    115.     RET;
    116.  
    117. WindowProc ENDP;
    118.  
    119.  
    120.  
    121. END Start;
    И всё заработало!
    Но сейчас есть ещё один вопрос. В nasm можно объявлять внешние процедуры и функции так
    Код (Text):
    1. extern MessageBoxA;
    2. extern GetStockObject;
    и потом при линковке программы подключать библиотеку, а можно
    Код (Text):
    1. extern MessageBoxA;
    2. import MessageBoxA user32.dll;
    3. extern GetStockObject;
    4. import GetStockObject gdi32.dll;
    тогда при линковке можно не подключать библиотеку и размер программы существенно уменьшается.
    Как сделать это же самое в TASM?
     
  10. Mikl___

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

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.914
    SerafimR
    Что то вы путаете в NASM
    Код (Text):
    1. %define ONLY_NASM
    2. %include "nagoa+.inc"
    3. %include "defines.inc"
    4. section .text
    5. start:
    6.     invoke MessageBox,0,Message,wTitle,MB_OK+MB_SYSTEMMODAL
    7.     retn
    8.   wTitle   db 'Iczelion Tutorial #2:MessageBox',0
    9.   Message db 'Win32 Assembly with NASM is Great!',0
    10. LAST_BEGIN
    11. __LIBS_   user32,  'user32.DLL'
    12. __IMPORT_ user32,\
    13.           MessageBox,'MessageBoxA',0
    14. LAST_END
    в TASM
    Код (Text):
    1. .386
    2. .model flat
    3. includelib import32.lib
    4. include windows32.inc
    5. extern MessageBoxA:PROC
    6. .code
    7. start:
    8.     push MB_OK + MB_SYSTEMMODAL
    9.     push offset wTitle  
    10.     push offset Message
    11.     push eax
    12.     call MessageBoxA
    13.     ret             ;выход из программы
    14. wTitle  db 'Iczelion Tutorial #2:MessageBox',0
    15. Message db 'Win32 Assembly with tasm is Great!',0
    16. ends
    17. end start
     
  11. SerafimR

    SerafimR New Member

    Публикаций:
    0
    Регистрация:
    7 фев 2009
    Сообщения:
    24
    Да нет в nasm я не путаю, мне нужно как раз импортирование функций из динамических библиотек во время работы программы, чтобы не использовать lib'ы.
    Как это в TASM написать?
    Я не специалист, но вроде бы у вас код
    Код (Text):
    1. LAST_BEGIN
    2. __LIBS_   user32,  'user32.DLL'
    3. __IMPORT_ user32,\
    4.           MessageBox,'MessageBoxA',0
    5. LAST_END
    как раз и отвечает за импортирование, насколько я понял, функции можно или описывать в INC и LIB файлах, а можно просто импортировать их из dll.
    Я на nasm'е небольшую програмку написал без %include "nagoa+.inc", если функции описывать с помощью INC и LIB файлов, то размер программы 4 Кбайта, если загружать их из DLL, то 3 Кбайта, вот мне как раз и интересно как это сделать в TASM?
    Насколько я понял в верхней программе, что я привёл TASM берёт описание функций из LIB файла, по тому что она линкуется строкой
    Код (Text):
    1. D:\Utilities\Writing\TASM5Plus\BIN\tlink32 /Tpe /aa /c /o D:\Utilities\Writing\TASM5Plus\LIB\import32.lib Assembler,Assembler.exe, , , , Resources\Assembler.res
     
  12. Mikl___

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

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.914
    SerafimR
    В аттаче исходные файлы и exe для tasm и nasm -- сравните (nasm в двух вариантах -- стандартный и модифицированный) И API-функции не импортируются из dll -- они просто ссылаются на соответствующие системные dll (kernel32, gdi32 и т.д.) размер от этого не зависит
     
  13. SerafimR

    SerafimR New Member

    Публикаций:
    0
    Регистрация:
    7 фев 2009
    Сообщения:
    24
    Аналогично код

    Код (Text):
    1. %INCLUDE "WIN32N.INC"
    2.  
    3. EXTERN MessageBoxA
    4. EXTERN ExitProcess
    5.  
    6. SECTION CODE USE32 CLASS=CODE
    7. ..start:
    8.  
    9. PUSH UINT MB_OK
    10. PUSH LPCTSTR title1
    11. PUSH LPCTSTR string1
    12. PUSH HWND NULL
    13. CALL MessageBoxA
    14.  
    15. PUSH UINT NULL
    16. CALL ExitProcess
    17.  
    18. SECTION DATA USE32 CLASS=DATA
    19. string1: db 'Hello world!',13,10,0
    20. title1: db 'Hello',0
    21. 
    и

    Код (Text):
    1. %INCLUDE "..\..\inc\win32n.inc"
    2.  
    3. EXTERN MessageBoxA
    4. IMPORT MessageBoxA user32.dll
    5. EXTERN ExitProcess
    6. IMPORT ExitProcess kernel32.dll
    7.  
    8. SECTION CODE USE32 CLASS=CODE
    9. ..start:
    10.  
    11. PUSH UINT MB_OK
    12. PUSH LPCTSTR title1
    13. PUSH LPCTSTR string1
    14. PUSH HWND NULL
    15. CALL [MessageBoxA]
    16.  
    17. PUSH UINT NULL
    18. CALL [ExitProcess]
    19.  
    20. SECTION DATA USE32 CLASS=DATA
    21. string1: db 'Hello world!',13,10,0
    22. title1: db 'Hello',0
    23. 
    Правда написано не мной, но всё-таки - первый вариант занимает на диске 3,02 Кбайта, второй - 2,51 Кбайта. Первый компилируется и линкуется строками

    Код (Text):
    1. D:\Utilities\Writing\nasm-2.06rc1\nasm.exe -s -Ox -f obj -iD:\Utilities\Writing\nasm-2.06rc1\INC\ -iD:\Work\Programming\Programs\Febrary\Assembler\ D:\Utilities\Writing\nasm-2.06rc1\SAMPLES\MSGBOX\MSGBOX1.ASM
    2.  
    3. D:\Utilities\Writing\nasm-2.06rc1\alink\alink.exe -L D:\Utilities\Writing\nasm-2.06rc1\lib -oPE D:\Utilities\Writing\nasm-2.06rc1\SAMPLES\MSGBOX\MSGBOX1.obj win32.lib
    Второй -
    Код (Text):
    1. D:\Utilities\Writing\nasm-2.06rc1\nasm.exe -s -Ox -f obj -iD:\Utilities\Writing\nasm-2.06rc1\INC\ -iD:\Work\Programming\Programs\Febrary\Assembler\ D:\Utilities\Writing\nasm-2.06rc1\SAMPLES\MSGBOX\MSGBOX2.ASM
    2.  
    3. D:\Utilities\Writing\nasm-2.06rc1\alink\alink.exe -L D:\Utilities\Writing\nasm-2.06rc1\lib -oPE D:\Utilities\Writing\nasm-2.06rc1\SAMPLES\MSGBOX\MSGBOX2.obj
    Сейчас попробую прикрепить их к сообщению. Загрузил.
     
  14. Mikl___

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

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.914
    SerafimR
    И что? В обоих случаях используется не самый лучший линкер alink, хотя nasm позволяет создавать com, exe, dll, sys не используя линкера. Почему-то размер exe в 3,02 Кбайта и 2,51 Кбайта тебя впечатлил, а мои экзешники в 1024 и 335 байт нет -- оба созданы "nasmw -f bin %filename%.asm -o %filename%.exe -I%nasm_path%\include\" В случае с 3,02 Kb EXE состоит из 5 секций (CODE - размер 600h, DATA - размер 800h, Imports - размер A00h, imports - размер C00h, relocs - размер 18h). В случае с 2,51 Kb EXE состоит из 4 секций (CODE - размер 600h, DATA - размер 800h, imports - размер A00h, relocs - размер 10h) содержимое секций, как и самого файла, на 90% состоит из нулей. В моих случаях только одна секция - .text. Если воспользуешься поиском, то сможешь найти рабочий PE-файл, выводящий MessageBox и в 97 байт!
     
  15. SerafimR

    SerafimR New Member

    Публикаций:
    0
    Регистрация:
    7 фев 2009
    Сообщения:
    24
    Что-то у меня твой архив не закачивается, скачивается только 591 Кбайт и дальше загрузка не идёт, качаю через Opera 9.61. Мой файл закачивается нормально.
    Насчёт секций я не знал - я ещё только учусь программировать на ассемблере.
    А какой линкер генерирует самый оптимальный код по быстродействию и по размеру?
     
  16. Mikl___

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

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.914
    Ничего не путаешь
    IE нормально выкачивает -- хочешь в почту сброшу -- адрес в личку отправь :) при программировании на ассемблере оптимальность кода по быстродействию и размеру (это вообщето разные вещи) зависит от квалификации программиста, а не от линкера :)
     
  17. SerafimR

    SerafimR New Member

    Публикаций:
    0
    Регистрация:
    7 фев 2009
    Сообщения:
    24
    Ты ж сам говоришь, что alink не самый лучший линкер, вот я и спрашиваю какой лучше? И как эти самые 90% нолей убрать?
    Да с Кбайтами я напутал конечно же - 591 байт.
    Послал свой E-mail в личном сообщении.
     
  18. Mikl___

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

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.914
    SerafimR
    переходи на masm
    Начни с Уроков Iczelion'а
    Разберись с Сам себе Iczelion
    И будет тебе счастье ;)
     
  19. SerafimR

    SerafimR New Member

    Публикаций:
    0
    Регистрация:
    7 фев 2009
    Сообщения:
    24
    Спасибо за ссылки и за исходный код.

    Я всё-таки использую TASM и TLINK, но у меня почему-то когда компоную с помощью
    Код (Text):
    1. D:\Utilities\Writing\TASM5Plus\BIN\tlink32 /Tpe /aa /c /o /V4.0 /Af:16 Assembler,Assembler.exe, , , , Resources\Assembler.res
    Windows говорит, что программа не является приложением Win32. Когда пишу /Af:512 всё работает хорошо.