Форум АНТИЧАТ

Форум АНТИЧАТ (https://forum.antichat.xyz/index.php)
-   С/С++, C#, Delphi, .NET, Asm (https://forum.antichat.xyz/forumdisplay.php?f=24)
-   -   Часики [ASM] (https://forum.antichat.xyz/showthread.php?t=46940)

yeti 17.08.2007 14:31

Часики [ASM]
 
Народ, что-то мне пришла в голову бредовая идея.. сделать простейшие часики на 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

Цитата:

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

Курил? Я что писал что асм сложнее? Чего ты не по теме влазиешь то? Помог ей чем?
To Shnurovka: клац

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

Цитата:

Сообщение от _Great_
По теме - нафига таймеры использовать, 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

Цитата:

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

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

NetMan 19.08.2007 15:51

Цитата:

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

Почему неуниверсально? За что не долюбливаешь?
Смотрим здесь часики...

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,CmdShow: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

Цитата:

Сообщение от Ro$k-0
ну всё,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, то половину переделывть придется... кароч я нуб =(

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

выложила все тут

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

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

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


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


Время: 23:27