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

Обсуждение

давно
Посетитель
7438
7205
13.11.2015, 18:48
общий
Адресаты:
Здравствуйте, уважаемый
Один из двух вариантов - мой
Честно говоря, я никогда эмуляторами не пользовался...
Сейчас скачал, попробовал... Как мне кажется, ответ прост:
Та программка была рассчитана под формат EXE.
А эмулятор (а не эмелятор ) формирует формат COM.
Сейчас нарисую, чтобы было под COM...
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
7438
7205
13.11.2015, 19:06
общий
Адресаты:
Кроме того, это не программа бесконечно считает, а
эмулятор эмулирует о-о-очень медленно...
Поэтому, придется ждать долго...
В том вопросе речь шла о работе в реальном режиме времени...
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
7438
7205
13.11.2015, 19:14
общий
Адресаты:
Как я писал тогда, за 1000000 операций таймер не успеет сделать ни одного инкремента.
Останется 0
Эмулятор явно не тот инструмент, чтобы смотреть, как работает эта программа...
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
399158
228
13.11.2015, 19:48
общий
Ну а вы под эмулятор сможете 1 000 000 сделать?
давно
Посетитель
399158
228
13.11.2015, 19:58
общий
http://clip2net.com/s/3qhMRmc меняю количество комант, а результат тот же пишет, можете помочь?
давно
Посетитель
7438
7205
13.11.2015, 19:59
общий
Адресаты:
Можно сделать. Но! 10000 циклов делаются минут 20. Я не засекал, но по ощущениям...
Умножаем на 100, получаем 100*(1/3 часа) = 33 часа.
И при этом, в результате получим 0! Хороша задачка...
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
7438
7205
13.11.2015, 20:02
общий
Адресаты:
А чего Вы хотели? Команды пролетают очень быстро (не смотря на то, что в эмуляторе еле ползут).
Я в том ответе писал, что только досчитав до 100 000 000 можно получить счетчик тиков = 18 !
Вы представляете, сколько ЭТО будет выполняться под эмулятором?
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
7438
7205
13.11.2015, 20:04
общий
Адресаты:
Данная задачка была хороша для времени, когда были РС-шки с частотой 4.77 МГц
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
7438
7205
13.11.2015, 20:10
общий
Адресаты:
Мой совет: обратитесь к преподу, пусть внесет коррективы...
Какие, решайте сами... На то он и препод, чтобы думать...
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
399158
228
13.11.2015, 21:35
общий
понял, спасибо большое
давно
Старший Модератор
31795
6196
14.11.2015, 21:31
общий
Адресаты:
Использование прерывания 1С для получения времени выполнения на современных машинах абсурдно.
[code h=200]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[/code]
Проще использовать системный счетчик:
[code h=200]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[/code]
Смотрите сами, хоть какие то цифры получаются.

Удачи!
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Посетитель
399158
228
14.11.2015, 21:44
общий
[q=31795][/q] в эмуляторе emu 8086 это не работает. вы можете под него сделать?
давно
Старший Модератор
31795
6196
14.11.2015, 21:55
общий
Адресаты:
Эма черезвычайно глючный эмулятор.
Этот код проверялся на ХР32. Компилируете файл и запускаете его в проводнике.
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Посетитель
399158
228
14.11.2015, 22:07
общий
а в Turbo Debugger будет работать? т.к. мненадо или через emu8086 либо через Turbo Debugger сделать
давно
Старший Модератор
31795
6196
14.11.2015, 22:13
общий
Адресаты:
Какая именно задача стоит перед Вами?
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Посетитель
399158
228
14.11.2015, 22:18
общий
реализовать это в emu8086 или на крайний случай в Turbo Debugger
давно
Посетитель
399158
228
14.11.2015, 23:24
общий
получится что нибудь реализовать?
давно
Старший Модератор
31795
6196
15.11.2015, 00:25
общий
15.11.2015, 00:30
Адресаты:

Качаете TASM 4.10, в пакете есть TD. Компилировать нужно как СОМ-файл.
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Посетитель
399158
228
15.11.2015, 01:40
общий
можете рассказать как её пользоваться? вот я извлек файл...
давно
Посетитель
399158
228
15.11.2015, 01:40
общий
что мне дальше делать?
давно
Старший Модератор
31795
6196
15.11.2015, 09:37
общий
Адресаты:
1)Распаковываете в папку пакет.
2)Компилируете файл с помощью ВАТ-файла с содержимым:
Код:
tasm name,,,
tlink name,,, /t

3)Запускаете TD, он поругается на отсутствие отладочной информации. Меню FILE | OPEN, вместо *.ЕХЕ в поле пишете *.СОМ, в окне должны появится все СОМ-файлы в папке, выбираете нужный и открываете. Дальше:
[table]
[row][col]F9[/col][col]Выполнение [/col][/row]
[row][col]F8[/col][col]Шаг с пропуском[/col][/row]
[row][col] F7[/col][col]Трассировка[/col][/row]
[row][col]F4[/col][col]Выполнение до курсора[/col][/row]
[row][col]Alt-F9[/col][col]Выполнение до ...[/col][/row]
[row][col]Alt-F8[/col][col]Выполнение до возврата[/col][/row]
[row][col]Alt-F7[/col][col]Трассировка инструкций[/col][/row]
[row][col]Alt-F4[/col][col]Обратная трассировка[/col][/row]
[/table]
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Посетитель
399158
228
15.11.2015, 10:38
общий
Компилируете файл с помощью ВАТ-файла с содержимым это где находится?
давно
Посетитель
399158
228
15.11.2015, 16:24
общий
Не удалось запустить программу или компонент "\??\C:\Work\TASM.EXE" из-за несовместимости с 64-разрядной версией Windows. Обратитесь к разработчику программного обеспечения за версией программы, совместимой с 64-разрядной версией Windows
это пишет(
давно
Посетитель
399158
228
15.11.2015, 17:59
общий
подскажите?
давно
Старший Модератор
31795
6196
17.11.2015, 15:26
общий
Адресаты:
Читаете и качаете DOSBox - запуск программ под DOS на Win7 64bit, запускаете в режиме совместимости,
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Старший Модератор
31795
6196
17.11.2015, 15:42
общий
Адресаты:
+Инструкция
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Посетитель
399158
228
17.11.2015, 17:47
общий
спасибо, разобролся
давно
Старший Модератор
31795
6196
17.11.2015, 18:25
общий
Адресаты:
Получилось запустить программы?
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Посетитель
399158
228
17.11.2015, 18:29
общий
да, спасибо
давно
Старший Модератор
31795
6196
17.11.2015, 19:15
общий
это ответ
Здравствуйте, Посетитель - 399158!

Использовать прерывание 1С, для контроля времени выполнения, при современных скоростях - абсурд.
Тем не мение смотрите приложение:
[code h=200]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[/code]
проще использовать системный счетчик:
[code h=200]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[/code]
Все программы написаны под TASM и XP32.
Удачи!
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

Форма ответа