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

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

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 17.12.2009, 21:40   #1
Doholyan
Форумчанин
 
Регистрация: 26.04.2009
Сообщений: 270
По умолчанию Пауза в реальном режиме

Доброго времени суток!
Ту не большой вопросик, как прописать паузу в реальном режиме?
Хоть дайте направления....
Doholyan вне форума Ответить с цитированием
Старый 17.12.2009, 22:00   #2
Ivan_32
somewhere else
Участник клуба
 
Аватар для Ivan_32
 
Регистрация: 17.07.2008
Сообщений: 1,409
По умолчанию

Команда HLT - останавливает процессор в ожидании следующего прерывания.
А что вы подразумеваете под паузой и для чего вам это нужно?
"Тяжело в учении, легко в бою" - А.В. Суворов
Ivan_32 вне форума Ответить с цитированием
Старый 17.12.2009, 22:11   #3
Doholyan
Форумчанин
 
Регистрация: 26.04.2009
Сообщений: 270
По умолчанию

Хотел бы понят как работает процедура у К.Ирвина (irvine32.lib)
он ее там назвал Delay и в регистр eax(ax) назначает в милисикундах.
А, каждую его учебную программу в защищеном режиме, "условно проробатываю" в реальном...

Спасибо Ivan_32!
хоть буду знать с чего начать поиск))
Doholyan вне форума Ответить с цитированием
Старый 17.12.2009, 22:48   #4
Doholyan
Форумчанин
 
Регистрация: 26.04.2009
Сообщений: 270
По умолчанию

Ivan_32
Чуток не так.. эта команда будет "держать " процесор до первого прерывания, мне нужно что бы именно время являлось выходом из паузы... или нужно с помощью прерывания INT1ch но там с этим прирыванием много заморочек получаеться...
Doholyan вне форума Ответить с цитированием
Старый 18.12.2009, 07:56   #5
Ivan_32
somewhere else
Участник клуба
 
Аватар для Ivan_32
 
Регистрация: 17.07.2008
Сообщений: 1,409
По умолчанию

Ну да, я так и написал А прерыванием этим как раз может быть таймер Ну или клавиатура и что угодно еще... Я к чему собственно:
таймер работает на очень высоких частотах, соттвественно массив из HLT-ов может оказатся хорошей задержкой хоть и не точной.

С таймер там тоже особых проблем нет:
mov word [08h * 4], ax ;смещение
mov word [08h * 4 + 2], cx ; сегмент

И все - у вас уже свой обработчик прерывания. Как вариант можно сделать так:
Код:
main:
  cli
  mov ax, word [08h * 4]
  mov [OldOffset],ax
  mov ax,word [08h * 4+2]
  mov [OldSeg],ax
 
  mov ax,myIRQ0 
  mov word [08h * 4], ax ;смещение
  mov ax,cs
  mov word [08h * 4 + 2], cx ; сегмент
  sti
myIRQ0:
   mov ax,[OldSeg]
   mov es,ax
   mov ax,[OldOffset]
   jmp es:ax

OldSeg dw 0
OldOffset dw 0
"Тяжело в учении, легко в бою" - А.В. Суворов
Ivan_32 вне форума Ответить с цитированием
Старый 18.12.2009, 09:21   #6
alexcoder
Форумчанин
 
Регистрация: 31.05.2009
Сообщений: 786
По умолчанию

Можно сделать паузу при помощи команды RDTSC, считающей количество тактов, прошедших с момента запуска процесора
Код:
DB 00Fh,031h;RDTSC
mov ebx,edx
mov ecx,eax
add ecx,DB 00Fh,031h
mov ebx,edx
mov ecx,eax
add ecx,0D693A400h
adc ebx,0
m1: DB 00Fh,031h
cmp ebx,edx
jg m1
cmp ecx,eax
jg m1h
Правда такая задержка чувствительна к частоте процессора
Помощь с программами:
vk.com/alexcoder1
e-mail: informatik101@mail.ru

Последний раз редактировалось alexcoder; 18.12.2009 в 09:23.
alexcoder вне форума Ответить с цитированием
Старый 18.12.2009, 18:07   #7
Doholyan
Форумчанин
 
Регистрация: 26.04.2009
Сообщений: 270
По умолчанию

Ivan_32;alexcoder; Спасибо!
а, можно коментарий к данному коду то у меня мозгов не хватает до понять, данную задачу.....
с уважением Дмитрий

