20.08.2017, 18:39 [+3 UTC]
в нашей команде: 2 094 чел. | участники онлайн: 4 (рекорд: 21)

:: РЕГИСТРАЦИЯ

:: консультации

:: задать вопрос

:: все разделы

:: правила

:: новости

:: участники

:: доска почёта

:: форум

:: блоги

:: поиск

:: статистика

:: наш журнал

:: наши встречи

:: наша галерея

:: отзывы о нас

:: поддержка

:: руководство

Версия системы:
7.41 (25.02.2017)

Общие новости:
23.02.2017, 09:51

Форум:
20.08.2017, 16:51

Последний вопрос:
18.08.2017, 23:30

Последний ответ:
17.08.2017, 18:54

Последняя рассылка:
20.08.2017, 17:45

Писем в очереди:
0

Мы в соцсетях:

Наша кнопка:

RFpro.ru - здесь вам помогут!

Отзывы о нас:
18.11.2010, 22:09 »
Кокин Антон Вадимович
Спасибо. Так и сделал и получил 90Гб серию smile Два с половиной часа конвертировалось в ави без сжатия. Теперь вот думаю, оно мне надо? Слишком много мороки... [вопрос № 180828, ответ № 264169]
26.03.2012, 19:48 »
Stanislav Bolshakov
Спасибо Вам за объяснение smile [вопрос № 185680, ответ № 270326]

РАЗДЕЛ • Assembler

Создание программ на языке Assembler.

[администратор рассылки: Лысков Игорь Витальевич (Старший модератор)]

Лучшие эксперты в этом разделе

Лысков Игорь Витальевич
Статус: Старший модератор
Рейтинг: 336
Зенченко Константин Николаевич
Статус: Модератор
Рейтинг: 313
quirck
Статус: 1-й класс
Рейтинг: 48

Перейти к консультации №:
 

Консультация онлайн # 190283
Раздел: • Assembler
Автор вопроса: porsiya (Посетитель)
Отправлена: 12.12.2016, 18:27
Поступило ответов: 1

Здравствуйте, уважаемые эксперты! Прошу вас ответить на следующий вопрос:
Архитектура х86 - К сожалению больше информации о ассемблере не скажу, но надеюсь она и не понадобится т.к. вопрос состоит не в написании программы, а в описании несколько строчек, элементарных для эксперта=)
Итак что я делаю - в задании я использую прерывания INT 8 (Прерывания таймера), то есть ввожу команду INT 8, и с помощью клавиши F1 перехожу в биос. Там идут команды по системному таймеру, как показано на рисунку который прикрепил, мы добавляем в переменную SI значения 40, копируем значения в DS, в SI вставляем 006С, дальше добавляем 0001 в SI,
добавляем по команде ADC и с помощью CMP сравниваем прошло ли 24 часа с момента запуска таймера, и переходим по адресу B853, тут вопрос - что значит CMP [SI], 00B0 ? Что с чем сравнивает, что такое 00B0, почему именно такое значения, как оно связанно с таймером.
Заранее спасибо уважаемые эксперты

-----
 Прикрепленный файл (кликните по картинке для увеличения):

Состояние: Консультация закрыта

Ответ # 274437 от Лысков Игорь Витальевич (Старший модератор)

Здравствуйте, porsiya!
Счетчик тиков - двойное слово, которое находится в сегменте данных ДОСа по адресу 40h:6ch
Не два слова, а одно двойное, сначала младшее слово, следом - старшее.
Прерывание таймера int 8 происходит через каждые примерно 55 мс (или 18.2 раза в секунду)
и увеличивает на 1 счетчик тиков. Приведенный фрагмент кода как раз и делает эту операцию,
кроме того, сравнивает с количеством тиков за сутки, чтобы выполнить некоторые операции.
Количество тиков за сутки равно 1800b0h = 1573040, ибо
1573040 * 0,054925494583735950770482632355185 сек = 60*60*24 сек = 1 сутки
0,054925494583735950770482632355185 сек - период одного тика (примерно 55 мс)
1/0,054925494583735950770482632355185 сек = 18,206481481481481481481481481543 раза в сек
Теперь по коду. Для понимания я добавил некоторые возможные строки выше и ниже приведенного фрагмента

Код (Assembler) :: выделить код
	push		ax					;сохраним ax
	xor		ax, ax				;обнулим ax
	push		ds					;сохраним сегментный регистр сегмента данных
;--------------
	push		si					;сохраним используемый регистр
	mov		si, 40h				;зададим адрес сегмента данных ДОСа
	mov		ds, si
	mov		si, 6ch				;по смещению 6ch находится двойное слово - счетчик тиков таймера
								;считаем тики, которые примерно раз в 0.055 мс (0,054925494583735950770482632355185 мс)
	add		word ptr [si], 1	;инкремент младшего слова,
	adc		word ptr [si+2], 0	; затем сложение с переносом старшего
								;дальше самое интересное 
								;чтобы отсчитать сутки, надо насчитать 1800b0h тиков
								;вот и получается:
	cmp		[si+2], 18h			;сначала сравниваем старшее слово
	jnz		L_B853				;не равно - уходим куда-то
	cmp		[si], 0b0h			;потом младшее
;--------------
								;напишу, что по идее дальше 
	jnz		L_B853				;не равно - уходим туда же
	mov		word ptr[si], 0		;досчитали - обнуляем счетчик
	mov		word ptr[si+2], 0
	mov		word ptr[si+4], 1	; и взводим флаг переполнения по адресу 70h (в сегменте 40h)

	or		al, 8				;пометим, что у нас переполнение!
L_B853:
	push		ax				;в ax признак переполнения (или 0, или 8), сохраняется в стеке,
