Портал аспирантов

Портал аспирантов (http://www.aspirantura.spb.ru/forum/index.php)
-   Свободное общение (http://www.aspirantura.spb.ru/forum/forumdisplay.php?f=102)
-   -   Сны воина дzена... (http://www.aspirantura.spb.ru/forum/showthread.php?t=7532)

saovu 16.06.2011 21:33

Цитата:

Сообщение от gav (Сообщение 148577)
Проверили где, компилятор какой?

Старый добрый Досовый Borland Pascal.

Добавлено через 15 минут
Проверил в Delphi.
Да, 20.
Видимо оптимизация цикла так работает (на ноль проверять выгоднее) в случае когда переменная цикла внутри не используется.

gav 16.06.2011 21:48

saovu,
Цитата:

Старый добрый Досовый Borland Pascal.
Странно, Турбо Паскаль седьмой как и восьмой Дельфи, дает 20 :) Странно, что, вроде бы, в более новом, чем Турбо, Борланд Паскале не так.

Цитата:

Видимо оптимизация цикла так работает (на ноль проверять выгоднее) в случае когда переменная цикла внутри не используется.
Совершенно верно :) Только для ответа на вопрос запрещаю смотреть соответствующий ассемблерный код.
Может, поделитесь подобными вопросиками?:)

saovu 16.06.2011 22:50

Цитата:

Сообщение от gav (Сообщение 148609)
Может, поделитесь подобными вопросиками?

Ну разве может это сделать
Цитата:

Сообщение от gav (Сообщение 148294)
невоспитанно-аморальный тип saovu

?
:)

А серьезно - нет у меня таких вопросов в готовом виде.
Для преподавания мне они точно не нужны - видели б вы тех студентов, с которыми я работаю.
Дай Б-г там к 5-му курсу двое-трое из группы такие вопросы осилят.
Смешно сказать: на этой специальности готовят какбыпрограммистов (Специальность в дипломе "Математик. Системный программист"), а из всех преподов кафедры, программистов с профильным ВО и боевым опытом - только я (да и я уволюсь сейчас нахрен).
Так вот студентов на 1-ом курсе учать, что в языке C "#include <xxx.h>" означает ПОДКЛЮЧЕНИЕ БИБЛИОТЕК.
Я конечно пытаюсь переучивать (я на 2-ом курсе) - понимает (да и вообще пытается и хочет понять) один из десяти.
Так что "вопросики" я могу приводить только из своего же студенческого прошлого или трудовой деятельности. А это вспоминать надо.

Но если уж очень хотите, вот сходу пара вопросов. По тем ассемблерным листингам, что я привел.

1. Код из первого листинга

Old_2Fh_Vector:
Entry:
jmp near ptr Begin ; эта команда занимает три байта
fourthbyte db 0
Old_17h_Vector dd 0


Пояснить шо значат эти танцы с двумя метками Old_2Fh_Vector и Entry (метка, кстати, могла бы быть и одна, две - для ясности)


2. Код из второго листинга

MACRO Jmp_Next seg ; очистка очереди команд
db 0EAh ; jmp
dw $+4 ; адрес следующей команды
dw seg ; сегмент или селектор
ENDM


Что вообще означает код в этом макросе, и для чего-почему он используется строго СРАЗУ ЖЕ после включения защищенного режима процессора.

Paul Kellerman 17.06.2011 11:26

Цитата:

Сообщение от gav (Сообщение 148414)
for i:=1 to 20 do
begin
a:=a+b;
b:=a+b;
end;

Да, короче всего код для "нисходящего" цикла.

mov ecx,20
a0:
add eax,ebx
add ebx,eax
loop a0

Комнада loop уменьшает ecx на 1 и если результат больше 0, то переход на метку а0.

А компиляция "в лоб" дала бы более длинный код:

mov ecx,1
a0:
add eax,ebx
add ebx,eax
inc ecx
cmp ecx,20
jbe a0

