Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.11.2015, 00:13   #1
artem55555p
Пользователь
 
Регистрация: 21.08.2013
Сообщений: 21
По умолчанию Исправить ошибку в программе (ассемблер)

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

Программа (ошибка в 32 строке):
Код:
assume   cs:code, ds:data
    code   segment para public 'code'
    start:
       mov   ax, 351ch
       int   21h      ;узнаем вектор 1ch в es:bx
       mov   ax, data
       mov   ds, ax      ;ds = data
       mov   Off_1c, bx   ;сохраним старый адрес в сегменте данных
       mov   Seg_1c, es
       lea   dx, new_1c   ;установим новый адрес
       push   cs      ;обработчика прерывания 1ch
       pop   ds      ;ds:dx
       mov   ax, 251ch
       int   21h
       mov   ax, data
       mov   ds, ax      ;ds = data
       mov   si, 123     
       mov   bx, Ticks   ;сохраним значение счетчика тиков в bx
       mov   cx, 10000   ;будем считать 10000 * 10000 = 100 000 000 циклов
    Loop_1:
       push   cx
       mov   cx, 10000
    Loop_2:
       mov   di, si      ;тестовые команды
       add   di, si
       mul   si
       loop   Loop_2
       pop   cx
       loop   Loop_1
       mov   ax, Ticks   ;новое число тиков
       sub   ax, bx      ;число затраченных тиков
       push   ax ds      ;сохраним ax и ds                                                 ЗДЕСЬ ПИШЕТ ОШИБКА!!!!
       lds   dx, dword ptr Off_1c   ;ds:dx - адрес старого вектора
       mov   ax, 251ch
       int   21h      ;восстановим!
       pop   ds       ;ds = data
       lea   dx, sTicks   ;выведем пояснение
       mov   ah, 9
       int   21h
       pop   ax      ;число тиков
       call   PutNumber   ;выведем
    Exit:
       lea   dx, sPress   ;выведем приглашение нажать на любую клавишу
       mov   ah, 9
       int   21h
       mov   ah, 0      ;ждем
       int   16h
       mov   ax, 4c00h
       int   21h      ;выход в ДОС
    PutNumber   proc      ;преобразование числа из ax в строку и вывод на экран
       xor   cx, cx      ;счетчик разрядов
       mov   bx, 10      ;делим на 10
    DivLoop:         ;цикл преобразования в разряды
       cwd         ;подготавливаем dx:ax к делению
       idiv   bx      ;dx = очередному младшему разряду
       push   dx      ;сохраним в стеке
       inc   cx      ;считаем
       test   ax, ax      ;продолжаем, пока не дойдем до 0
       jnz   DivLoop
    PrLoop:            ;цикл вывода в обратном порядке
       pop   ax      ;берем число 0-9 из стека
       or   al, '0'      ;преобразовываем в символ '0'-'9'
       int   29h      ;выводим
       loop   PrLoop
       ret
    PutNumber   endp
    new_1c:            ;подпрограмма отработки 1ch
       push   ds      ;сохраним ds
       push   data
       pop   ds      ;ds = data
       inc   Ticks      ;инкремент Ticks в сегменте данных!
       pushf         ;вызовем старый обработчик, сначала надо pushf, т.к. выход по iret!
       call   dword ptr Off_1c;адрес в переменной в сегменте данных
       pop   ds      ;восстановим ds
       iret         ;возврат из прерывания
    code   ends
    data   segment   para public 'data'
    Off_1c   dw   0      ;смещение старого вектора 1c
    Seg_1c   dw   0      ;сегмент старого вектора 1c
    Ticks   dw   0      ;счетчик имков таймера
    sTicks   db   'Ticks count = $'
    sPress   db   0dh,0ah,'Press any key$'
    bStr   db   16 dup (?)   ;строка для формирования числовой строки
    data   ends
       end   start

Подскажите, в чем дело... Использую эмулятор 8086

Последний раз редактировалось Вадим Мошев; 12.11.2015 в 00:16.
artem55555p вне форума Ответить с цитированием
Старый 12.11.2015, 10:57   #2
rlib
Форумчанин
 
Аватар для rlib
 
Регистрация: 22.05.2012
Сообщений: 352
По умолчанию

Не пробовали:
push ax
push ds
rlib вне форума Ответить с цитированием
Старый 12.11.2015, 16:05   #3
artem55555p
Пользователь
 
Регистрация: 21.08.2013
Сообщений: 21
По умолчанию

Пробовал, но тогда программа запускается, но работает неправильно. помогите исправить
artem55555p вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите исправить ошибку в программе!! ssergey100 Windows 8 25.08.2014 12:10
Исправить ошибку в программе. Лександра Помощь студентам 1 13.05.2012 15:46
Исправить ошибку в программе MedvedPnZ Общие вопросы C/C++ 1 01.05.2012 20:37