;							; чтобы не испортить
;...							;что-то там делаем...


Консультировал: Лысков Игорь Витальевич (Старший модератор)
Дата отправки: 13.12.2016, 11:54

Рейтинг ответа:

+1

[подробно]

Сообщение
модераторам

Отправлять сообщения
модераторам могут
только участники портала.
ВОЙТИ НА ПОРТАЛ »
регистрация »

Мини-форум консультации № 190283

Лысков Игорь Витальевич
Старший модератор

ID: 7438

# 1

 +1 
 
= общий = | 12.12.2016, 20:18 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер
porsiya:

Давайте прокомментируем каждую строчку... smile
И даже попытался добавить строки выше и ниже...

Код (Assembler) :: выделить код
								;добавлю, что, по идее, было раньше...
	push		ax					;сохраним ax
	xor		ax, ax				;обнулим ax
	push		ds					;сохраним сегментный регистр сегмента данных
;--------------
	push		si					;сохраним используемый регистр
	mov		si, 40h				;зададим адрес сегмента данных ДОСа
	mov		ds, si
	mov		si, 6ch				;по смещению 6ch находится двойное слово - счетчик тиков таймера
								;считаем тики, которые примерно раз в 0.055 мс (0,054925494583735950770482632355185 мс)
	add		word ptr [si], 1	;инкремент младшего слова,
	adc		word ptr [si+2], 0	; затем сложение с переносом старшего
								;дальше самое интересное 
								;чтобы отсчитать сутки, надо насчитать 1800b0h тиков
								;вот и получается:
	cmp		[si+2], 18h			;сначала сравниваем старшее слово
	jnz		L_B853				;не равно - уходим куда-то
	cmp		[si], 0b0h			;потом младшее
;--------------
								;напишу, что по идее дальше 
	jnz		L_B853				;не равно - уходим туда же
	mov		word ptr[si], 0		;досчитали - обнуляем счетчик
	mov		word ptr[si+2], 0
	mov		word ptr[si+4], 1	; и взводим флаг переполнения по адресу 70h (в сегменте 40h)

	or		al, 8				;пометим, что у нас переполнение!
L_B853:
	push		ax				;в ax признак переполнения (или 0, или 8), сохраняется в стеке,
;							; чтобы не испортить
;...							;что-то там делаем...

=====
Каждый выбирает по себе -
Щит и латы, посох и заплаты.
Меру окончательной расплаты
Каждый выбирает для себя.

• Отредактировал: Лысков Игорь Витальевич (Старший модератор)
• Дата редактирования: 12.12.2016, 20:43

Лысков Игорь Витальевич
Старший модератор

ID: 7438

# 2

 +1 
 
= общий = | 12.12.2016, 21:00 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер
porsiya:

Теперь все понятно? smile smile

=====
Каждый выбирает по себе -
Щит и латы, посох и заплаты.
Меру окончательной расплаты
Каждый выбирает для себя.

porsiya
Посетитель

ID: 400782

# 3

= общий = | 12.12.2016, 21:49 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер
Лысков Игорь Витальевич:

Очень хорошо расписали Игорь Витальевич)) smile
Только вот с цифрами не совсем разобрался...
"чтобы отсчитать сутки, надо насчитать 1800b0h тиков - равно 24 часа
cmp [si+2], 18h ;сначала сравниваем старшее слово - 18 = 24 часа? (перевод с 16в 10-ю систему);
cmp [si], 0b0h ;потом младшее - 00B0 = 176 (почему тогда младшое слово больше за старшое слово?)

1800b0h = 1573040
18 = 24
00B0 = 176
И связанно ли с этими числами прерывания INT 8 = 18.2 раза в секунду?
Запутался в этих числах...Надеюсь Вас не запутал =) Помогите чайнику smile

Лысков Игорь Витальевич
Старший модератор

ID: 7438

# 4

 +1 
 
= общий = | 12.12.2016, 23:54 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер
porsiya:

Счетчик тиков - двойное слово. Не два слова, а одно двойное, сначала младшее слово, следом - старшее.
Как правильно сказано: 1800b0h = 1573040
Это число связано с прерываниями таймера следующим образом:
1573040 * 0,054925494583735950770482632355185 сек = 60*60*24 сек = 1 сутки

=====
Каждый выбирает по себе -
Щит и латы, посох и заплаты.
Меру окончательной расплаты
Каждый выбирает для себя.

Лысков Игорь Витальевич
Старший модератор

ID: 7438

# 5

 +1 
 
= общий = | 12.12.2016, 23:56 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер
porsiya:

1/0,054925494583735950770482632355185 сек = 18,206481481481481481481481481543 раза в сек

=====
Каждый выбирает по себе -
Щит и латы, посох и заплаты.
Меру окончательной расплаты
Каждый выбирает для себя.

porsiya
Посетитель

ID: 400782

# 6

= общий = | 13.12.2016, 00:35 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер
Лысков Игорь Витальевич:

Всё по полочкам разложили) smile
Спасибо большое Игорь Витальевич! Очень помогли!)))

 

Возможность оставлять сообщения в мини-форумах консультаций доступна только после входа в систему.
Воспользуйтесь кнопкой входа вверху страницы, если Вы зарегистрированы или пройдите простую процедуру регистрации на Портале.

Яндекс Rambler's Top100

главная страница | поддержка | задать вопрос

Время генерирования страницы: 0.14470 сек.

© 2001-2017, Портал RFPRO.RU, Россия
Авторское право: ООО "Мастер-Эксперт Про"
Калашников О.А.  |  Гладенюк А.Г.
Версия системы: 7.41 от 25.02.2017
Бесплатные консультации онлайн