Недавно начал писать программу на masm'e c использованием WinApi функций. Появилась странная ошибка. Я не понимаю, почему. Оно сводит меня с ума. При создании окна вызывается функция, которая должна установить куррент дайректори в Modules (папка создана). При этом возникает ошибка 998: При чем, если вынести вызов функции SetCurrentDirectory не в отдельную функцию, а в WndProc, то все работает. Please, help! Code (Text): .386 .model flat,stdcall .stack 100h option casemap:none include \masm32\include\windows.inc include \masm32\include\user32.inc includelib \masm32\lib\user32.lib include \masm32\include\kernel32.inc includelib \masm32\lib\kernel32.lib WinMain proto :DWORD,:DWORD,:DWORD,:DWORD .CONST IDButSort db 1 IDButBench db 2 IDEditInfo db 3 IDEditNumber db 4 IDList db 5 .DATA ClassName db "MyClass",0 AppName db "MegaSorter 0.1 build 1000",0 ButtonClassName db "BUTTON", 0 EditClassName db "EDIT", 0 ListClassName db "LISTBOX", 0 ButtonText db "Sort",0 FolderToSearchIn db "Modules", 0 ButtonText2 db "Benchmark", 0 ErrorMessage db "Error happened", 0 FileMask db "*.dll",0 ErrMesDirectory db "Can't change directory. Please check whether Modules folder exists",0 blad db 256 dup(0) .DATA? hInstance HINSTANCE ? CommandLine LPSTR ? hButtonSort HWND ? hButtonBench HWND ? hEditInfo HWND ? hEditNumber HWND ? hList HWND ? bla dd ? hHeap HANDLE ? HeapAddrStart LPVOID ? HeadNameStart LPVOID ? .CODE start: invoke GetModuleHandle, NULL mov hInstance,eax invoke GetCommandLine mov CommandLine,eax invoke WinMain, hInstance,NULL,CommandLine, SW_SHOWDEFAULT invoke ExitProcess, eax MakeDLLList proc ;Look for dlls and fill the list LOCAL hSearch: WIN32_FIND_DATA LOCAL nFileCount: DWORD LOCAL hFind: HANDLE invoke GetCurrentDirectory, 255, addr blad invoke MessageBox, NULL, addr blad, addr blad, MB_OK or MB_ICONERROR invoke SetCurrentDirectory, addr FolderToSearchIn .if eax==0 invoke GetCurrentDirectory, 255,addr blad invoke MessageBox, NULL, addr blad, addr blad, MB_OK or MB_ICONERROR invoke MessageBox, NULL, addr ErrMesDirectory, addr ErrorMessage, MB_OK or MB_ICONERROR ret .else invoke FindFirstFile, addr FileMask, addr hSearch .if eax==INVALID_HANDLE_VALUE ret .else mov hFind, eax invoke GetProcessHeap mov hHeap,eax .repeat inc nFileCount invoke FindNextFile, hFind, addr hSearch .until eax!=0 mov eax, nFileCount mov bx, 0 idiv bx ; invoke HeapAlloc, hHeap, HEAP_ZERO_MEMORY ; mov HeapAddrStart, eax ; invoke HeapAlloc, hHeap, HEAP_ZERO_MEMORY ; Freed some place for array with dll names ; mov HeapAddrStart, eax .endif .endif MakeDLLList endp WinMain proc hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,CmdShow:DWORD LOCAL wc:WNDCLASSEX LOCAL msg:MSG LOCAL hwnd:HWND mov wc.cbSize,SIZEOF WNDCLASSEX mov wc.style, CS_HREDRAW or CS_VREDRAW mov wc.lpfnWndProc, OFFSET WndProc mov wc.cbClsExtra,NULL mov wc.cbWndExtra,NULL push hInstance pop wc.hInstance mov wc.hbrBackground,COLOR_WINDOW-3 mov wc.lpszMenuName,NULL mov wc.lpszClassName,OFFSET ClassName invoke LoadIcon,NULL,IDI_APPLICATION mov wc.hIcon,eax mov wc.hIconSm,eax invoke LoadCursor,NULL,IDC_ARROW mov wc.hCursor,eax invoke RegisterClassEx, addr wc invoke CreateWindowEx,NULL, ADDR ClassName, ADDR AppName, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 625, 675, NULL, NULL, hInst, NULL mov hwnd,eax invoke ShowWindow, hwnd,CmdShow invoke UpdateWindow, hwnd .WHILE TRUE invoke GetMessage, ADDR msg,NULL,0,0 .BREAK .IF (!eax) invoke TranslateMessage, ADDR msg invoke DispatchMessage, ADDR msg .ENDW mov eax,msg.wParam ret WinMain endp WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM .IF uMsg==WM_DESTROY invoke PostQuitMessage,NULL .elseif uMsg == WM_CREATE ;Creation of control elements ;Sort button invoke CreateWindowEx, NULL, addr ButtonClassName, addr ButtonText, WS_CHILD or WS_VISIBLE or BS_DEFPUSHBUTTON, 400, 120, 80, 30, hWnd, IDButSort, hInstance, NULL mov hButtonSort, eax ;Benchmark button invoke CreateWindowEx, NULL, addr ButtonClassName, addr ButtonText2, WS_CHILD or WS_VISIBLE or BS_DEFPUSHBUTTON, 400, 170, 80, 30, hWnd, IDButBench, hInstance, NULL mov hButtonBench, eax ;Edit box with information invoke CreateWindowEx, WS_EX_CLIENTEDGE, addr EditClassName, NULL, WS_CHILD or WS_VISIBLE, 285, 350, 318, 284, hWnd, IDEditInfo, hInstance, NULL mov hEditInfo, eax ;Edit box to input array size invoke CreateWindowEx, WS_EX_CLIENTEDGE, addr EditClassName, NULL, WS_CHILD or WS_VISIBLE, 400, 50, 80, 20, hWnd, IDEditNumber, hInstance, NULL mov hEditNumber, eax ; List of DLL modules invoke CreateWindowEx, WS_EX_CLIENTEDGE, addr ListClassName, NULL, WS_CHILD or WS_VISIBLE or LBS_SORT, 10, 10, 270, 628, hWnd, IDList, hInstance, NULL mov hList, eax ; Looking for DLL modules and storing their handles call MakeDLLList .ELSE invoke DefWindowProc,hWnd,uMsg,wParam,lParam ret .ENDIF xor eax,eax ret WndProc endp end start
Code (Text): IDButSort db 1 ... invoke CreateWindowEx, ..., IDButSort, ... masm превращает в Code (Text): mov al, [IDButSort] movzx ax, al push ax Таким образом, в стек запихивается 2 байта вместо 4-х. В результате стек становится несбалансированным (ибо CreateWindowEx честно вытолкнет 4 байта) и невыровненным на границу 4 байта. Последнее обстоятельство очень не нравится многим API-функциям. Возможные решения: 1. Убрать секцию .CONST, заменив все байтовые переменные на equ. 2. В секции .CONST сделать переменные dword'ами. 3. Перейти на fasm, не подверженный глюкам masm'а. 4. Писать без invoke. "push IDButSort" просто так не скомпилировалось бы.
diamond masm превращает в ... в стек запихивается 2 байта вместо 4-х На самом деле шесть, ты не учел предыдыщее 6A 00, а надо 66 6A 00.
q_q Действительно, не учел, спасибо. Впрочем, на остальные выводы это не влияет Но в таком случае логика masm'а мне вообще непонятна. Без push 0 это поведение ещё можно объяснить наследием 16-битного режима...
diamond на остальные выводы это не влияет Неоспоримо. логика masm'а мне вообще непонятна Наверное masm хотел сначала ноль (как слово, но пропустил 66h), а потом AX.
Спасибо. Сам не догадался бы. Поменял там на equ - заработало. Но вот другой код, ошибка та же. Я уже поменял на equ все что можно было, поставил везде push вместо invoke. DD вместо DB. Не понимаю я принцип этой ошибки. Помогите. Code (Text): .386 .model flat,stdcall .stack 1000h option casemap:none include \masm32\include\windows.inc include \masm32\include\user32.inc includelib \masm32\lib\user32.lib include \masm32\include\kernel32.inc includelib \masm32\lib\kernel32.lib include \masm32\include\dialogs.inc WinMain proto :DWORD,:DWORD,:DWORD,:DWORD dlgproc PROTO :DWORD,:DWORD,:DWORD,:DWORD IDButSort equ 101 IDButBench equ 102 IDEditInfo equ 103 IDEditNumber equ 104 IDButRandom equ 105 IDList equ 106 base equ 10 .DATA testText1 db "Sorting in process...",0 filepath db "C:\temp\numbers.txt",0 ClassName db "MyClass",0 AppName db "MegaSorter 0.1 build 1000",0 txtFileNOTFOUND db "TXT file with random numbers can't be loaded! Now automaticly will be generated new, if You want to change it press 'randoms' button",0 ButtonClassName db "BUTTON", 0 EditClassName db "EDIT", 0 ButtonText db "Sort",0 ButtonText2 db "Benchmark", 0 ButtonText3 db "Randoms", 0 NumberOfElements dd 100000 Limit dd 1000 len dd 1 ascii dd 255 dup(0) ListClassName db "LISTBOX", 0 minus dd 0 fbuffer dd 0 .DATA? hInstance HINSTANCE ? CommandLine LPSTR ? lpfilepath LPSTR ? lpfbuffer LPSTR ? hFileTXT HANDLE ? hButtonSort HWND ? hList HWND ? hButtonRandom HWND ? hButtonBench HWND ? hEditInfo HWND ? hEditNumber HWND ? hmemory HGLOBAL ? lpmemoryalloc dd ? NumberOfElemBytes dd ? CurNumbBuff dd ? isNumbRead dd ? ; bla dd 2 dup(?) ;bla23 dd 20h temp dd ? ; bla2 dw 3Dh hButn1 dd ? hButn2 dd ? randomVALUE dd ? temp1 dd ? num1 dd ? num2 dd ? .CODE start: push 0 call GetModuleHandle mov hInstance,eax call GetCommandLine mov CommandLine,eax push SW_SHOWDEFAULT push CommandLine push NULL push hInstance call WinMain push eax call ExitProcess ;///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ;///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// r_init: push ebp push eax push edx ; Сохраняем в стэке ebp ; eax, edx call __delta1_ ; __delta1_: pop ebp ; Получение дельта смещения sub ebp,offset __delta1_ ; db 0fh,031h ; Получаем случайное зерно mov rand_seed,eax ; pop edx pop eax pop ebp ; Восстанавливаем edx ; eax, ebp ret ; Возврат из подпрограммы ;---[Подпрограмма генерации случаного числа в диапазоне]---; brandom32: ; Эта подпрограмма ; возвращает случайное число ; в диапазоне 0..eax-1 push edx push ecx push ebp ; Сохраняем в стэке edx ; ecx, ebp call __delta2_ ; __delta2_: pop ebp ; Получение дельта смещения sub ebp,offset __delta2_ ; imul eax,eax,100 ; Умножаем eax на 100 push eax ; и сохраняем eax в стэке call random32 ; Вызываем подпрограмму ; генерации случайного числа xor edx,edx ; Обнуляем edx pop ecx ; Восстанавливаем значение ; из стэка в ecx div ecx ; Делим eax на ecx xchg eax,edx ; Помещаем остаток в eax xor edx,edx ; Обнуляем edx push 100 ; Помещаем в ecx - 100 pop ecx ; div ecx ; Делим eax на ecx pop ebp pop ecx pop edx ; Восстанавливаем ebp, ecx, ; edx ret ; Возврат из подпрограммы random32: push ebp call __delta3_ ; __delta3_: pop ebp ; Получение дельта смещения sub ebp,offset __delta3_ ; mov eax,12345678h ; rand_seed= dword ptr $-4 ; imul eax,00019660Dh ; add eax,03C6EF35Fh ; Математические операции mov [ebp+rand_seed],eax ; для получения случайного shr eax,16 ; числа imul eax,[esp+4] ; pop ebp retn ; Возврат из подпрограммы eaxLencalc proc ;len of eax to len push eax push edx push esi xor edx,edx xor esi,esi mov len,0 mov esi, base lenloop: CDQ div esi add len,1 cmp eax,0 jne lenloop pop esi pop edx pop eax ret eaxLencalc endp ;///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ;///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ;///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// num2string proc ;eax 2 ascii ;mov eax,4321 push esi push ebx push edx mov esi, base mov ebx, offset ascii add ebx, len convloop: xor edx, edx idiv esi add edx, '0' sub ebx, 1 mov byte ptr[ebx], dl or eax, eax jnz convloop pop edx pop ebx pop esi ret num2string endp ;///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ;///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// openTXTfile proc ;Opening file with numbers push 0 push FILE_ATTRIBUTE_NORMAL push OPEN_EXISTING push 0 push 0 push GENERIC_READ lea edi,filepath push edi call CreateFile mov hFileTXT,eax call GetLastError cmp eax,0; je txtfileexist ; if can't open file, ... ;push MB_OK or MB_ICONERROR ;push 0 ;lea edi, txtFileNOTFOUND ;push 0 ;call MessageBox ;call generateTXTfile ; ... will be created new one txtfileexist: mov eax,NumberOfElements imul eax,4 mov NumberOfElemBytes,eax ;push NumberOfElements ;push GPTR ;call GlobalAlloc ; mov lpmemoryalloc,eax ; invoke MessageBox, NULL, addr lpmemoryalloc, addr lpmemoryalloc, MB_OK or MB_ICONERROR ;cmp eax,NULL ; jne memoryOK ;push MB_OK ;push 0 ;push 0 ;push 0 ;call MessageBox ;memoryOK: ; mov [lpmemoryalloc],7ch ; invoke MessageBox, NULL, addr [lpmemoryalloc], addr lpmemoryalloc, MB_OK or MB_ICONERROR ;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX ;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX ;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX ;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX ;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX ;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX push 0 lea edi, isNumbRead push edi push 1 push CurNumbBuff push hFileTXT call ReadFile ; XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX call GetLastError mov temp1,eax mov ebx,0 div ebx ; sub temp1,170 ; invoke MessageBox, NULL, addr [temp1], addr temp1, MB_OK or MB_ICONERROR ; mov CurNumbBuff,31h ; invoke MessageBox, NULL, addr [CurNumbBuff], addr temp1, MB_OK or MB_ICONERROR ;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX ;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX ;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX ;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX ;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX ;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX ; mov dword ptr [lpmemoryalloc],31h ; invoke MessageBox, NULL, addr [lpmemoryalloc], addr lpmemoryalloc, MB_OK or MB_ICONERROR ret openTXTfile endp ;///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ;///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// generateTXTfile proc lea edi, filepath mov lpfilepath,edi push 0 push FILE_ATTRIBUTE_NORMAL push CREATE_ALWAYS push 0 push 0 push GENERIC_WRITE push lpfilepath call CreateFile mov hFileTXT,eax xor ecx,ecx mov ecx,NumberOfElements; number of elements randomLOOP: push ecx ;xor eax,eax call r_init mov eax,Limit; limit call brandom32 ; mov eax,123456 call eaxLencalc call num2string push esi mov esi,len mov [ascii+esi],7ch pop esi inc len push 0 lea edi, temp push edi push len lea edi,ascii push edi push hFileTXT call WriteFile ; file save pop ecx loop randomLOOP push hFileTXT call CloseHandle ret generateTXTfile endp ;///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ;///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// WinMain proc hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,CmdShow:DWORD LOCAL wc:WNDCLASSEX LOCAL msg:MSG LOCAL hwnd:HWND mov wc.cbSize,SIZEOF WNDCLASSEX mov wc.style, CS_HREDRAW or CS_VREDRAW mov wc.lpfnWndProc, OFFSET WndProc mov wc.cbClsExtra,NULL mov wc.cbWndExtra,NULL push hInstance pop wc.hInstance mov wc.hbrBackground,COLOR_WINDOW-3 mov wc.lpszMenuName,NULL mov wc.lpszClassName,OFFSET ClassName push IDI_APPLICATION push 0 call LoadIcon mov wc.hIcon,eax mov wc.hIconSm,eax push IDC_ARROW push 0 call LoadCursor mov wc.hCursor,eax lea edi,wc push edi call RegisterClassEx push 0 push hInst push 0 push 0 push 500 push 800 push CW_USEDEFAULT push CW_USEDEFAULT push WS_OVERLAPPEDWINDOW lea edi, AppName push edi lea edi, ClassName push edi push 0 call CreateWindowEx mov hwnd,eax push CmdShow push hwnd call ShowWindow push hwnd call UpdateWindow .WHILE TRUE invoke GetMessage, ADDR msg,NULL,0,0 .BREAK .IF (!eax) invoke TranslateMessage, ADDR msg invoke DispatchMessage, ADDR msg .ENDW mov eax,msg.wParam ret WinMain endp ;///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ;///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM .IF uMsg==WM_DESTROY push 0 call PostQuitMessage .elseif uMsg == WM_CREATE ;Creation of control elements call openTXTfile push 0 push hInstance push IDButSort push hWnd push 30 push 80 push 30 push 700 push WS_CHILD or WS_VISIBLE or BS_DEFPUSHBUTTON lea edi, ButtonText push edi lea edi,ButtonClassName push edi push 0 call CreateWindowEx mov hButtonSort, eax ; invoke CreateWindowEx, NULL, addr ButtonClassName, addr ButtonText2, WS_CHILD or WS_VISIBLE or BS_DEFPUSHBUTTON, 700, 90, 80, 30, hWnd, IDButBench, hInstance, NULL ;mov hButtonBench, eax ;invoke CreateWindowEx, NULL, addr ButtonClassName, addr ButtonText3, WS_CHILD or WS_VISIBLE or BS_DEFPUSHBUTTON, 700, 230, 80, 30, hWnd, IDButRandom, hInstance, NULL ; mov hButtonRandom, eax ;Edit box with information ; invoke CreateWindowEx, WS_EX_CLIENTEDGE, addr EditClassName, NULL, WS_CHILD or WS_VISIBLE, 230, 150, 300, 280, hWnd, IDEditInfo, hInstance, NULL ; mov hEditInfo, eax ;List of DLL modules ; invoke CreateWindowEx, WS_EX_CLIENTEDGE, addr ListClassName, NULL, WS_CHILD or WS_VISIBLE, 10, 70, 200, 400, hWnd, IDList, hInstance, NULL ; mov hList, eax .elseif uMsg == WM_COMMAND .if wParam == 101 push MB_OK push 0 push 0 push 0 call MessageBox .endif .if wParam == 105 Dialog "Create randoms","ыыы",10, WS_OVERLAPPED or WS_SYSMENU or DS_CENTER, 2,50,50,150,80, 1024 ; memory buffer size ;DlgStatic "number of elements",5,0,10,100,10 DlgButton "&OK",WS_TABSTOP,48,40,50,15,220 DlgEdit 5,10,10,100,10,202 CallModalDialog hInstance,0,dlgproc,NULL ret .endif .ELSE push lParam push wParam push uMsg push hWnd call DefWindowProc ret .ENDIF xor eax,eax ret WndProc endp ;///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ;///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// dlgproc proc hWin:DWORD,uMsg:DWORD,wParam:DWORD,lParam:DWORD .if uMsg == WM_INITDIALOG .elseif uMsg == WM_COMMAND .if wParam == 220 ;mov NumberOfElements, SOME NUMBER ;mov Limit, SOME NUMBER push hFileTXT call CloseHandle ;close previous file call generateTXTfile ;generate new one jmp quit_dialog .endif .elseif uMsg == WM_CLOSE quit_dialog: push 0 push hWin call EndDialog .endif xor eax, eax ret dlgproc endp ;///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// end start ; invoke Beep,200,200 ;mov NumberOfElements, SOME NUMBER ;mov Limit, SOME NUMBER
На этот раз, в отличие от предыдущего случая, ошибка никак не связана со стеком, а всё проще, действительно "Invalid access to memory location": вот здесь Code (Text): push 0 lea edi, isNumbRead push edi push 1 push CurNumbBuff push hFileTXT call ReadFile нужно писать Code (Text): push offset CurNumbBuff иначе получается, что функцию ReadFile просят прочитать байт по адресу, заданному в переменной CurNumbBuff, а имеется в виду, что прочитать байт нужно в саму переменную CurNumbBuff.