Последний раз редактировалось Doholyan; 18.12.2009 в 18:36.
Doholyan вне форума Ответить с цитированием
Старый 18.12.2009, 23:12   #8
alexcoder
Форумчанин
 
Регистрация: 31.05.2009
Сообщений: 786
По умолчанию

Сорри, была ошибка, наверно два раза вставил
Код:
DB 00Fh,031h;RDTSC после выполнения в edx:eax будет значение счетчика тактов процессота
mov ebx,edx  ;сохраняем начальные значения
mov ecx,eax
add ecx,0D693A400h ;прибавляем 3600000000 (2сек на 1,8 ГГц проце)
adc ebx,0  ;учитываем перенос в старшие разряды
m1: DB 00Fh,031h ;опять читаем состояние счетчика
cmp ebx,edx ;сравниваем старшие разряды
jg m1  ;переход если ebx>edx
cmp ecx,eax ;сравниваем младшие разряды
jg m1  ;переход если ecx>eax
Помощь с программами:
vk.com/alexcoder1
e-mail: informatik101@mail.ru
alexcoder вне форума Ответить с цитированием
Старый 19.12.2009, 05:47   #9
Ivan_32
somewhere else
Участник клуба
 
Аватар для Ivan_32
 
Регистрация: 17.07.2008
Сообщений: 1,409
По умолчанию

Код:
main:
  cli ; отключаем прерывания
  mov ax, word [08h * 4] ; 0x20 - адрес таблицы прерываний.  Вернее если быть точным - адрес 0000:0020 (сегмент: смещение) 
  ; Первым в таблице идет прерывание таймера. Формат записи такой : смещение - 2 байта и сегмент - 2 байта. 
  mov [OldOffset],ax ; сохраняем старое смещение
  mov ax,word [08h * 4+2]
  mov [OldSeg],ax ; и старый сегмент - что бы потом использовать в нашем обработчике прерывания таймера.
 
  mov ax,myIRQ0 ; А теперь устанавливаем свой обработчик
  mov word [08h * 4], ax ;загружаем в таблицу прерываний наше смещение
  mov ax,cs ; сегмент кода нашего обработчика - текущий, т.е. его можно взять из CS.
  mov word [08h * 4 + 2], cx ; загружаем в таблицу прерываний наш сегмент.
  sti ; job is done - можно продолжать:)
  
waitProc:
;; ## IN: AX- количество итераций. 
;; ## Данная процедура будет ждать пока пройдет AX-тиков, т.е. при возникновении прерывания счетчика
;; ## переменная counter будет уменьшатся на 1.
   cli 
   mov [counter],ax  ; загружаем в counter количество итераций.
   sti
waitCycle:
   hlt ; что бы лишний раз не сравнивать:) Процессор будет ждать следующего прерывания. 
   cmp [counter],0 ; сравниваем с нулем 
   ja waitCycle ; если больше - прыгаем к waitCycle - т.е. повторяем сравнение. 
   ret
myIRQ0:
   ;тут может быть расположен какой угодно код обработки прерывания. Для примера:
   cmp [counter],0 
   je endint ;Если counter = 0 - ничего не делаем.
   dec [counter] ;если же нет - декрементируем его.
endint:
   mov ax,[OldSeg]
   mov es,ax
   mov ax,[OldOffset]
   jmp es:ax

OldSeg dw 0
OldOffset dw 0
counter dw 0
"Тяжело в учении, легко в бою" - А.В. Суворов
Ivan_32 вне форума Ответить с цитированием
Старый 19.12.2009, 22:57   #10
Doholyan
Форумчанин
 
Регистрация: 26.04.2009
Сообщений: 270
По умолчанию

alexcoder; Ivan_32;
Спасибо!!
само интресесно что вопросов меньше не стало)))) но... всеравно Спасибо
Doholyan вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Адреса в реальном режиме codeok Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 3 21.11.2009 12:28
переброс данных из Excel в Delphi в реальном режиме времени Машутка Общие вопросы Delphi 3 27.09.2008 07:19
Пауза в выполнении программы Иллидан Общие вопросы Delphi 6 24.01.2008 16:56
Возможно ли пауза Music XM при сворачивание формы ? Volkogriz Общие вопросы Delphi 3 13.10.2007 15:04