Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Asm для начинающих > Объясните пожалуйста! ASM под Windows


Автор: drZmeu 3.5.2007, 15:35
Объясните пожалуйста! Программирование на ASM под Windows
Привет знатоки ASM наверное самого интересного языка.
Я решил потихоньку начать изучать ASM под Windows и тут же наткнулся на проблему и понял что ничего пока не понимаю в ASM под Windows и под DOS наверное тоже =)))
Я в проекте попытался задействовать 3 WinAPI функции GetModuleFileName,
MessageBox,
ExitProcess
Так вот я не знаю как  правильно работать с функцией GetModuleFileName под ASM под C++ понятно!
Пожалуйста разъясните как и что куда вносить и т.д
Или отправьте куданить  где это объясняется.
С уважением,
drZmeu.

Код

format PE GUI 4.0
entry start
include 'win32a.inc'
section '.data' data readable writeable
_title TCHAR 'Name Progsss',0
_buf   dd ?
section '.code' code readable executable
start:
xor eax,eax
invoke GetModuleFileName,0,eax,DWORD[_buf]
mov [_buf],eax
invoke MessageBox,0,_buf,_title,MB_OK
invoke ExitProcess,0

section '.idata' import data readable writeable
library kernel32,'KERNEL32.DLL',\
user32,'USER32.DLL'
include 'api\kernel32.inc'
include 'api\user32.inc'  


Компилятор FASM 1.67.21 но это не очень важно.

Автор: drZmeu 3.5.2007, 18:18
Прощу прошения за свою нелепость и глупость уже разобрался сам  smile 
Тяжеловато переходить с Visual C++ на FASM  smile 
У мну есть ещё несколько вопросов например как склеить 2 строки дайте пожалуйста линк на какой нить ликбез по программирования на ASM под Windows

Кому интересно сделал то что хотел таким макаром
Код

format PE GUI 4.0
entry start
include 'win32a.inc' 
section '.data' data readable writeable  
_title TCHAR 'Name Progsss',0
_buf   rb 100h   
section '.code' code readable executable
start:                         
invoke GetModuleFileName,0,_buf,100h
invoke MessageBox,0,_buf,_title,MB_OK
invoke ExitProcess,0

section '.idata' import data readable writeable
library kernel32,'KERNEL32.DLL',\
user32,'USER32.DLL'
include 'api\kernel32.inc'
include 'api\user32.inc'          

Мне кажется что-то тут неправильно =\

Автор: anwe 3.5.2007, 18:22
Склеить две строки так:
lstrcat, addr_строки_к_которой_клеишь,addr добавляемой_строки

Автор: drZmeu 3.5.2007, 19:06
Ооо спасибо большое =)

Добавлено через 26 секунд
Я думал это только в C++ можно так =)))

Автор: anwe 3.5.2007, 19:36
invoke же еще.

Автор: drZmeu 3.5.2007, 20:34
Я думал invoke служит для объявления winAPI!

Автор: anwe 3.5.2007, 20:48
Это макроопределение, заменяющее call с передачей параметров вызываемой функции.

Автор: drZmeu 3.5.2007, 21:06
Хорошо вынужден согласится поскольку в ASM не рублю да и счетаю что ты прав =)
А можешь привести пример заменив invoke на call в моём верхнем примере?

Автор: anwe 3.5.2007, 21:27
Код

push   100h
push   _buf
push   0
call   GetModuleFileName

Автор: drZmeu 3.5.2007, 21:32
Оооо спасибо большое =)
А где об этом можно прочитать побольше просто пример я написал по подобию тех программ которые были в папке EXAMPLES и шли вместе в FASM
Или всё равно как писать что invoke что call ,,,???,,,

Добавлено через 4 минуты и 34 секунды
Эммммммм.
Я переписал так:
Код

format PE GUI 4.0
entry start
include 'win32a.inc' 
section '.data' data readable writeable  
_title TCHAR 'Name Progsss',0
_buf   rb 100h   
section '.code' code readable executable
start:                         
;------------------------------------
push 100h
push _buf
push 0
call GetModuleFileName
;------------------------------------
invoke MessageBox,0,_buf,_title,MB_OK
invoke ExitProcess,0

section '.idata' import data readable writeable
library kernel32,'KERNEL32.DLL',\
user32,'USER32.DLL'
include 'api\kernel32.inc'
include 'api\user32.inc'             

А он зараза меня на *** послал ='(

Автор: drZmeu 3.5.2007, 22:51
На самом деле чтоб не дергать вас уважаемые эксперты! Я хотел бы получить от вас направление на книжку или материал по ASM я опишу что я хочу узнать а решать вам! Просто я немогу слегка въехать 
в ASM после языка высокого уровня он настолько забивает мозги что ужс.
Я привожу пример кода в котором я буду говорить что мне непонятно а вы дайте мне направление на литературу!
Код

