Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RFpro.ru: Ассемблер? Это просто! Учимся программировать


РАССЫЛКИ ПОРТАЛА RFPRO.RU

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

Коцюрбенко Алексей aka Жерар
Статус: Мастер-Эксперт
Рейтинг: 371
∙ повысить рейтинг »
Evgen aka Chuma
Статус: 4-й класс
Рейтинг: 317
∙ повысить рейтинг »
nikitos82.01
Статус: 1-й класс
Рейтинг: 1
∙ повысить рейтинг »

∙ Assembler

Номер выпуска:1640
Дата выхода:17.12.2016, 20:15
Администратор рассылки:Лысков Игорь Витальевич (Старший модератор)
Подписчиков / экспертов:35 / 13
Вопросов / ответов:1 / 1

Консультация # 190283: Здравствуйте, уважаемые эксперты! Прошу вас ответить на следующий вопрос: Архитектура х86 - К сожалению больше информации о ассемблере не скажу, но надеюсь она и не понадобится т.к. вопрос состоит не в написании программы, а в описании несколько строчек, элементарных для эксперта=) Итак что я делаю - в задании я использую прерывания INT 8 (П...

Консультация # 190283:

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

Дата отправки: 12.12.2016, 18:27
Вопрос задал: porsiya (Посетитель)
Всего ответов: 1
Страница онлайн-консультации »


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

Здравствуйте, 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 одобряю!


Оценить выпуск | Задать вопрос экспертам

главная страница  |  стать участником  |  получить консультацию
техническая поддержка

Дорогой читатель!
Команда портала RFPRO.RU благодарит Вас за то, что Вы пользуетесь нашими услугами. Вы только что прочли очередной выпуск рассылки. Мы старались. Пожалуйста, оцените его. Если совет помог Вам, если Вам понравился ответ, Вы можете поблагодарить автора - для этого в каждом ответе есть специальные ссылки. Вы можете оставить отзыв о работе портале. Нам очень важно знать Ваше мнение. Вы можете поближе познакомиться с жизнью портала, посетив наш форум, почитав журнал, который издают наши эксперты. Если у Вас есть желание помочь людям, поделиться своими знаниями, Вы можете зарегистрироваться экспертом. Заходите - у нас интересно!
МЫ РАБОТАЕМ ДЛЯ ВАС!


В избранное