Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Assembler

Страница: 1 |

 

  Вопрос: Ребята обьясните новичку 8) Добавлено: 10.05.08 20:38  

Автор вопроса:  Александр | Web-сайт: www.azov-fishing.nm.ru
Вообщем задали такую прогу.
Реализовать программу, ежесекундно выводящую в правом углу экрана системное время «чч:мм:сс»
Есть из примеров исходничек проги которая:
; В бесконечном цикле выводит на экран строку первый символ строки заменяется
; на символ, нажатый на клавиатуре. При этом циклически изменяет цвет (атрибуты)
; строки от 1 до 15 один раз в секунду (приблизительно 18 тиков системного таймера).
; При нажатии клавиши "0" выходит из программы.
.model small
datasg segment
old_cs dw ? ; для хранения «старого» вектора
old_ip dw ? ; прерываний с номером 1Ch
tick dw 0 ; счетчик тиков системного таймера
atr db 14 ; изначальный атрибут символов (желтый)
msg db 'X-Y'; строка, выводимая на экран
MSG_LEN equ $-msg ; динна строки
T_MAX equ 18; задаем константу для интервала изменения атрибута (в тиках)
; строка и столбец, начиная с которых будет выводиться символы
POS_Y equ 14
POS_X equ 40
datasg ends
stacksg segment stack
db 256 dup(?)
stacksg ends
codesg segment
assume cs:codesg, ds:datasg, ss:stacksg
; подпрограмма обработки прерываний 1Ch
new_1c proc far
; обработчик прерывания 1Ch -> сохраняем значения всех изменяемых регистров
push ax
push bx
push ds
push es
; настраиваем ds на наш сегмент данных
mov ax, datasg
mov ds, ax

inc tick ; увеличиваем счетчик тиков
; проверка буфера клавиатуры
mov ax, 40h ; настраиваем es на сегмент области данных BIOS
mov es, ax
mov ax, es:[1Ch] ; в ax указатель «хвоста» буфера клавиатуры
mov bx, es:[1Ah] ; в bx указатель «головы»
cmp bx, ax ; буфер пуст ?
jne save_sym ; нет – идем сохранять символ
; да – выходим из обработчика
jmp back
save_sym:
mov al, es:[bx] ; извлечь символ из буфера
; укажем, что символ обработан - поместим указатель «хвоста» в «голову»
mov es:[1Ch], bx
; сохраняем введенный символ в начало строки
mov msg[0], al
back:
pop es
pop ds
pop bx
pop ax
iret
new_1c endp
; основная программа
start:
mov ax, datasg
mov ds, ax
; чтение текущего вектора прерывания 1Ch
mov ah, 35h ; функция получения вектора
mov al, 1Ch ; номер вектора
int 21h
; возвращает сегмент – в es, смещение в bx
; сохраним полученный адрес обработчика
mov old_ip, bx
mov old_cs, es
; установим новый обработчик прерывания 1c
push ds
; в ds:dx - адрес нового обработчика прерывания
mov dx, offset new_1c
mov ax, seg new_1c
mov ds, ax
mov ah, 25h
mov al, 1Ch
int 21h
pop ds
; настроим es на наш сегмент данных
mov ax, datasg
mov es, ax
; основной цикл программы
main_loop:
; проверка завершение работы
cmp msg[0], 30h ; нажата ли клавиша «0» ?
je quit ; если да – конец программы
; проверка прошедшего времени
cmp tick, T_MAX ; проверяем прошло ли T_MAX тиков
jl check_for_changes ; еще нет -> идем проверять изменение выводимого символа
; уже прошло -> сбрасываем счетчик тиков
mov tick, 0
; и меняем цвет
mov al, atr
inc al
; если больше 15 -> оборачиваем атрибут
cmp al, 15
jle save_attr
mov al, 1
save_attr:
mov atr, al ; сохраняем атрибут
jmp show_msg ; идем перерисовывать строку
check_for_changes:
; проверяем был ли изменен первый символ выводимой строки
cmp bh, msg; сравниваем предыдущий первый символ строки (хранится в bh) с текущим
je main_loop ; нет изменений -> в начало цикла
show_msg:
xor bh, bh ; обнулим bh для предотвращения ошибки
; выводим строку с заданным атрибутом
mov ah, 13h
mov al, 0 ; режим вывода
; строка и столбец, начиная с которых будет выводиться строки
mov dh, POS_Y
mov dl, POS_Y
lea bp, msg ; в ES:BP - адрес начала строки в памяти
mov bl, atr ; атрибут, если строка содержит только символы
mov cx, MSG_LEN ; длина строки
int 10h
; сохраним в bh текущий первый символ для проверки
; необходимости повторного вывода строки
mov bh, msg[0]
jmp main_loop
quit:
; восстановление старого вектора обработчика прерывания 1Ch
push ds
; в ds:dx - адрес исходного обработчика прерывания 1Ch
mov dx, old_ip
mov ax, old_cs
mov ds, ax
mov ah, 25h ; функция установки вектора
mov al, 1Ch ; номер вектора
int 21h
pop ds
; завершение работы программы
mov ax, 4C00h
int 21h
codesg ends
end start
Мне нужно из неё получить ту прогу которую задали. Насколько я знаю необходимо использовать прерывание int 1Ah. Или int 21h Но я незнаю как оно работает и из каких регистров считать время. Т.е. часы, минуты и секунды. Как я понимаю надо в учаток кода вставить код с получением этого времени. Но вот в какое место именно в коде. Я вообще когда пробовал я пытался записать значения в msg. Типо mov [msg],al. Но ничего не получилось 8( Ребята, помогите реализовать прогу. Или разьясните как реализовать самому, буду презнателен за любой ответ. 8) Просто сложность заключается в том, что надо как-то код, насколько я понимаю реализовать с помошью процедуры new_1ch.
Ещё не совсем понятен вот этот кусочек из примерчика:
mov ax, 40h ; настраиваем es на сегмент области данных BIOS
mov es, ax
mov ax, es:[1Ch] ; в ax указатель «хвоста» буфера клавиатуры
mov bx, es:[1Ah] ; в bx указатель «головы»
cmp bx, ax ; буфер пуст ?
jne save_sym ; нет – идем сохранять символ
; да – выходим из обработчика
jmp back
save_sym:
mov al, es:[bx] ; извлечь символ из буфера
; укажем, что символ обработан - поместим указатель «хвоста» в «голову»
mov es:[1Ch], bx
Что он в точности делает?

