29.11.2020, 14:21 [+3 UTC]
в нашей команде: 4 903 чел. | участники онлайн: 4 (рекорд: 21)

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

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

все разделы

правила

новости

участники

доска почёта

форум

блоги

поиск

статистика

наш журнал

наши встречи

наша галерея

отзывы о нас

поддержка

руководство

Версия системы:
8.0.4
28.11.2020

Общие новости:
27.11.2020, 13:43

Форум:
29.11.2020, 09:56

Последний вопрос:
29.11.2020, 10:24
Всего: 153396

Последний ответ:
29.11.2020, 09:50
Всего: 260696

Последняя рассылка:
29.11.2020, 10:15

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

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

Наша кнопка:

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

Отзывы о нас:
10.12.2019, 20:41 »
оксана
спасибо большое, всем знакомым буду рекомендовать ваш сайт [вопрос № 197342, ответ № 279245]
15.01.2012, 14:37 »
Даровко Антон Владимирович
Добрый день Гордиенко Андрей Владимирович! Я просмотрел Ваше решение задачи и я ставлю Вам оценку отлично за решение. Спасибо. [вопрос № 185175, ответ № 269589]
 

• Assembler

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

Администратор раздела: Зенченко Константин Николаевич (Старший модератор)

 
 

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

Коцюрбенко Алексей Владимирович
Статус: Старший модератор
Рейтинг: 2116
Зенченко Константин Николаевич
Статус: Старший модератор
Рейтинг: 194
Лысков Игорь Витальевич
Статус: Мастер-Эксперт
Рейтинг: 0
 

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

Консультация онлайн # 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, почему именно такое значения, как оно связанно с таймером.
Заранее спасибо уважаемые эксперты

-----
Прикрепленное изображение (кликните по картинке для увеличения):

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

Здравствуйте, 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
Спасибо большое Игорь Витальевич! Очень помогли!)))

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


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

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

2001-2020, Портал RFPRO.RU
Калашников О.А.  |  Гладенюк А.Г.
8.0.4    28.11.2020
JS 2.0.12 | CSS 4.0.9