Почему поток не выводит значение еах ? : Code: .386 .model flat,stdcall option casemap:none WinMain proto :DWORd,:DWORD,:DWORD,:DWORD include \masm32\include\windows.inc include \masm32\include\user32.inc include \masm32\include\kernel32.inc includelib \masm32\lib\user32.lib includelib \masm32\lib\kernel32.lib .const IDM_CREATE_THREAD equ 1 IDM_EXIT equ 2 WM_FINISH equ WM_USER+100h .data ClassName db "Win32ASMThreadClass",0 AppName db "Win32 ASM MultiThreading Example",0 MenuName db "FirstMenu",0 res db "Result is: %d",0 .data? hInstance HINSTANCE ? CommandLine LPSTR ? hMenu HANDLE ? ExitCode DWORD ? hwnd HANDLE ? ThreadID DWORD ? buf DWORD ? .code start: invoke GetModuleHandle, NULL mov hInstance,eax invoke GetCommandLine mov CommandLine,eax invoke WinMain, hInstance,NULL,CommandLine, SW_SHOWDEFAULT invoke ExitProcess,eax WinMain proc hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,CmdShow:DWORD LOCAL wc:WNDCLASSEX LOCAL msg:MSG 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 hInst pop wc.hInstance mov wc.hbrBackground,COLOR_WINDOW+1 mov wc.lpszMenuName,OFFSET MenuName 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,WS_EX_CLIENTEDGE,ADDR ClassName,ADDR AppName,\ WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,\ CW_USEDEFAULT,300,200,NULL,NULL,\ hInst,NULL mov hwnd,eax invoke ShowWindow, hwnd,SW_SHOWNORMAL invoke UpdateWindow, hwnd invoke GetMenu,hwnd mov hMenu,eax .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_COMMAND mov eax,wParam .if lParam==0 .if ax==IDM_CREATE_THREAD mov eax,OFFSET ThreadProc invoke CreateThread,NULL,NULL,eax,0,0,ADDR ThreadID invoke CloseHandle,eax .else invoke DestroyWindow,hWnd .endif .endif .ELSEIF uMsg==WM_FINISH invoke MessageBox,NULL,ADDR AppName,ADDR AppName,MB_OK .ELSE invoke DefWindowProc,hWnd,uMsg,wParam,lParam ret .ENDIF xor eax,eax ret WndProc endp ThreadProc PROC USES ecx Param:DWORD mov eax,5 mov ecx,50 Loop1: add eax,eax dec ecx jz Get_out jmp Loop1 Get_out: invoke SendMessage,hwnd,WM_FINISH,NULL,NULL invoke wsprintf,addr buf,addr res,eax invoke MessageBox,0,addr AppName,addr buf,MB_OK ret ThreadProc ENDP end start
Мир всем местным, как на fasme сперва создать файл, а потом внести туда информацию в несколько строк. Например: строка 1 строка 2 строка 3 строка N??? Спасибо!
Примерно так: Code: format PE GUI 4.0 entry start include 'win32a.inc' start: invoke CreateFileA,_fname,GENERIC_WRITE,FILE_SHARE_WRITE,NULL,CREATE_NEW,FILE_ATTRIBUTE_NORMAL,NULL mov [hfile], eax invoke lstrlen, _string invoke WriteFile,[hfile],_string,eax,junk,0 invoke CloseHandle,[hfile] invoke ExitProcess,0 section '.idata' import data readable library kernel,'KERNEL32.DLL' import kernel,\ CreateFileA,'CreateFileA',\ lstrlen,'lstrlen',\ WriteFile,'WriteFile',\ CloseHandle,'CloseHandle',\ ExitProcess,'ExitProcess' section '.data' data readable writeable _fname db 'test.txt',0 _string db 'string',0 section '.lol' readable writeable hfile dd ? junk dd ?
в кто тебе не дает исправить тока нужный быйт в dword ? или же взять адрес памяти того места где надо чтото поменять и в нижнем окошке перейти на этот адрес и подправить сразу
Code: data resource directory RT_ICON,icons,RT_GROUP_ICON,group_icons resource icons,1,LANG_NEUTRAL,icon_data resource group_icons,1,LANG_NEUTRAL,icon icon icon,icon_data,'Икона1.ico' После компиляции иконка у *.exe файла просто ужасного качества. Почему так происходит?
Эм...я эти данные хотел передать процедуре через стек,а он требует адресации дворд... через INVOKE не хочу(.Приведи,пожалуйста,пример для ясности,если не сложно.
ты бы сам пример привёл для ясности что ты хочешь. Процедура твоя? передай через регистр например свой байт.
Процедура моя.Я хотел передать ЧЕРЕЗ стек,как.Например,моя цель - передать пять раз буковку а.Делаю: 00401000 > B8 61000000 MOV EAX,61 00401005 B9 08204000 MOV ECX,aaa.00402008 0040100A 8801 MOV BYTE PTR DS:[ECX],AL push byte ptr ds:[402008] push byte ptr ds:[402008] push byte ptr ds:[402008] push byte ptr ds:[402008] push byte ptr ds:[402008] CALL PROC1 Вот как раз так-то сделать у меня и не выходит из-за того,что PUSH требует адресации именно DWORD-а.Я знаю,что есть обходные пути,но мне хочется узнать,можно ли это сделать именно через стек ? Без всяких прямых и косвенных адресаций. И есть где-нибудь процедура PROC1: PROC1 proc param1,param2,param3 ... PROC1 endp
всё правильно делается. согласно Масм. а можно сделать так - в стек передавать значение переменной, и в вызываемой процедуре операция чтения 8 байт - так делается в Линуксе. в современном асм, push, заменены на короткие и скоростные операции. какие - читать ман/инфо GCC. и лучше и быстрее - асм на GCC компилируется без обращения к .lib Майкрософт опять же ман - ваш помощник.
хы,как-то не подумал : ).а по поводу gcc...у меня виста = (.Да и к тому же,как прикрутить к WinAsm gcc?)))))))))
Эм,а как в таком случае отличать числа от символов?) Например,PUSH 61 отладчик интерпретирует как ASCII('a'),а если мне нужно показать,что это число 61,а не символ 'a' ? В масм-то понятно,а вот в отладчике как...
продумано и сделано. MinGW - познавательно и добротно. кодил операции с работой памяти i686 - GCC асм отличился. скорость работы +25% и более. мичего сложного.
как именуется отладчик твой ? у меня Turbo Debugger - надёжный и проверенный. на днях ставил ОС`ь Linux From Scratch. всё бы хорошо, но при второй компиляции GCC 4.5.0 - сорвалось. зато с ArchLinux - всё ладно ))
Дак ведь gcc - сишный компиль,и значит размер файла должен увеличиться из-за мусора в ехе...Или я не прав ?
Люди( а мб и нелюди ) помогите с подготовкой к экзамену сижу уже третий день читаю книги выучил вродь все билеты, не могу разобратся с "плоской памятью" что за херь и с чем ее едят. только на пальцах а не компьтерным языком ) т.к что то очень замутно...
Плоская модель памяти — метод организации адресного пространства оперативной памяти вычислительных устройств. В плоской модели код и данные используют одно и то же адресное пространство. Для 16-битных процессоров плоская модель памяти позволяет адресовать 64 КБ оперативной памяти; для 32-битных процессоров 4 ГБ, для 64-битных - 16 эксабайт. т.е. память представляется считай единое целое (не разбитое на сегменты). т.е. считай лист бумаги на котором чтото написано. т.е. нет разеделения на сегменты и подобные вещи. по этому и назвали плоской моделью.
Как написать обработчик для нажатия по элемента меню на асм ?! Создать то можно,а как связать элемент,к примеру,закрытие файла и процедуру-обработчик ?! Можно с примером.