[ Assembler ] — начинающим: задаем вопросы

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by !_filin_!, 25 May 2007.

  1. Welemir

    Welemir Elder - Старейшина

    Joined:
    10 Jan 2008
    Messages:
    229
    Likes Received:
    11
    Reputations:
    -4
    Почему поток не выводит значение еах ? :


    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
    
    
    
     
    #781 Welemir, 4 Aug 2010
    Last edited: 4 Aug 2010
  2. Welemir

    Welemir Elder - Старейшина

    Joined:
    10 Jan 2008
    Messages:
    229
    Likes Received:
    11
    Reputations:
    -4
    должен быть результат 50-и разового прибавления 5-и к eax с последующим его сохранением.
     
  3. Marra_Kesh

    Marra_Kesh New Member

    Joined:
    8 Aug 2010
    Messages:
    9
    Likes Received:
    0
    Reputations:
    0
    Мир всем местным, как на fasme сперва создать файл, а потом внести туда информацию в несколько строк.
    Например:
    строка 1
    строка 2
    строка 3
    строка N??? Спасибо!
     
  4. Catbert

    Catbert Banned

    Joined:
    29 Jun 2010
    Messages:
    80
    Likes Received:
    27
    Reputations:
    10
    Примерно так:
    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 ?
    
    
     
    2 people like this.
  5. Welemir

    Welemir Elder - Старейшина

    Joined:
    10 Jan 2008
    Messages:
    229
    Likes Received:
    11
    Reputations:
    -4
    Такой вот нупский вопрос: Как занести символ в стек ? Олька сразу исправляет на дворд(
     
  6. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    в кто тебе не дает исправить тока нужный быйт в dword ? или же взять адрес памяти того места где надо чтото поменять и в нижнем окошке перейти на этот адрес и подправить сразу
     
  7. Marra_Kesh

    Marra_Kesh New Member

    Joined:
    8 Aug 2010
    Messages:
    9
    Likes Received:
    0
    Reputations:
    0
    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 файла просто ужасного качества. Почему так происходит?
     
  8. Welemir

    Welemir Elder - Старейшина

    Joined:
    10 Jan 2008
    Messages:
    229
    Likes Received:
    11
    Reputations:
    -4

    Эм...я эти данные хотел передать процедуре через стек,а он требует адресации дворд... через INVOKE не хочу(.Приведи,пожалуйста,пример для ясности,если не сложно.
     
  9. zeppe1in

    zeppe1in Elder - Старейшина

    Joined:
    12 Jul 2006
    Messages:
    343
    Likes Received:
    66
    Reputations:
    18
    ты бы сам пример привёл для ясности что ты хочешь. Процедура твоя? передай через регистр например свой байт.
     
  10. Welemir

    Welemir Elder - Старейшина

    Joined:
    10 Jan 2008
    Messages:
    229
    Likes Received:
    11
    Reputations:
    -4
    Процедура моя.Я хотел передать ЧЕРЕЗ стек,как.Например,моя цель - передать пять раз буковку а.Делаю:





    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
     
    #790 Welemir, 10 Aug 2010
    Last edited: 10 Aug 2010
  11. altblitz

    altblitz Elder - Старейшина

    Joined:
    5 Jun 2009
    Messages:
    3,691
    Likes Received:
    3,145
    Reputations:
    236
    всё правильно делается. согласно Масм.
    а можно сделать так - в стек передавать значение переменной,
    и в вызываемой процедуре операция чтения 8 байт - так делается в Линуксе.

    в современном асм, push,
    заменены на короткие и скоростные операции.

    какие - читать ман/инфо GCC.

    и лучше и быстрее - асм на GCC компилируется без обращения к .lib Майкрософт
    опять же ман - ваш помощник.
     
    #791 altblitz, 10 Aug 2010
    Last edited: 10 Aug 2010
  12. Welemir

    Welemir Elder - Старейшина

    Joined:
    10 Jan 2008
    Messages:
    229
    Likes Received:
    11
    Reputations:
    -4
    хы,как-то не подумал : ).а по поводу gcc...у меня виста = (.Да и к тому же,как прикрутить к WinAsm gcc?)))))))))
     
  13. Welemir

    Welemir Elder - Старейшина

    Joined:
    10 Jan 2008
    Messages:
    229
    Likes Received:
    11
    Reputations:
    -4
    Эм,а как в таком случае отличать числа от символов?) Например,PUSH 61 отладчик интерпретирует как ASCII('a'),а если мне нужно показать,что это число 61,а не символ 'a' ? В масм-то понятно,а вот в отладчике как...
     
  14. altblitz

    altblitz Elder - Старейшина

    Joined:
    5 Jun 2009
    Messages:
    3,691
    Likes Received:
    3,145
    Reputations:
    236
    продумано и сделано.
    MinGW - познавательно и добротно.

    кодил операции с работой памяти i686 - GCC асм отличился.
    скорость работы +25% и более. мичего сложного.
     
  15. altblitz

    altblitz Elder - Старейшина

    Joined:
    5 Jun 2009
    Messages:
    3,691
    Likes Received:
    3,145
    Reputations:
    236
    как именуется отладчик твой ?
    у меня Turbo Debugger - надёжный и проверенный.

    на днях ставил ОС`ь Linux From Scratch.
    всё бы хорошо, но при второй компиляции GCC 4.5.0 - сорвалось.
    зато с ArchLinux - всё ладно ))
     
    #795 altblitz, 10 Aug 2010
    Last edited: 10 Aug 2010
  16. Welemir

    Welemir Elder - Старейшина

    Joined:
    10 Jan 2008
    Messages:
    229
    Likes Received:
    11
    Reputations:
    -4
    надёжный и проверенный мною Olly Debugger )))
     
  17. Welemir

    Welemir Elder - Старейшина

    Joined:
    10 Jan 2008
    Messages:
    229
    Likes Received:
    11
    Reputations:
    -4
    Дак ведь gcc - сишный компиль,и значит размер файла должен увеличиться из-за мусора в ехе...Или я не прав ?
     
  18. Yetisports

    Yetisports Banned

    Joined:
    11 Jul 2010
    Messages:
    147
    Likes Received:
    12
    Reputations:
    17
    Люди( а мб и нелюди ) помогите с подготовкой к экзамену сижу уже третий день читаю книги выучил вродь все билеты, не могу разобратся с "плоской памятью" что за херь и с чем ее едят. только на пальцах а не компьтерным языком ) т.к что то очень замутно...
     
  19. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    Плоская модель памяти — метод организации адресного пространства оперативной памяти вычислительных устройств. В плоской модели код и данные используют одно и то же адресное пространство. Для 16-битных процессоров плоская модель памяти позволяет адресовать 64 КБ оперативной памяти; для 32-битных процессоров 4 ГБ, для 64-битных - 16 эксабайт.

    т.е. память представляется считай единое целое (не разбитое на сегменты). т.е. считай лист бумаги на котором чтото написано. т.е. нет разеделения на сегменты и подобные вещи. по этому и назвали плоской моделью.
     
  20. Welemir

    Welemir Elder - Старейшина

    Joined:
    10 Jan 2008
    Messages:
    229
    Likes Received:
    11
    Reputations:
    -4
    Как написать обработчик для нажатия по элемента меню на асм ?! Создать то можно,а как связать элемент,к примеру,закрытие файла и процедуру-обработчик ?! Можно с примером.