PDA

Просмотр полной версии : Часики [ASM]


yeti
17.08.2007, 14:31
Народ, что-то мне пришла в голову бредовая идея.. сделать простейшие часики на asm'е... Написать самой. для практики.. а то как собака - вроде и понимаешь, а сделать ничего не можешь. надо это исправлять. погуглила.. нашла для процессора .486p - понятно, что это не то... Можно конечно переделать.. но я не вникала особо в архитектуру. Точнее не настолько, чтобы самой грамотно сделать. Так что напортачу 100% Может кто-нибудь обьяснить по какому вообще ПРИНЦИПУ все это строится? всмсыле не сам код, а порядок и по какой вообще логике идет все это. а то сижу тут, часа 3 голову ломаю..

Просто думаю, что код и сама смогу составить.. А вот ЧТО ИМЕННО там надо делать, можно поподробней плз? А тупо копировать код не хотелось бы. Важен сам принцип.. Кто сможет помочь?

ПС: сначала дельные мысли, потом флудите и стебитесь сколько хотите.. Мне пофиг..
ППС: хотя бы в кодинге не оффтопьте.. как людей прошу..

Ni0x
17.08.2007, 14:54
самый простой вариант получать время винапи функцией GetLocalTime(), тебе понадобится структура SYSTEMTIME(переменные wHour, wMinute, wSecond).

SYSTEMTIME sm;
while(true)
{
GetLocalTime(&sm);
//выводим текущие значения
...
//Cпим секунду
Sleep(1000);
}

Это просто принцип.

yeti
17.08.2007, 15:00
хмм. как я не догадалась. а то мудрила чето с прерываниями.. с таймерами.. а на деле.. хмм. надо будет разобраться.

ПС: просила же код не давать)) так неинтересно будет))

Alexsize
17.08.2007, 15:05
Ну начни для начала не с асма а с си. Примени там эту апишку, а потом, когда поймешь, что почем, напиши и на асме!

yeti
17.08.2007, 15:07
Alexsize, я прошу именно на асме. то есть я на СИ не знаю ничего ВООБЩЕ. и в данный момент, мне интересней асм.. можно было вообще на пхп сделать и не заморачиваться. а в чем тогда вся прелесть? на асме я итак напишу, без С

Ni0x
17.08.2007, 15:24
Alexsize, тебе не всеравно? Интересует ее асм, пусть пишет на нем, а ложные выдумки, что асм сложнее С оставьте при себе.

Alexsize
17.08.2007, 15:27
Alexsize, тебе не всеравно? Интересует ее асм, пусть пишет на нем, а ложные выдумки, что асм сложнее С оставьте при себе.
Курил? Я что писал что асм сложнее? Чего ты не по теме влазиешь то? Помог ей чем?
To Shnurovka: клац (http://www.avhohlov.narod.ru/p1100ru.htm)

biophreak
17.08.2007, 15:30
Хм...как одно из решений:
1. Напиши на си(не важно, использешь ты апи или нет).
2. Отруби оптимизацию в компиляторе и линковщике.
3. Дизассемблируй что получилось - и посмотри....если знаешь основы ассемблера - все поймешь!

ЗЫЖ Не ругай по почкам плз :)

yeti
17.08.2007, 15:39
biophreak, кажется я ясно написала, что на С я НЕ ПИШУ. ))) пинать само собой не буду)) потому что без всякого стеба дал совет.. Что уже прогресс.. На ачате-то

кароч я поняла все. на днях займусь. а то чет слишком устала...

ПС: если у кого есть еще дельные предложения безо всяких там С и т.д, то постите - мне интересно сделать разными способами.. Не помешает в любом случае..


Alexsize, да, я вижу программу-часы. но она под дос.. а учить лучше что-то одно. Но все равно спасибо..

biophreak
17.08.2007, 15:47
Насчет принципа - имхо все просто!
скелет программы(типа модели, заголовков, либ - пропускаем :))
1. Создаешь "цикл" (хотя как такового понятия цикл в асме нет, но все же :))
2. Принтишь время. (вызываешь ту же WinAPI ф-ию для показа времени)
4. Делешь задержку в 1с
5. Выполняешь пункт 2, очищая экран(если надо - возвращаешься в ту позицию, где прошлый раз принтили время) =)

Вроде так...это для консоли...
Советую писать на fasm - ИМХО наиболее удобный из ассемблеров!
В нем есть прототипы почти всех WinAPI ф-ий...

yeti
17.08.2007, 15:48
biophreak, я и на масм не жалуюсь вроде..

biophreak
17.08.2007, 15:49
Просто плюс fasma в том что на нем удобно писать макросы - очень помогает при дальнейшей работе...

