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

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

  1. MTV

    MTV New Member

    Joined:
    16 Feb 2011
    Messages:
    180
    Likes Received:
    2
    Reputations:
    0
    Ребят,вот создаю окно и компонент edit.А как мне сделать, что-бы тект из edit выводился в MessageBox?Вот код:
    Code:
    	.386
    	.model flat,stdcall
    	option casemap:none
    	include C:\masm32\include\windows.inc
    	include C:\masm32\include\user32.inc
    	include C:\masm32\include\kernel32.inc
    	include C:\masm32\include\gdi32.inc
    	include C:\masm32\include\comdlg32.inc
    	include C:\masm32\include\shell32.inc
    	includelib C:\masm32\lib\user32.lib
    	includelib C:\masm32\lib\kernel32.lib
    	includelib C:\masm32\lib\gdi32.lib
    	includelib C:\masm32\lib\comdlg32.lib
    	includelib C:\masm32\lib\shell32.lib
    WinMain proto :DWORD,:DWORD,:DWORD,:DWORD
    RGB macro red,green,blue
    	xor		eax,eax
    	mov		ah,blue
    	shl		eax,8
    	mov		ah,green
    	mov		al,red
    endm
    szText MACRO Name,Text:VARARG
    	LOCAL	lbl
    	jmp		lbl
    	Name	db Text,0
    	lbl:
    ENDM
    .const
    edit1ID			equ 1
    button1ID		equ 2
    .data?
    hFontN			HWND ?
    hwndedit1		HWND ?
    hwndbutton1		HWND ?
    hInstance		HINSTANCE ?
    CommandLine		LPSTR ?
    .data
    FontName		db "MS Sans Serif",0
    lf				LOGFONT <>
    Textedit1		db "Edit1",0
    Textbutton1		db "Button1",0
    ;_______________
    ClassName		db "MASM Builder",0
    BtnClName		db "button",0
    StatClName		db "static",0
    EditClName		db "edit",0
    LboxClName		db "listbox",0
    CboxClName		db "combobox",0
    ReditClName		db "richedit",0
    RichEditLib		db "riched32.dll",0
    Caption			db "Form",0
    ;_______________
    .code
    start:
    	invoke	GetModuleHandle,NULL
    	mov		hInstance,eax
    	invoke	GetCommandLine
    	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
    LOCAL hwnd	:HWND
    	mov		wc.cbSize,SIZEOF WNDCLASSEX
    	mov		wc.style,CS_BYTEALIGNCLIENT
    	mov		wc.lpfnWndProc,offset WndProc
    	mov		wc.cbClsExtra,NULL
    	mov		wc.cbWndExtra,NULL
    	push	hInst
    	pop		wc.hInstance
    	mov		wc.hbrBackground,COLOR_BTNFACE+1
    	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,0,ADDR ClassName,ADDR Caption,WS_SYSMENU or WS_MINIMIZEBOX,380,75,315,200,0,0,hInst,0
    	mov		hwnd,eax
    	INVOKE	ShowWindow,hwnd,SW_SHOWNORMAL
    	INVOKE	UpdateWindow,hwnd
    	.WHILE TRUE
    		invoke	GetMessage,ADDR msg,0,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
    		invoke	lstrcpy,addr lf.lfFaceName,addr FontName
    		mov		lf.lfHeight,-11
    		mov		lf.lfWeight,500
    		invoke	CreateFontIndirect,addr lf
    		mov		hFontN,eax
    invoke CreateWindowEx,WS_EX_CLIENTEDGE,ADDR EditClName,ADDR Textedit1,WS_CHILD or ES_LEFT or ES_AUTOHSCROLL or WS_VISIBLE,152,48,121,21,hWnd,edit1ID,hInstance,0
    		mov		hwndedit1,eax
    		invoke	SendMessage,hwndedit1,WM_SETFONT,hFontN,1
    invoke CreateWindowEx,0,ADDR BtnClName,ADDR Textbutton1,WS_CHILD or BS_DEFPUSHBUTTON or WS_VISIBLE,32,48,75,25,hWnd,button1ID,hInstance,0
    		mov		hwndbutton1,eax
    		invoke	SendMessage,hwndbutton1,WM_SETFONT,hFontN,1
    	.ELSEIF uMsg == WM_COMMAND
    		mov	eax,wParam
    		.IF lParam != 0
    			.IF ax == button1ID
    				shr eax,16
    				.IF ax == BN_CLICKED
    					invoke	MessageBox,hWnd,addr Textedit1,0,MB_ICONINFORMATION
    				.ENDIF
    			.ENDIF
    		.ENDIF;
    	.ELSE
    		invoke	DefWindowProc,hWnd,uMsg,wParam,lParam
    		ret
    	.ENDIF
    	xor		eax,eax
    	ret
    WndProc endp
    end start
    У меня выводится только edit1.А мне надо,что-бы выводилось то, что я написал в edit!
     
  2. DooD

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

    Joined:
    30 Sep 2010
    Messages:
    1,168
    Likes Received:
    442
    Reputations:
    288
    юзай GetWindowText
     
  3. MTV

    MTV New Member

    Joined:
    16 Feb 2011
    Messages:
    180
    Likes Received:
    2
    Reputations:
    0
    Народ,а как можно с помощью winsock сделать так,что бы сервер отправлял данные клиенту? Можно ли вообще так?
     
  4. MASM

    MASM New Member

    Joined:
    8 Jun 2011
    Messages:
    22
    Likes Received:
    0
    Reputations:
    0
    MTV :) (На MASM) Как то так.

    .DATA
    sMsg db "Сообщение",0

    .DATA ?
    buffer db 512 dup(?)

    .IF ax==IDM_GETTEXT
    invoke GetWindowText,hwndedit1, ADDR buffer,512
    invoke MessageBox,NULL,ADDR buffer,ADDR sMsg,MB_OK+MB_ICONINFORMATION

    ...
     
  5. MASM

    MASM New Member

    Joined:
    8 Jun 2011
    Messages:
    22
    Likes Received:
    0
    Reputations:
    0
    В winsock есть такая функция называется Send =)))

    Вот глянь сюда: http://mysystem.ucoz.ru/publ/masm/rabota_s_protokolom_socks5_na_masm/4-1-0-52

    .
     
  6. realcoder

    realcoder Member

    Joined:
    9 Dec 2010
    Messages:
    226
    Likes Received:
    11
    Reputations:
    4
    есть пара вопросов по masm:
    1. как инициализирвоать массив при объявлении?
    например в си вот так делается:
    Code:
    unsigned char dump[]={ 0x01 ,0x02 ,0x03 ,0x04,0x05, 0x06,0x07,0x08,0x09, 0x0A, 0x0B,0x0C, 0x0D,0x0E,0x0f}
    
    как такое же сделать на асме?
    или можно только задавать начальное значение всех элементов при объявлении? вот так:
    Code:
    .DATA
    ...
    ololo DWORD 1024 dup(начальное_значение)
    ...
    .CODE
    ....
    
    2. расскажите поподробнее про подпрограммы в masm, а именно
    - про вершину стека, т.е. что нужно писать после оператора RET, чтобы корректно выйти из подрограммы, надо ли чтото делать с регистром еsp при вызове функции через оператор call и т.д.
    - про возврат значения. т.е. как корректно возвратить значение из подпрограммы: просто поместить его в eax?
     
  7. GRRRL Power

    GRRRL Power Elder - Старейшина

    Joined:
    13 Jul 2010
    Messages:
    823
    Likes Received:
    185
    Reputations:
    84
    Code:
    .data
    ololo dd 1,2,3,4,5
    
    Так, как ты написал, тоже можно.

    После оператора ret ничего не надо писать. Вопрос про esp и call мутный, потому что все зависит от того, какую процедуру ты вызываешь, какое у нее соглашение вызовов.
    Вопрос про возврат значения - да, поместить в eax. Хотя если ты собираешься писать собственные процедуры, ничего не мешает тебе отказаться от общепринятых соглашений вызовов и возвращать значение в других регистрах или вообще в стеке.
     
    1 person likes this.
  8. MTV

    MTV New Member

    Joined:
    16 Feb 2011
    Messages:
    180
    Likes Received:
    2
    Reputations:
    0
    А кто подскажет как сделать вывод текста в memo.Наример,создал форму с memo потом получаю инфу и вывожу в memo?Какая функция обнавляет memo?
     
  9. becensed

    becensed Member

    Joined:
    2 Dec 2009
    Messages:
    84
    Likes Received:
    24
    Reputations:
    1
    Memo - это обычный editbox с ES_MULTILINE.
    Советую МСДН (клац)
     
  10. MASM

    MASM New Member

    Joined:
    8 Jun 2011
    Messages:
    22
    Likes Received:
    0
    Reputations:
    0
    Есть код DLL экспортирующий одну функцию. Как его вызвать с прогии ?
    Вот код DLL:

    ; ======================================================
    include \masm32\include\masm32rt.inc
    include \masm32\include\windows.inc
    include \masm32\include\user32.inc
    include \masm32\include\kernel32.inc
    include \masm32\include\shell32.inc
    include \masm32\include\advapi32.inc
    include \masm32\macros\macros.asm

    includelib \masm32\lib\user32.lib
    includelib \masm32\lib\shell32.lib
    includelib \masm32\lib\kernel32.lib
    includelib \masm32\lib\advapi32.lib
    ;========================================================

    include c:\masm32\macros\macros.asm

    ;========================================================

    szText MACRO Name, Text:VARARG
    LOCAL lbl
    jmp lbl
    Name db Text,0
    lbl:
    ENDM

    .data
    AppName db "DLL",0
    LoadMsg db "Библиотека MyDLL.dll загружена",0
    UnloadMsg db "Библиотека MyDLL.dll выгружена",0


    .data?
    hInstance dd ?
    hSnapshot HANDLE ?
    ProcEnt PROCESSENTRY32 <?>
    pi PROCESS_INFORMATION <>
    sinf STARTUPINFO <>

    .code

    ; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««

    LibMain proc instance:DWORD,reason:DWORD,unused:DWORD
    .if reason == DLL_PROCESS_ATTACH
    mrm hInstance, instance
    mov eax, TRUE
    invoke MessageBox,NULL,addr LoadMsg,addr AppName,MB_OK
    .elseif reason == DLL_PROCESS_DETACH
    invoke MessageBox,NULL,addr UnloadMsg,addr AppName,MB_OK
    .endif
    ret
    LibMain endp

    ; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««

    MyLibProc proc EName:DWORD
    invoke CreateProcess,NULL,ADDR EName,NULL,NULL,FALSE,0,NULL,NULL,addr sinf,addr pi
    mov esi,pi.hProcess
    invoke WaitForSingleObject,esi,INFINITE
    ret
    MyLibProc endp

    ; «««««««««««««««««««««««««««««««««««««««««««««««««««««««
    Вот приложение но не знаю как все это организовать:

    .486
    .model flat,stdcall
    option casemap:none

    ;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
    ; ПОДКЛЮЧАЕМЫЕ МОДУЛИ
    ;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

    include \masm32\include\windows.inc
    include \masm32\include\user32.inc
    include \masm32\include\kernel32.inc
    includelib \masm32\lib\kernel32.lib
    includelib \masm32\lib\user32.lib

    .data
    LibName db "mydll.dll",0
    FunctionName db "MyLibProc",0
    DllNotFound db "Библиотека mydll.dll не может быть загружена",0
    AppName db "Загрузка библиотеки mydll.dll",0
    FunctionNotFound db "Запущена функция из библиотеки mydll.dll",0

    .data?
    hLib dd ?
    TestDLLAddr dd ?

    .code
    start:
    invoke LoadLibrary,addr LibName
    .if eax==NULL
    invoke MessageBox,NULL,addr DllNotFound,addr AppName,MB_OK
    .else
    mov hLib,eax
    invoke GetProcAddress,hLib,addr FunctionName
    .if eax==NULL
    invoke MessageBox,NULL,addr FunctionNotFound,addr AppName,MB_OK
    .else
    ;=========================================================================
    ;=========================Что здесь дальше делать ? ======================
    ;=========================================================================
    .endif
    invoke FreeLibrary,hLib
    .endif
    invoke ExitProcess,NULL
    end start

    =========================================================
     
  11. DooD

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

    Joined:
    30 Sep 2010
    Messages:
    1,168
    Likes Received:
    442
    Reputations:
    288
    push offset EName
    call mylibproc
     
    #1071 DooD, 3 Aug 2011
    Last edited: 3 Aug 2011
  12. MASM

    MASM New Member

    Joined:
    8 Jun 2011
    Messages:
    22
    Likes Received:
    0
    Reputations:
    0
    Исправил так:

    push offset EName
    call TestDLLAddr

    Сейчас выдает ошибку:

    [​IMG]
     
  13. DooD

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

    Joined:
    30 Sep 2010
    Messages:
    1,168
    Likes Received:
    442
    Reputations:
    288
    ну так ты поместил указатель в eax?
    mov handle,eax
    push param
    call proc
     
  14. MASM

    MASM New Member

    Joined:
    8 Jun 2011
    Messages:
    22
    Likes Received:
    0
    Reputations:
    0
    указатель чего ? Делаю так но выдает ту же ошибку:

    .486
    .model flat,stdcall
    option casemap:none

    include C:\masm32\include\windows.inc
    include C:\masm32\include\user32.inc
    include C:\masm32\include\kernel32.inc
    includelib C:\masm32\lib\kernel32.lib
    includelib C:\masm32\lib\user32.lib

    .data
    LibName db "mydll.dll",0
    FunctionName db "MyLibProc",0
    DllNotFound db "Библиотека mydll.dll не может быть загружена",0
    AppName db "Загрузка библиотеки mydll.dll",0
    FunctionNotFound db "Запущена функция из библиотеки mydll.dll",0
    EName db "notepad.exe",0

    .data?
    hLib dd ?
    TestDLLAddr dd ?

    .code
    start:
    invoke LoadLibrary,addr LibName
    .if eax==NULL
    invoke MessageBox,NULL,addr DllNotFound,addr AppName,MB_OK
    .else
    mov hLib,eax
    ;invoke GetProcAddress,hLib,addr FunctionName
    .if eax==NULL
    invoke MessageBox,NULL,addr FunctionNotFound,addr AppName,MB_OK
    .else
    ===============================
    ===============================
    mov TestDLLAddr,eax
    push offset EName
    Call TestDLLAddr
    ===============================
    ===============================
    .endif
    invoke FreeLibrary,hLib
    .endif
    invoke ExitProcess,NULL
    end start
    ==============================================
     
  15. DooD

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

    Joined:
    30 Sep 2010
    Messages:
    1,168
    Likes Received:
    442
    Reputations:
    288
    как экспортируешь в def файле? по идее должно работать
     
  16. MASM

    MASM New Member

    Joined:
    8 Jun 2011
    Messages:
    22
    Likes Received:
    0
    Reputations:
    0
    Так mydll.def :

    LIBRARY mydll
    EXPORTS MyLibProc

    ;=======
     
  17. becensed

    becensed Member

    Joined:
    2 Dec 2009
    Messages:
    84
    Likes Received:
    24
    Reputations:
    1
    Вот тебе АРХИВЧИК, делай по образу и подобию.
     
  18. MTV

    MTV New Member

    Joined:
    16 Feb 2011
    Messages:
    180
    Likes Received:
    2
    Reputations:
    0
    Что-то я не до конца разобрался с memo.Вот я получаю инфу в переменную и с помощью SetWindowText,хочу что-бы она вывелась в memo.Но нечего не получается(Правильно ли я делаю?
     
  19. DooD

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

    Joined:
    30 Sep 2010
    Messages:
    1,168
    Likes Received:
    442
    Reputations:
    288
    MTV что именно не получается?
     
  20. becensed

    becensed Member

    Joined:
    2 Dec 2009
    Messages:
    84
    Likes Received:
    24
    Reputations:
    1
    Погоди, я постараюсь наладить телепатическую связь......


    .....

    нет, не получается, абонент не доступен... Извини...