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

Обсуждение

давно
Посетитель
7438
7205
12.12.2016, 20:18
общий
12.12.2016, 20:43
Адресаты:
Давайте прокомментируем каждую строчку...
И даже попытался добавить строки выше и ниже...
[code lang=asm]
;добавлю, что, по идее, было раньше...
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), сохраняется в стеке,
; ; чтобы не испортить
;... ;что-то там делаем...
[/code]
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
7438
7205
12.12.2016, 21:00
общий
Адресаты:
Теперь все понятно?
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
400782
2
12.12.2016, 21:49
общий
Адресаты:
Очень хорошо расписали Игорь Витальевич))
Только вот с цифрами не совсем разобрался...
"чтобы отсчитать сутки, надо насчитать 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 раза в секунду?
Запутался в этих числах...Надеюсь Вас не запутал =) Помогите чайнику

давно
Посетитель
7438
7205
12.12.2016, 23:54
общий
Адресаты:
Счетчик тиков - двойное слово. Не два слова, а одно двойное, сначала младшее слово, следом - старшее.
Как правильно сказано: 1800b0h = 1573040
Это число связано с прерываниями таймера следующим образом:
1573040 * 0,054925494583735950770482632355185 сек = 60*60*24 сек = 1 сутки
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
7438
7205
12.12.2016, 23:56
общий
Адресаты:
1/0,054925494583735950770482632355185 сек = 18,206481481481481481481481481543 раза в сек
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
400782
2
13.12.2016, 00:35
общий
Адресаты:
Всё по полочкам разложили)
Спасибо большое Игорь Витальевич! Очень помогли!)))
давно
Посетитель
7438
7205
13.12.2016, 11:54
общий
это ответ
Здравствуйте, 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 раза в сек
Теперь по коду. Для понимания я добавил некоторые возможные строки выше и ниже приведенного фрагмента
[code lang=asm]
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), сохраняется в стеке,
; ; чтобы не испортить
;... ;что-то там делаем...
[/code]
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Форма ответа