ЗЫЖ И убедился на себе, что майкрософтовский оптимизатор - вещь совершенно не нужная и, извините, дурная :))
ЗЗЫЖ А убедился - когда мне надо было с TASM на MASM перенести код - код перенес, он работал, но работал неправильно(то-ли в масме другие представления о регистрах, толи хз) - забил на идею, перенес на фасм - все заработало с минимальными изменениями :))

GoreMaster
17.08.2007, 15:52
ЗЗЫЖ А убедился - когда мне надо было с TASM на MASM перенести код - код перенес, он работал, но работал неправильно(то-ли в масме другие представления о регистрах, толи хз) - забил на идею, перенес
Значит ты чайник,сори ничего личного...
Начинать кодить на асме надо без использования макросов,чтобы понять принцип...

biophreak
17.08.2007, 15:54
Согласен...и с первым утверждением и со вторым :)
АСМ от меня далеко...я предпочитаю языки более высокого уровня...да и не надо как то было! :)

ЗЫЖ Вообще как-то к продукции мелкомягких отношусь с недоверием...
ЗЗЫЖ Надо учиться кодить без макросов, но - согласись с ними удобнее, особенно если проект большой :)

yeti
17.08.2007, 15:55
особенно тем, кто кодить-то особо не умеет =\

мдее. типа меня.. НО учиться никогда не поздно.. честно говоря, пока что меня все устраивает. перейти можно будет и потом... если потребуется

dmnt
17.08.2007, 15:55
fasm, C .... masm32! ;)
этого должно хватить c:\masm32\EXAMPLE8\JACTS\

NetMan
17.08.2007, 18:38
Shnurovka > см. в MSDN функцию SetTimer и сообщение WM_TIMER...

W!z@rD
17.08.2007, 19:49
хек не понимаю... Девчонка интересуется... и что?? =?
или тяга к знаниям уже не в моде?
уважайте чужие интересы... =/
ибо если она девушка значит у нее нет конструктивно-кодерского мышления?!!
не стоит так... ибо еще не известно... Шну может знать больше чем некоторые мемберы ачата...

а вообще шну msdn.com, rsdn.ru, wasm.ru

biophreak
17.08.2007, 22:22
насчет доков - forum.vingrad.ru
и не только по асму :)

_Great_
18.08.2007, 14:37
Shnurovka, KEZ, inv, Alexsize - выяснения отношений в ПМ. В следующий раз модераторы, которые оффтопят, получат минус - в основном это касается Alexsize.
Надеюсь, я ясно выражаюсь.

По теме - нафига таймеры использовать, GetLocalTime/Sleep вполне пойдет.

NetMan
18.08.2007, 14:46
По теме - нафига таймеры использовать, GetLocalTime/Sleep вполне пойдет.
Установить таймер (например, на 1 секунду) и по сообщению WM_TIMER получать время с помощью GetLocalTime и отображать его.

_Great_
18.08.2007, 23:04
Имхо это не универсально) хотя хз. вообщемто без разницы.. просто не долюблюваю эти таймеры почемуто хз)

KEZ
19.08.2007, 06:33
> Shnurovka, KEZ, inv, Alexsize - выяснения отношений в ПМ. В следующий раз модераторы, которые оффтопят, получат минус - в основном это касается Alexsize.

о, грит типа понтанулся как следует
так чего ты сегодня мне говорил около супермаркета, обдолбавшись растворителем? : D

Zulf
19.08.2007, 06:51
Грит из ГНК, ему можно лишний раз ширнуться :)

_Great_
19.08.2007, 10:48
о, грит типа понтанулся как следует
так чего ты сегодня мне говорил около супермаркета, обдолбавшись растворителем? : D
Ну понтанулся, кез, молодец, молодец )) Типа видел крутого кодера под растворителем :d
А говорил я тебе про Pe формат :p
Ладно, заканчиваем оффтопить)

NetMan
19.08.2007, 15:51
Имхо это не универсально) хотя хз. вообщемто без разницы.. просто не долюблюваю эти таймеры почемуто хз)
Почему неуниверсально? За что не долюбливаешь?
Смотрим здесь часики (http://subscribe.ru/archive/comp.soft.prog.asm32/200607/31235147.html)...

sn0w
20.08.2007, 15:03
напиши с использованием системного таймера в плоть до учета микросекунд, добавь будильник при помощи системного динамика, длина волны и период выщитываются в 2 цикла

yeti
20.08.2007, 23:35
Жжошь... ыы.. мне б такой сначала написать)) уже начала кстати

in process.....................

yeti
24.08.2007, 22:50
Мля... я уже сколько долблюсь.. наверное мало знаю..