format PE GUI 4.0
entry start

include 'win32a.inc'  

section '.data' data readable writeable 

_title TCHAR 'Hellow World',0     ;Имя окна
_class TCHAR 'deeeeeeeee =)))',0 ;Его класс

wc WNDCLASS 0,WindowProc,0,0,NULL,NULL,NULL,COLOR_BTNFACE+1,NULL,_class   

msg MSG
section '.code' code readable executable
start:       
invoke GetModuleHandle,0  
mov [wc.hInstance],eax      
invoke LoadIcon,0,IDI_APPLICATION 
mov [wc.hIcon],eax
invoke LoadCursor,0,IDC_ARROW
mov [wc.hCursor],eax
invoke RegisterClass,wc

invoke CreateWindowEx,0,_class,_title,WS_VISIBLE+WS_DLGFRAME,128,128,256,192,NULL,NULL,[wc.hInstance] 

msg_loop:
invoke GetMessage,msg,NULL,0,0
or eax,eax
jz end_loop
invoke    TranslateMessage,msg
invoke    DispatchMessage,msg
jmp msg_loop

end_loop:
invoke ExitProcess,[msg.wParam]

proc WindowProc hwnd,wmsg,wparam,lparam
push ebx esi edi     
cmp [wmsg],WM_DESTROY
je  wmdestroy
defproc:
invoke DefWindowProc,[hwnd],[wmsg],[wparam],[lparam]
jmp    finish
wmdestroy:
invoke    PostQuitMessage,0
xor    eax,eax
finish:
pop    edi esi ebx
ret
endp

section '.idata' import data readable writeable

library kernel32,'KERNEL32.DLL',\
user32,'USER32.DLL'

include 'api\kernel32.inc'
include 'api\user32.inc'
 

Первое что меня интересует тут это 
Код

invoke GetModuleHandle,0  
mov [wc.hInstance],eax

Почему в wc.hInstance мы заносим содержимое из eax
Код

invoke GetMessage,msg,NULL,0,0
or eax,eax

Тоже самое я так понимаю eax выступает переменной в которой будет результат работы?
Код

proc WindowProc hwnd,wmsg,wparam,lparam
push ebx esi edi     

Вот тут если мы открываем стек то почему только для 3 параметров хотя WindowProc параметра 4
если мы конечно для него открываем если не для него то для чего тогда?
и т.д Вот мне собственно нужна книжечка где это будет описано!
Я правда извиняюсь за такие вопросы но мне нужна помощ ! =)))
С уважением,
drZmeu 

Автор: anwe 4.5.2007, 01:13
Цитата(drZmeu @  3.5.2007,  22:51 Найти цитируемый пост)
Первое что меня интересует тут это 

код Ассемблера
1:
2:

invoke GetModuleHandle,0  
mov [wc.hInstance],eax


Почему в wc.hInstance мы заносим содержимое из eax

wc.hInstance - это часть  структуры WNDCLASS, которая используется при регистрации класса твоего окна. А почему из еах? - Потому что результат выполнения API-функций помещается именно туда. Что означает wc.hInstance - ниже.

Цитата

код Ассемблера 
1:
2:

 invoke GetMessage,msg,NULL,0,0
or eax,eax


Тоже самое я так понимаю eax выступает переменной в которой будет результат работы?



Аналогично: результат в еах. А через or проверяется его  равенство нулю. Смотри строкой ниже идет сравнени jnz.

Цитата

код Ассемблера 
1:
2:

 proc WindowProc hwnd,wmsg,wparam,lparam
push ebx esi edi     

 
Вот тут если мы открываем стек то почему только для 3 параметров хотя WindowProc параметра 4
если мы конечно для него открываем если не для него то для чего тогда?



Посмотри на 48 строку кода. Там значение этих регистров восстанавливается. Так работаtт винда: она не затрагивает эти регистры и "надеется и ожидает от тебя", что и ты их не поменяешь. smile Поэтому их надо сохранить. 4 параметра функции здесь не причем.

Ну а теперь ссылки, как просил. Дополнение к первому вопросу про wc.hInstance конечно же найдешь в http://msdn.microsoft.com/library/default.asp. А начальная литература здесь: http://wasm.ru/publist.php?list=1

Автор: drZmeu 4.5.2007, 18:19
Оооо. Спасибо огромное что разъяснил очень многое стало понятно и за литературу огромное спасибо ;) тему можно считать закрытой =)
Ещё раз спасибо anwe тебе +1 =)

Автор: drZmeu 4.5.2007, 23:54
И заключительный вопрос! =)
Почему не работает этот код
Код

format PE GUI 4.0
entry start
include 'win32a.inc' 
section '.data' data readable writeable  
_title TCHAR 'Name Progsss',0
_buf   rb 100h   
section '.code' code readable executable
start:                         
;------------------------------------
push 100h
push _buf
push 0
call GetModuleFileName
;------------------------------------
invoke MessageBox,0,_buf,_title,MB_OK
invoke ExitProcess,0
section '.idata' import data readable writeable
library kernel32,'KERNEL32.DLL',\
user32,'USER32.DLL'
include 'api\kernel32.inc'
include 'api\user32.inc'   

Я поковырялся в отладчике и так меня и не осенило =( Но кое что я понял! Да вы и сами поймете загрузив программу в OllyDbg или в какой нить другой отладчик!
Ну и конечно рабочий вариант
Код

format PE GUI 4.0
entry start
include 'win32a.inc' 
section '.data' data readable writeable  
_title TCHAR 'Name Progsss',0
_buf   rb 100h   
section '.code' code readable executable
start:                         
invoke GetModuleFileName,0,_buf,100h
invoke MessageBox,0,_buf,_title,MB_OK
invoke ExitProcess,0
section '.idata' import data readable writeable
library kernel32,'KERNEL32.DLL',\
user32,'USER32.DLL'
include 'api\kernel32.inc'
include 'api\user32.inc'          

А вопрос мой почему же не работает?
С уважением,
drZmeu

Автор: anwe 5.5.2007, 00:53
Не наю, не наю. В MASM'е работает и так и так.
А, кажется, догадываюсь. Надо прописать соглашение о передаче параметров функции: как в сях stdcall. Но где - не знаю.

Автор: drZmeu 5.5.2007, 03:06
Будем рыть =) Может кто-то знает =)
А на самом деле как лутше? 
Так
Код

push 100h
push _buf
push 0
call GetModuleFileName

или так
Код

invoke GetModuleFileName,0,_buf,100h

или разницы нету?
Я в отладчике ковырялся вроде всё также только одно работает а второе нет =)))

Автор: anwe 5.5.2007, 11:21
По сути дела - по вкусу.

Автор: drZmeu 5.5.2007, 15:55
Спасибо! Но всё же может кто сталкивался с этой проблемой?

Автор: dumb 5.5.2007, 17:00
это не проблема, а незнание синтаксиса... smile
Код

invoke GetModuleFileName,0,ADDR _buf,100h

Автор: drZmeu 5.5.2007, 21:59
dumb я очень признателен за 4 байта кода которые Вы добавили но я только начал изучать ASM! =)
Было бы неплохо если бы Вы подсказали почему не работает этот код:
Код

push 100h
push _buf
push 0
call GetModuleFileName

А по поводу ADDR большое спасибо =) Всегда рад получить хороший пример!
С уважением,
drZmeu =)

Автор: anwe 5.5.2007, 22:01
drZmeu, посмотри внимательно, тебе же написали ADDR, что означает адрес переменной. Для твоего примера так:
Код

push 100h
push addr _buf
push 0
call GetModuleFileName

Автор: drZmeu 5.5.2007, 22:42
Эмммм. Я бивень не понял =)
Извиняюсь только вот что пишет компилятор в этом случае
Error: undefined symbol.
Instruction:
push addr _buf


=\
Может в начале какойто inc нужно подключить?

Автор: anwe 5.5.2007, 22:46
inc у тебя уже подключен. Попробуй вместо addr написать offset. Если нет - то нет. Я не знаю синтаксиса Fasm'а.

Автор: drZmeu 5.5.2007, 22:53
Неть не хочет гад! =(

Автор: drZmeu 5.5.2007, 23:41
Странно но полазив по форума и поюзав Serch я наткнулся на пару примеров =\
Вот код работающий 
Код

format PE GUI 4.0
entry start
include 'win32a.inc' 
section '.data' data readable writeable  
_title TCHAR 'Name Progsss',0
_buf   rb 100h   
section '.code' code readable executable
start:                          

;-----invoke GetModuleFileName,0,_buf,100h

push 100h
push _buf
push 0
call [GetModuleFileName]
;------------------------------------
invoke MessageBox,0,_buf,_title,MB_OK
invoke ExitProcess,0

section '.idata' import data readable writeable
library kernel32,'KERNEL32.DLL',\
user32,'USER32.DLL'
include 'api\kernel32.inc'
include 'api\user32.inc'  

Бред почему именно так =\
парни но без вашей помощи яб не разобрался спасибо вам anwe и dumb =)
Тема закрыта окончательно =)

Автор: anwe 5.5.2007, 23:48
drZmeu, а отличия видишь? smile 

Автор: drZmeu 6.5.2007, 03:34
в отладчике нет =)
Ну а в коде конечно да =)
Ладно всем огромное спасибо за ответы  smile 
=)

Автор: anwe 6.5.2007, 11:29
Код

call [GetModuleFileName]
 вызвать функцию по адресу GetModuleFileName, по которому находится реальная функция.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)