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

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


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

Лучшие эксперты по данной тематике

Асмик Гаряка
Статус: Советник
Рейтинг: 11054
∙ повысить рейтинг »
Коцюрбенко Алексей aka Жерар
Статус: Советник
Рейтинг: 4497
∙ повысить рейтинг »
Куликов Роман Евгеньевич
Статус: 1-й класс
Рейтинг: 0
∙ повысить рейтинг »

/ КОМПЬЮТЕРЫ И СОФТ / Программирование / Assembler (Ассемблер)

Номер выпуска:1573
Дата выхода:21.11.2015, 18:51
Администратор рассылки:Лысков Игорь Витальевич (Старший модератор)
Подписчиков / экспертов:17 / 7
Вопросов / ответов:1 / 1

Консультация # 188193: Здравствуйте! Прошу помощи в следующем вопросе: Посчитать за какое время процессор выполнит 1 000 000 команд mov DI, SI; add DI, SI; mul SI. Для подсчёта времени использовать вектор 1Ch. Выводить на экран преобразованное в ASCII коды число тиков таймера, затраченное на операцию. Использую эмелятор EMU8086 ...


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

Здравствуйте! Прошу помощи в следующем вопросе:
Посчитать за какое время процессор выполнит 1 000 000 команд mov DI, SI; add DI, SI; mul SI. Для подсчёта времени использовать вектор 1Ch. Выводить на экран преобразованное в ASCII коды число тиков таймера, затраченное на операцию.
Использую эмелятор EMU8086

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


Консультирует Зенченко Константин Николаевич (Модератор):

Здравствуйте, Посетитель - 399158!

Использовать прерывание 1С, для контроля времени выполнения, при современных скоростях - абсурд.
Тем не мение смотрите приложение:

Код :
model   tiny
code
386
countMax   equ   10000;количество итераций
org   100h
begin:   mov   ax,351Ch;получить адрес старого обработчика
   int   21h
   mov   word ptr old1Co,bx;сохраняем адрес строго обработчика
   mov   word ptr old1Co+2,es
   mov   ax,251Ch;Устанавливаем свой обработчик
   lea   dx,new1C
   int   21h
   mov   cx,CountMax;готовим внешний цикл
   mov   si,100;так, чтобы хоть что-то делать
@@01:   push   cx;запоминаем внешний цикл
   mov   cx,CountMax;готовим внутренний цикл
@@02:   mov   di,si;пересылаем
   add   di,si;складываем
   mul   si;умножаем
   loop   @@02;внутренний цикл
   pop   cx;параметр внешнего цикла
   loop   @@01;внешний цикл
   push   ds;сохраняем сегментный регистр
   mov   ax,251Ch;устанавливаем старый обработчик
   lds   dx,dword ptr old1Co
   int   21h
   pop   ds;востанавливаем сегментный регистр
   mov   ah,9;выводим сообщение
   lea   dx,dbResult
   int   21h
   mov   eax,ddTik;загружаем полученное значение
   mov   ebx,10;система счисления
   xor   cx,cx;счетчик цифр в стэке
@@03:   xor   edx,edx;сбрасываем старший операнд
   div   ebx;делим
   push   dx;остаток в стек
   inc   cx;считаем цифры в стэке
   or   eax,eax;повторяем пока не ноль
   jnz   @@03;если не ноль переходим
@@04:   pop   ax;берем цифру из стэка
   add   al,'0';преобразовываем в символ
   int   29h;выводим
   loop   @@04;пока не кончаься цифры в стэке
   xor   ax,ax;ожидаем ввод
   int   16h
   ret;выход
new1C:   inc   dword ptr cs:ddTik;увеличиваем счетчик
   jmp   dword ptr cs:old1Co;переходим в старій обработчик
dbResult   db   10,13,'Result:$'
ddTik   dd   0
old1Co   dd   ?
   end   begin

проще использовать системный счетчик:
Код :
model   tiny
code
386
countMax   equ   10000
org   100h
begin:   mov   ah,9;выводим сообщение
   lea   dx,dbRes
   int   21h
   xor   ax,ax;готовимся считывать данные с БИОС
   mov   es,ax
   mov   cx,countMax;параметр внешнего цикла
   mov   si,100;чтобы хоть что-то делать
   mov   edi,es:[46CH];начальное количество тиков
@@01:   push   cx;запоминаем параметр внешнего цикла
   mov   cx,countMax;параметр внутреннего цмкла
@@02:   mov   di,si;пересвылаем
   add   di,si;складываем
   mul   si;умножаем
   loop   @@02;внутренний цикл
   pop   cx;востанавливаем параметр цикла
   loop   @@01;внешний цикл
   mov   eax,es:[46Ch];конечное количество тиков
   sub   eax,esi;получаем результат
   mov   ebx,10;система счисления
   xor   cx,cx;количество цифр в стэке
@@03:   xor   edx,edx;сбрасываем старший операнд
   div   ebx;делим
   push   dx;запоминаем остаток в стэке
   inc   cx;считаем количество цифр
   or   eax,eax;пока не ноль
   jnz   @@03;не ноль переходим
@@04:   pop   ax;получаем цифру из стэка
   add   al,'0';преобразовываем в символ
   int   29h;выводим
   loop   @@04;пока в стэке есть цифры
   xor   ax,ax;ожидаем ввод
   int   16h
   ret;возврат в систему
dbRes   db   10,13,'Result:$'
   end   begin

Все программы написаны под TASM и XP32.
Удачи!

Консультировал: Зенченко Константин Николаевич (Модератор)
Дата отправки: 17.11.2015, 19:15
Рейтинг ответа:

НЕ одобряю +2 одобряю!


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

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

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


В избранное