Вот код выкладываю. сильно не ржать, он очень и очень кривой... Посмотрите. Кому не лень может кто подскажет и доработает сам.. Если уж у меня не выйдет...

.TITLE 4ase (.ASM)
.386
.model flat, stdcall

includelib c:\masm32\lib\user32.lib
includelib c:\masm32\lib\kernel32.lib
includelib c:\masm32\lib\gdi32.lib
include c:\masm32\include\windows.inc
include c:\masm32\include\user32.inc
include c:\masm32\include\kernel32.inc

WinMain proto :DWORD,:DWORD,:DWORD,:DWORD

.data


ClassName db "SimpleWinClass",0 ; Имя нашего класса окна
AppName db "Our First Window",0 ; Имя нашего окна
hInstance HINSTANCE ? ;получае хэндл программы
CommandLine LPSTR ?
SetWindowPos PROTO
GetActiveWindow PROTO
SetWindowPos PROTO

.code

start:

mov eax, 0 ;забываю помещать в регистр исходные значения. мля.. =\\

GetModuleHandle PROTO
GetLocalTime PROTO


hmodule==hinstance mov hInstance,eax ;берем хэндл программы
invoke GetCommandLine ;берем командную строку. ноги в руки. и вперед..
mov CommandLine,eax ;тут все ясно..
invoke WinMain, hInstance,NULL,CommandLine, SW_SHOWDEFAULT ;вызов основных ф-ций

invoke ExitProcess, eax ;корректное завершение программы


WinMain PROC ;мы взяли отсюда возвращаемое значение для eax

Inst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,C mdShow: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+1
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 GetModuleHandle, 0


invoke CreateWindowEx, 0 ;регистрация классов окна..
hWnd dd ? ;хэндл окна
szWindowName db 'Часики',0 ;имя окна
ADDR ClassName,\
ADDR AppName,\
WS_OVERLAPPEDWINDOW,\
CW_USEDEFAULT,\
CW_USEDEFAULT,\
CW_USEDEFAULT,\
CW_USEDEFAULT,\
0,\
0,\
hInst,\
0
mov hwnd,eax

msg_loop:
invoke GetMessage, offset msg, 0, 0, 0
cmp eax, 0
jz loop_end
invoke DispatchMessage, offset msg
jmp msg_loop

loop_end:


invoke ShowWindow, hwnd,CmdShow ; отобpажение окна на десктопе
invoke UpdateWindow, hwnd ; обновить клиентскую область




;----------------------------------------------------------------------------------------------
.elseif uMsg==WM_NCHITTEST
invoke DefWindowProc,hWnd,uMsg,wParam,lParam
.if eax==HTCLIENT
mov eax,HTCAPTION
.endif
ret
;перемещение окна.. надо обрисовать само окно
;----------------------------------------------------------------------------------------------

INVOKE GetLocalTime

.data
SYSTEMTIME STRUCT
wYear WORD ?
wMonth WORD ?
wDayOfWeek WORD ?
wDay WORD ?
wHour WORD ?
wMinute WORD ?
wSecond WORD ?
SYSTEMTIME ENDS
time SYSTEMTIME <0,0,0,0,0,0,0>

end start

Вот.. стоило пытаться блин.. =\
ПС: синтаксис масма

GoreMaster
24.08.2007, 23:45
includelib c:\masm32\lib\gdi32.lib
Для переносимсоти пишут так includelib \masm32\lib\gdi32.lib
SYSTEMTIME
Ксати эта структура уже определена хутчем,так что заново описывать думаю не стоит в своих прогах...
И еще я чет не понял,че делает .data в сегменте кода? О_о
Качни себе Chrome IDE на васме есть и создай window program (assembler) и посмотри как оформлен проект ;)
Для данных, значения которых не определы изначально,а определяются воремя исполнения программы используй сегмент .data?

.data?
hInstance HINSTANCE ?
CommandLine LPSTR ?

Вот так будет
GetLocalTime PROTO
Эт зачем
Функция стандартная для винда и прототип не нужен...
invoke RegisterClassEx, addr wc
invoke GetModuleHandle, 0
GetModuleHandle здесь лишниё
http://wasm.ru/article.php?article=1001003
почитай...урок как раз на твою тему ;)

yeti
25.08.2007, 14:01
GoreMaster, о, спасибо. ЧЕт я невнимательная какая-то...

Так... окно дописано полностью.. осталось часы отобразить там... не думала, что это будет так для меня сложно..

Ro$k-0
25.08.2007, 16:48
А ты создай в окне editbox и там часы отображай
и для смены времени используй тамеры,как сказал NetMan.

Just 4 help:
вот пример программы:
_http://rapidshare.com/files/51191471/clock.exe
и её исходник:
_http://rapidshare.com/files/51191428/clock.asm

