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

Вернуться   Портал аспирантов > Общие > Свободное общение

Ответ
 
Опции темы
Старый 16.06.2011, 16:10   #11
Ink
Киберпанк
 
Регистрация: 24.04.2009
Сообщений: 10,958
По умолчанию

PavelAR, увы, но не запускается вообще
Ink вне форума   Ответить с цитированием
Реклама
Старый 16.06.2011, 16:15   #12
Paul Kellerman
Gold Member
 
Регистрация: 25.06.2005
Адрес: F000:FFF0
Сообщений: 1,830
По умолчанию

В XP вроде должна нормально запускаться.
Ладно, завтра скину что-нить другое по 3D.
Paul Kellerman вне форума   Ответить с цитированием
Старый 16.06.2011, 16:17   #13
gav
Silver Member
 
Аватар для gav
 
Регистрация: 03.09.2004
Сообщений: 895
По умолчанию

Может, тут фишками какими делиться или интересными вопросами для студентов? Я веду "Архитектуру ЭВМ и систем", поэтому это очень актуально
Ощущаю дефицит в коротокоформлируемых, но требующих некоторое понимание, вопросах. Типа.
1. Создаем в Паскале короткий (но лучше длинный, если время есть) цикл:
for i:=1 to 20 do
begin
a:=a+b;
b:=a+b;
end;
При выполнении по шагам с удивлением обнаруживаем, что на первом проходе переменная i равна не 1, как мы написали в коде, а, наоборот, 20. Почему?
2. Что делает следующий ассемблерный код:
mov ch,5
mov ah, 51h
xor al,al
sub ah,ch
int 21h
gav вне форума   Ответить с цитированием
Старый 16.06.2011, 20:21   #14
saovu
Gold Member
 
Регистрация: 07.09.2005
Сообщений: 1,326
По умолчанию

Цитата:
Сообщение от PavelAR Посмотреть сообщение
В XP вроде должна нормально запускаться
Я думаю, дело не в операционной системе, а в неполной поддержке VESA VBE современными видеокартами.

Добавлено через 4 минуты
Цитата:
Сообщение от gav Посмотреть сообщение
Создаем в Паскале короткий (но лучше длинный, если время есть) цикл:
for i:=1 to 20 do
begin
a:=a+b;
b:=a+b;
end;
При выполнении по шагам с удивлением обнаруживаем, что на первом проходе переменная i равна не 1, как мы написали в коде, а, наоборот, 20. Почему?
gav, что за ерунда, она должна быть равна 1 и она равна 1 - я даже проверил.
Переменные i,a,b как объявлены ?
saovu вне форума   Ответить с цитированием
Старый 16.06.2011, 21:15   #15
gav
Silver Member
 
Аватар для gav
 
Регистрация: 03.09.2004
Сообщений: 895
По умолчанию

saovu,
Цитата:
Переменные i,a,b как объявлены ?
i - целочисленная, например, integer или byte;
a,b - не важно какие, например, тоже integer
Цитата:
gav, что за ерунда, она должна быть равна 1 и она равна 1 - я даже проверил.
А вот это интересно! Проверили где, компилятор какой?
gav вне форума   Ответить с цитированием
Старый 16.06.2011, 21:33   #16
saovu
Gold Member
 
Регистрация: 07.09.2005
Сообщений: 1,326
По умолчанию

Цитата:
Сообщение от gav Посмотреть сообщение
Проверили где, компилятор какой?
Старый добрый Досовый Borland Pascal.

Добавлено через 15 минут
Проверил в Delphi.
Да, 20.
Видимо оптимизация цикла так работает (на ноль проверять выгоднее) в случае когда переменная цикла внутри не используется.
saovu вне форума   Ответить с цитированием
Старый 16.06.2011, 21:48   #17
gav
Silver Member
 
Аватар для gav
 
Регистрация: 03.09.2004
Сообщений: 895
По умолчанию

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

Цитата:
Видимо оптимизация цикла так работает (на ноль проверять выгоднее) в случае когда переменная цикла внутри не используется.
Совершенно верно Только для ответа на вопрос запрещаю смотреть соответствующий ассемблерный код.
Может, поделитесь подобными вопросиками?
gav вне форума   Ответить с цитированием
Старый 16.06.2011, 22:50   #18
saovu
Gold Member
 
Регистрация: 07.09.2005
Сообщений: 1,326
По умолчанию

Цитата:
Сообщение от gav Посмотреть сообщение
Может, поделитесь подобными вопросиками?
Ну разве может это сделать
Цитата:
Сообщение от gav Посмотреть сообщение
невоспитанно-аморальный тип 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


Что вообще означает код в этом макросе, и для чего-почему он используется строго СРАЗУ ЖЕ после включения защищенного режима процессора.
saovu вне форума   Ответить с цитированием
Старый 17.06.2011, 11:26   #19
Paul Kellerman
Gold Member
 
Регистрация: 25.06.2005
Адрес: F000:FFF0
Сообщений: 1,830
По умолчанию

Цитата:
Сообщение от gav Посмотреть сообщение
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 Посмотреть сообщение
mov ch,5
mov ah, 51h
xor al,al
sub ah,ch
int 21h
Аффтар кода шутник, однако Код эквивалентен коду:

mov ax,4C00h
int 21h

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

Цитата:
Сообщение от saovu Посмотреть сообщение
Old_2Fh_Vector:
Entry:
jmp near ptr Begin ; эта команда занимает три байта
fourthbyte db 0
4-байтная переменная, для хранения адреса (16-битный сегмент: 16-битное
смещение) обработчика прерывания, по совместительству выполняющая роль
исполняемого кода (jump на метку begin). При установке новых обработчиков
переменная разумеется модифицируется, и уже не годится для исполнения

Цитата:
Сообщение от saovu Посмотреть сообщение
MACRO Jmp_Next seg ; очистка очереди команд
db 0EAh ; jmp
dw $+4 ; адрес следующей команды
dw seg ; сегмент или селектор
ENDM
Дальний jump по абсолютному адресу, который вычисляется на этапе компиляции.
16-битное смещение зависит от положения точки применения макроса в исходном
коде, 16-битный сегментный адрес берется из того, что передается как параметр,
который тоже подставляется на этапе компиляции. Подобный прием используется
везде, где требуется сбросить конвейер процессора, чтобы избежать конфликтов.

Последний раз редактировалось Paul Kellerman; 17.06.2011 в 12:17.
Paul Kellerman вне форума   Ответить с цитированием
Старый 17.06.2011, 11:30   #20
saovu
Gold Member
 
Регистрация: 07.09.2005
Сообщений: 1,326
По умолчанию

Цитата:
Сообщение от PavelAR Посмотреть сообщение
Аффтар кода шутник, однако
Не знаю. По мне так, скучная задачка на устный счёт.
saovu вне форума   Ответить с цитированием
Ответ


Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.



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


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