Цитата:

Сообщение от gav (Сообщение 148414)
mov ch,5
mov ah, 51h
xor al,al
sub ah,ch
int 21h

Аффтар кода шутник, однако ;) Код эквивалентен коду:

mov ax,4C00h
int 21h

Короче стандартное завершение DOS-программы (код возврата = 0).

Цитата:

Сообщение от saovu (Сообщение 148682)
Old_2Fh_Vector:
Entry:
jmp near ptr Begin ; эта команда занимает три байта
fourthbyte db 0

4-байтная переменная, для хранения адреса (16-битный сегмент: 16-битное
смещение) обработчика прерывания, по совместительству выполняющая роль
исполняемого кода (jump на метку begin). При установке новых обработчиков
переменная разумеется модифицируется, и уже не годится для исполнения :)

Цитата:

Сообщение от saovu (Сообщение 148682)
MACRO Jmp_Next seg ; очистка очереди команд
db 0EAh ; jmp
dw $+4 ; адрес следующей команды
dw seg ; сегмент или селектор
ENDM

Дальний jump по абсолютному адресу, который вычисляется на этапе компиляции.
16-битное смещение зависит от положения точки применения макроса в исходном
коде, 16-битный сегментный адрес берется из того, что передается как параметр,
который тоже подставляется на этапе компиляции. Подобный прием используется
везде, где требуется сбросить конвейер процессора, чтобы избежать конфликтов.

saovu 17.06.2011 11:30

Цитата:

Сообщение от PavelAR (Сообщение 148879)
Аффтар кода шутник, однако

Не знаю. По мне так, скучная задачка на устный счёт.

Paul Kellerman 17.06.2011 11:34

Вложений: 1
А вообще с макросами я тоже раньше любил поизголяться. Было время, когда
писал свой макросовый "add-on" для Turbo Assembler, чтобы можно было в про-
граммах использовать SSE-инструкции процессора Pentium III, который тогда
только-только вышел, 97-й кажись год был, и очень хотелось SSE попробовать.

saovu 17.06.2011 14:05

Вообще-то решений тут я и не ждал (gav просил вопросики).
Но раз пошла такая пьянка.

Цитата:

Сообщение от PavelAR (Сообщение 148879)
Дальний jump по абсолютному адресу, который вычисляется на этапе компиляции.
16-битное смещение зависит от положения точки применения макроса в исходном
коде, 16-битный сегментный адрес берется из того, что передается как параметр,
который тоже подставляется на этапе компиляции. Подобный прием используется
везде, где требуется сбросить конвейер процессора, чтобы избежать конфликтов.

Да, разумеется.
Кстати, это вполне официальный способ рекомендуемый Интелом для очистки конвейера команд. Я так понимаю, что особую команду для этого заводить не стали (для экономии, ага; тем более она бы использовалась крайне редко) - поскольку уже есть побочное действие другой команды, дающее нужный результат.

На последнюю часть вопроса
Цитата:

Сообщение от saovu (Сообщение 148682)
для чего-почему он используется строго СРАЗУ ЖЕ после включения защищенного режима процессора

не ответили :)


Цитата:

Сообщение от PavelAR (Сообщение 148879)
4-байтная переменная, для хранения адреса (16-битный сегмент: 16-битное
смещение) обработчика прерывания, по совместительству выполняющая роль
исполняемого кода (jump на метку begin). При установке новых обработчиков
переменная разумеется модифицируется, и уже не годится для исполнения

Это верно.
На самом деле смысл этого кода в экономии 4 байт.
Переменная будет объявлена и затрет программный код, который уже точно не будет нужен к моменту использования переменной.

gav 17.06.2011 14:16

