Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 18.12.2013, 22:57   #1
O'neeL
Пользователь
 
Аватар для O'neeL
 
Регистрация: 10.12.2011
Сообщений: 36
По умолчанию (TASM) Вывод системного времени

Здравствуйте.
Изначально задание звучит так: написать резидентную программу, которая после двойного нажатия клавиши SHIFT выводит системное время.

Ассемблером раньше заниматься не приходилось и честно на данный момент желания постигать его нет. На основе разных примеров и учебника сделал программу, которая реализует часть заложенных функций, но не все правильно.

Проблемы:
1. Резидентной программу сделать не получается, не могу понять как должна работать такая программа, если я её запускаю из Windows. Примеры резидентных программ сути не прояснили.
2. Непонятно как отлавливать нажатие SHIFT, так как прочитать можно только его текущий статус, но не отловить сам факт нажатия. Пока заменил на нажатие Enter.
3. При выводе строки после неё выводится много пустого пространства, а если пробовать объявлять строку в других местах, то куча мусора.
4. Код получается страшный, часть где сохраняется компонента времени так и просится в процедуру, но попытка моя успехом не увенчалась.

Вот и код:
Код:
code segment
	assume  cs:code,ds:code 
	org 100h
	string db 8 dup('$')
start:
	mov ax,3 ;очищаем экран
    int 10h
	jmp fshift
	
check proc
	mov ah, 7
	int 21h
JUMPS
	cmp al, 1bh
	je exit
NOJUMPS
	cmp al, 0Dh                          
	jne fshift
	ret
check endp	
	
fshift:
	call check
	call check

a0:	mov dl, 0ffh
	mov ah, 6
	int 21h
	jz a1
JUMPS
	cmp al, 1bh
	je exit
NOJUMPS

a1:	mov ah,2 ;перемещаем курсор в начало кординат
	mov bh,0
	mov dx,0
	int 10h 

	mov ah,2
    int 1Ah
	
    mov ah,0
    mov al,ch
    ror ax,4
    shr ah,4
    or ax,'00'
    mov string[0], al
	mov string[1], ah
	mov string[2], ':'
	
    mov ah,0
    mov al,cl
    ror ax,4
    shr ah,4
    or ax,'00'
    mov string[3], al
	mov string[4], ah
	mov string[5], ':'
	
    mov ah,0
    mov al,dh
    ror ax,4
    shr ah,4
    or ax,'00'
    mov string[6], al
	mov string[7], ah
	
    mov ah,9
    mov dx,offset string
    int 21h
    
	mov ah,0;
	int 1Ah ;считываем текущее количество тиков
    mov bx,dx
    add bx,18 ;прибавляем 1 секунду (в одной секунде 18,2 тика)
a2: int 1Ah
    cmp bx,dx
    jne a2
	jmp a0
exit: 
	mov ah,4ch
    int 21h
code ends	
end start
Заранее спасибо за помощь!
O'neeL вне форума Ответить с цитированием
Старый 19.12.2013, 14:36   #2
Son Of Pain
Участник клуба
 
Регистрация: 23.12.2010
Сообщений: 1,129
По умолчанию

1. Резидентные программы dos не будут работать под windows. Придется ставить эмулятор (dosbox?).

2. Нужно перехватывать девятое прерывание (irq от клавиатуры). Оно будет вызываться при нажатии и отпускании любой клавиши, в том числе и shift.

3. У тебя в строке 8 знаков $, и все их ты перезаписываешь временем. Нужен еще один, девятый, для обозначения конца строки.
Son Of Pain вне форума Ответить с цитированием
Старый 19.12.2013, 15:35   #3
O'neeL
Пользователь
 
Аватар для O'neeL
 
Регистрация: 10.12.2011
Сообщений: 36
По умолчанию

Son Of Pain, Спасибо еще раз.
Стал копаться дальше сам. Вот что нашел:
http://pascal.sources.ru/asm/faq/#tsr - как писать резидентную программу. Приводятся примеры для DOS и Windows 9X (для более поздних нет).
Там же можно найти ответы на многие интересные вопросы.

Пока пришло решение ставить DOSBox и писать резидент под DOS.
Вот нашел специальную сборку TASM+DOSBox для win7, win8:
http://techapple.net/2013/01/tasm-wi...gle-installer/
O'neeL вне форума Ответить с цитированием
Старый 19.12.2013, 15:55   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Так стоп. Зачем Вам написание резидентных программ под TurboPascal, если у Вас стоит задача написать резидента на Ассеблере?!
(да, в турбоПаскаль это можно сделать, я писал в своё время резиденты, но к Ассемблеру это прямого отношения не имеет)

NB. Рекомендую Вам взять готовую, рабочую программу на Ассемблере с резидентной частью (и перехватчиком клавиатуры) и доработать её под свои нужды. Это будет самое простое решение вашей проблемы.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 19.12.2013, 18:09   #5
Rin
Негодник
Форумчанин
 
Аватар для Rin
 
Регистрация: 10.11.2009
Сообщений: 880
По умолчанию

На счет резидента не помогу, но на ХР консольку писал, правда под МАSМ. Выдавало сис.время, очищало экран, удаляло/создавало (не помню точно) каталог. Могу скинуть.
Если помог, проси поставить минус. Будь оригинален!
Rin вне форума Ответить с цитированием
Старый 19.12.2013, 20:24   #6
O'neeL
Пользователь
 
Аватар для O'neeL
 
Регистрация: 10.12.2011
Сообщений: 36
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
Так стоп. Зачем Вам написание резидентных программ под TurboPascal, если у Вас стоит задача написать резидента на Ассеблере?!
(да, в турбоПаскаль это можно сделать, я писал в своё время резиденты, но к Ассемблеру это прямого отношения не имеет)

NB. Рекомендую Вам взять готовую, рабочую программу на Ассемблере с резидентной частью (и перехватчиком клавиатуры) и доработать её под свои нужды. Это будет самое простое решение вашей проблемы.
Вы поспешно сделали выводы. По указанной ссылке FAQ по ассемблеру. По поводу резидента, я так и собирался сделать.
O'neeL вне форума Ответить с цитированием
Старый 19.12.2013, 20:27   #7
O'neeL
Пользователь
 
Аватар для O'neeL
 
Регистрация: 10.12.2011
Сообщений: 36
По умолчанию

Цитата:
Сообщение от Son Of Pain Посмотреть сообщение
1. Резидентные программы dos не будут работать под windows. Придется ставить эмулятор (dosbox?).

2. Нужно перехватывать девятое прерывание (irq от клавиатуры). Оно будет вызываться при нажатии и отпускании любой клавиши, в том числе и shift.

3. У тебя в строке 8 знаков $, и все их ты перезаписываешь временем. Нужен еще один, девятый, для обозначения конца строки.
Кстати, изменил я объявление строки на такое
Код:
string db 9 dup('$')
Но результат все тот же
O'neeL вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
изменения системного времени в EFI Alexandr17-10 Компьютерное железо 3 29.09.2013 12:20
Вывод системного времени на экран через каждые 5 секунд royal_king Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 1 03.11.2011 16:14
чтение/установка системного времени blackbanny Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 0 25.10.2009 17:00
постоянное получение системного времени в ячейке iamaxl Microsoft Office Excel 2 02.07.2009 20:34
получение системного времени Alex_Pro Общие вопросы C/C++ 1 21.05.2008 20:31