Помогите пожалуйста, очень надо!!!!

Ответить

  Ответы Всего ответов: 7  

Номер ответа: 1
Автор ответа:
 



Администратор

ICQ: 278109632 

Вопросов: 42
Ответов: 3949
 Web-сайт: domkratt.com
 Профиль | | #1
Добавлено: 10.05.08 21:40
Да... давно я не писал на 16-битном асме.... =)

Ответить

Номер ответа: 2
Автор ответа:
 Александр



Вопросов: 1
Ответов: 4
 Web-сайт: www.azov-fishing.nm.ru
 Профиль | | #2
Добавлено: 11.05.08 01:21
Время вспомнить.. 8)))))

Ответить

Номер ответа: 3
Автор ответа:
 HACKER


 

Разработчик Offline Client

Вопросов: 236
Ответов: 8362
 Профиль | | #3 Добавлено: 11.05.08 04:56
OutStr macro str ;макрос вывода строки
push dx
mov ah,09h
lea dx,str
int 21h
pop dx
endm
;----------------------------------------
OutChar macro char ;макрос вывода символа
push ax
push dx
mov ah,06h
mov dl,char
add dl,30h
int 21h
pop dx
pop ax
endm
;----------------------------------------------------------------------------------------------------
Decomposition macro time ;макрос разложения двузначного числа (16-ного) на цифры и вывода их на экран
push bx
mov bh,time ;используется bx
mov bl,time
and bh,11110000b
shr bh,4h
and bl,00001111b
OutChar bh
OutChar bl
pop bx
endm
;-------------------------------------
Delay macro time ;макрос задежки в мкс
local ext,iter
push cx
mov cx,time
ext:
push cx
mov cx,5000
iter:
loop iter
pop cx
loop ext
pop cx
endm
;-----------------------------------------------------------
GotoXY macro x,y ;макрос установки позиции курсора в т.(x,y)
push ax
push bx
push dx
mov ah,02 ;Запрос на установку курсора
mov bh,0 ;Экран 0
mov dh,x ;Строка 0
mov dl,y ;Столбец 0
int 10h ;Передача управления в BIOS
pop dx
pop bx
pop ax
endm
;----------------------------------
ClrScr macro ;макрос очистки экрана
push ax
push bx
push cx
push dx
mov ah,06h ;AH 06 (прокрутка)
mov bh,07 ;Нормальный атрибут (черно/белый)
mov cx,0000 ;Верхняя левая позиция
mov dx,184Fh ;Нижняя правая позиция
int 10h ;Передача управления в BIOS
pop dx
pop cx
pop bx
pop ax
endm
;----------------------------------------------
BlinkOn macro ;макрос включения мигания курсора
push ax
push cx
mov ax,0100h
mov cx,0506h
int 10h
pop cx
pop ax
endm
;------------------------------------------------
BlinkOff macro ;макрос выключения мигания курсора
push ax
push cx
mov ax,0100h
mov cx,2000h
int 10h
pop cx
pop ax
endm
;-----------------------------------------------