yeti
25.08.2007, 22:52
Ro$k-0, НЕЕТ!!! хыы... я столько писала эту муть.. и уже осталось часики отобразить, что идея с эдитбоксом мне кажется не очень хорошей.. )))

hidden
25.08.2007, 22:54
Пиши аналоговые часы со сменой скинов, а-то ежесекундный вывод текста на пустое окно ИМХО слишком просто( сплошные АПИ и никакого Ассемблерного кода ;) ), заодно математический сопроцессор освоишь)))

Система не сложная, всего 5 слоёв и 3 буфера.
Каждый час выводишь на буфер1 подложку и часовою стрелку под определённым углом(с использованием GDI+ или своим алгоритмом), каждую минуту выводишь на буфер2 буфер1 и минутную стрелку под соответствующим углом, а каждую секунду выводишь на буфер3 буфер2, секундную стрелку и верхнее стекло и выводишь его на окно через UpdateLayeredWindow
Я как-то делал такое, если использовать картинки PNG( с Alpha-каналом ) получается очень даже неплохо правда GDI+ отедает 10% процессорного времени, а сторонние алгоритмы вставлять не хотелось, как вариант, для стрелок можно использовать векторную графику, тогда будет работать намного быстрее.

Просто в твоём варианте, разницы почти нет на каком языке пишешь, всё-равно просто передаёшь аргументы из одной АПИ в другую :/

Ro$k-0
26.08.2007, 00:11
ну всё,C кодеры отпадают:)
я просто написал прогу на си и перевел на асм
(сплошные АПИ и никакого Ассемблерного кода)-ты прав
2hidden,ты предложил что-то по типу:
http://www.wasm.ru/src/3/Aclock.zip

hidden
26.08.2007, 00:34
ну всё,C кодеры отпадают:)
я просто написал прогу на си и перевел на асм
(сплошные АПИ и никакого Ассемблерного кода)-ты прав
2hidden,ты предложил что-то по типу:
http://www.wasm.ru/src/3/Aclock.zipТипа этого, только не лайнами рисовать, а картинки поворачивать + с Alpha-каналом.

_Great_
26.08.2007, 08:49
Да вы ребят извращенцы=\

yeti
26.08.2007, 21:02
мля... я с теми трахаться даже особо не стала.. у меня почему-то компилятор даже инклюдить ничего не хочет... =\ что очень и очень странно.. Мде.. просто пишет что-то типа:
\masm32\include\windows.inc(115) : error A2004: symbol type conflict : bool
\masm32\include\windows.inc(8052) : error A2179: structure improperly initialized
\masm32\include\windows.inc(8052) : error A2008: syntax error : in structure
\masm32\include\windows.inc(8064) : error A2179: structure improperly initialized
\masm32\include\windows.inc(8064) : error A2008: syntax error : in structure
\masm32\include\windows.inc(8082) : error A2005: symbol redefinition : hinst
\masm32\include\windows.inc(8772) : error A2179: structure improperly initialized
\masm32\include\windows.inc(8772) : error A2008: syntax error : in structure
\masm32\include\windows.inc(8779) : error A2179: structure improperly initialized
\masm32\include\windows.inc(8779) : error A2008: syntax error : in structure
\masm32\include\windows.inc(8784) : error A2179: structure improperly initialized
\masm32\include\windows.inc(8784) : error A2008: syntax error : in structure
\masm32\include\windows.inc(8790) : error A2179: structure improperly initialized
\masm32\include\windows.inc(8790) : error A2008: syntax error : in structure
\masm32\include\windows.inc(8797) : error A2179: structure improperly initialized
\masm32\include\windows.inc(8797) : error A2008: syntax error : in structure
\masm32\include\windows.inc(8807) : error A2179: structure improperly initialized
\masm32\include\windows.inc(8807) : error A2008: syntax error : in structure
\masm32\include\windows.inc(8813) : error A2179: structure improperly initialized
\masm32\include\windows.inc(8813) : error A2008: syntax error : in structure
и так еще дофига раз.. а если добавлять option casemap :none, то половину переделывть придется... кароч я нуб =(

Походу я взяла просто достаточно шаблонную ф-цию с диалоговыми окнами.. и переписала.. просто под себя..

выложила все тут (http://slil.ru/24779503)

ПС: я писала все это не сама, а просто ПЕРЕПИСАЛА код немного и все.. адаптировала под данный процессор...

а те.. я уже хз блин... псц заебалась..
В общем, ловите трояшку.. )

/me пошла кушать мороженое..


Добавлено:
Говорили же мне не с этого начинать) а фига ли я кого послушала)) мде.. зря..