saovu, да, хорошие вопросики. особенно про конвейер команд, возьму на вооружение, вот нечто подобное и нужно :)
А насчет устного счета, то это скорее против непонятно откуда взявшейся проблемы.
Определенный процент студентов каждый год, почему то считает, что в паре
mov ax,4c00h
int 21h
Именно первая команда завершает работу досовской программы. При том, что команда mov - самая популярная в различных примерах. Этот пример достаточно эффективно отрезвляет.

saovu 17.06.2011 14:27

Цитата:

Сообщение от gav (Сообщение 148930)
Определенный процент студентов каждый год, почему то считает, что в паре
mov ax,4c00h
int 21h
Именно первая команда завершает работу досовской программы

Зная нонешних студентов - охотно верю.

Ink 18.06.2011 11:44

Между делом хотелось бы узнать: для чего нужны вот такие профессиональные видеокарты и почему они так дорого стоят?

saovu 18.06.2011 13:06

Цитата:

Сообщение от Ink (Сообщение 149127)
для чего нужны вот такие профессиональные видеокарты

ну там же написано
Цитата:

приложениях проектирования, анимации и видеообработки.
Цитата:

Сообщение от Ink (Сообщение 149127)
почему они так дорого стоят

Цитата:

Видеокарта PNY Quadro 5000 2560MB оснащена 2,5 Гб графической памяти GDDR5, 352 процессорами параллельных вычислений NVIDIA CUDA и передовой архитектурой Fermi.
352 процессора - не шутки.

Ink 18.06.2011 13:09

saovu, а обычная видеокарта? Ведь она то же может работать в
Цитата:

Сообщение от saovu (Сообщение 149149)
приложениях проектирования, анимации и видеообработки.

Т.е всё дело в
Цитата:

Сообщение от saovu (Сообщение 149149)
352 процессора

?
А практическое применение?

saovu 19.06.2011 12:28

Графика это такое дело, что "чем больше, тем лучше" и разумный предел наступит только когда будет достигнута реалистичность (тавтология) реального мира.


gav, да в ответе на вопросик про две метки, я оговорился: смысл кода в экономии 3 байт ! (а не четырёх)

Поскольку PavelAR не появляется, то сам же отвечу на последнюю часть вопроса про конвейер.
Код очистки конвейера используется строго СРАЗУ ЖЕ после включения защищенного режима процессора потому что в конвейер выбраны команды с адресацией (для тех команд где в качестве операндов - адреса) по правилам реального режима, а переключение в защищенный режим меняет, в том числе, все правила адресации.

Paul Kellerman 20.06.2011 09:11

Цитата:

Сообщение от saovu (Сообщение 149152)
что в конвейер выбраны команды с адресацией (для тех команд где в
качестве операндов - адреса) по правилам реального режима

Угу, адресация в защищенном режиме на порядок, а то и на два порядка сложнее
(если страничная адресация еще включена). JMP в вышеуказанной форме помимо
сброса конвейра заставляет еще в CS новый селектор загрузить, насколько помню.

Цитата:

Сообщение от saovu (Сообщение 148942)
Зная нонешних студентов - охотно верю

Некоторые даже уверены, что сначала появилась винда, графический интерфейс,
ворд-эксель, а уж потом специально ради всего этого придумали процессоры x86 ;)

saovu 20.06.2011 11:32

Вложений: 1
В этом семестре мне студенты заявили, что задание одной из лабораторок "Написать программу нахождения обратной матрицы ..." совершенно невыполнимо.

Принес (шоб им стыдно стало) показать выполненную мной (в 1995 году и тоже на 2-ом курсе) аналогичную работу, причем еще и с весьма навороченным UI в текстовом режиме (чего в данном случае от них точно не требовалось).

Студенты притихли. Работу, правда, всё равно не выполнили.

Вот, прилагаю свое творение.


Текущее время: 09:03. Часовой пояс GMT +3.

Powered by vBulletin® Version 3.8.8
Copyright ©2000 - 2025, vBulletin Solutions, Inc. Перевод: zCarot
© 2001—2025, «Аспирантура. Портал аспирантов»