.model small
.stack 100h
.data
M1 DB ':$'
M2 DB 'Current time....$'
M3 DB '',10,13,'$'
M4 DB 178,177,176,176,177,178,178,177,176,91,'KaspeR labwork #4',93,176,177,178,178,177,176,176,177,178,7,'$'
.code
start:
mov ax,@DATA ;инициализация
mov ds,ax
ClrScr
BlinkOff

l1:
GotoXY 0,0
OutStr M2
xor ax,ax
mov ah,2h ;получение времени
int 1Ah
Decomposition ch ;ch - часы
OutStr M1
Decomposition cl ;cl - минуты
OutStr M1
Decomposition dh ;dh - секунды
OutStr M3

mov ah,01h ;проверка буфера клавиатуры
int 16h ;флаг нуля zf=0 если была нажата клавиша
jnz exit

Delay 10000
jmp l1

exit:
ClrScr
BlinkOn
OutStr M4 ;это про меня!
mov ax,4C00h
int 21h
END start

Ответить

Номер ответа: 4
Автор ответа:
 HACKER


 

Разработчик Offline Client

Вопросов: 236
Ответов: 8362
 Профиль | | #4 Добавлено: 11.05.08 04:58
6J|ять! спалилсо - забыл копирайт удалить :)))

Ответить

Номер ответа: 5
Автор ответа:
 Александр



Вопросов: 1
Ответов: 4
 Web-сайт: www.azov-fishing.nm.ru
 Профиль | | #5
Добавлено: 11.05.08 19:53
ООООГГГГОООО... Фигасе!! Это была твоя лаба????? 8))))))))

Ответить

Номер ответа: 6
Автор ответа:
 Александр



Вопросов: 1
Ответов: 4
 Web-сайт: www.azov-fishing.nm.ru
 Профиль | | #6
Добавлено: 11.05.08 20:04
Прикольно, только моё задание состоит в том, чтобы через 18 тиков проца обновлялось время, а тут у тя задержка 10000мс. Насколько я понимаю 8(. Проблема в том, что надо через прерывание это бабахнуть 8(. Вот эту чёртову замену 1Сh прерывания. Я немогу её прибомбить правильно.

Ответить

Номер ответа: 7
Автор ответа:
 Александр



Вопросов: 1
Ответов: 4
 Web-сайт: www.azov-fishing.nm.ru
 Профиль | | #7
Добавлено: 11.05.08 20:40
Но у меня ещё вопросик... 8))) Вот по тоже кусочку из моего примера:

mov es, ax
   mov ax, es:[1Ch] ; в ax указатель «хвоста» буфера клавиатуры
   mov bx, es:[1Ah] ; в bx указатель «головы»
   cmp bx, ax ; буфер пуст ?
   jne save_sym ; нет – идем сохранять символ
Непонятно как он сравнивеат bx, с ах.... Ну буфер.... А буфер то нигде неиспользуется.... Или я неправ... Тем более мы же ах и вх присваиваем значения.. Они же неравны.... Прости за идиотские вопросы...8)))
Я нашёл в нете вот кусочек того как получить время... Но он выводит непонятными символами...
mov ah, 2ch
   int 21h
   mov al,dh
   mov msg[0], al
То есть секунды
То есть их надо преобразовать??? Это формат BCD??? Или как??? Как преобразовывать?

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам