На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Название темы должно быть информативным !
Прежде чем задать вопрос, воспользуйтесь Поиском. и проверьте в FAQ (ЧАВО) Паскаля
Чтобы получить вразумительный ответ, подробно опишите проблему: что надо сделать, что не получается и номер ошибки (если есть), которую выводит компилятор.
Для вставки кода ваших программ используйте, пожалуйста, кнопку СODE=pas или выпадающий список СODE для других языков (подсветка синтаксиса).
[!] Как правильно задавать вопросы | Руководство по языку B.Pascal 7 & Objects/LR | Borland Pascal. Руководство пользователя
Модераторы: volvo877
Страницы: (2) [1] 2  все  ( Перейти к последнему сообщению )  
> Прерывания...
    :-/ Ээээ...
    Доброе время суток!

    Вот хотел спросить, что такое прерывания и с чем их едят?
      Коротко…
      Во время работы программы если происходит какое-либо событие (например сгенерированное пользователем нажатие клавиши, движение мыши и т.д.; программой: деление на ноль, обращение к дисководу и т.д.; устройством: таймер  и т.д.) прекращается выполнение работающих программ и запускается подпрограмма — обработчик прерываний которая выполняет необходимые действия. Обработчик прерываний можно вызывать программным путем, а можно подменить обработчик своим кодом если заменить адрес в таблице векторов прерываний
        Вот отрывочек из одной статейки
        Цитата
        Прерывания по сути являются требованиями к вам обратить на них внимание. Аналогично периферийные устройства вычислительной системы могут потребовать, чтобы процессор "обратил на них внимание". Поэтому событие, которое заставляет процессор приостановить выполнение своей программы для выполнения некоторой затребованной деятельности, называется прерыванием.
        Прерывания существенно увеличивают эффективность вычислительной системы, поскольку они позволяют внешним устройствам "обращать на себя внимание" процессора только по мере надобности. Если бы в системе не было прерываний, то процессору пришлось бы периодически проверять, не требует ли обслуживания какое-нибудь устройство системы. Это похоже на телефон без звонка: пользуясь им, вам приходилось бы очень часто снимать трубку и проверять, не пытается ли кто-нибудь с вами соединиться?
        А едят прерывания обычно с ассемблером, хотя можно и без него
        но с ним вкуснее ;D
        Например следующий кусок кода установит новый цвет бордера экрана
        ExpandedWrap disabled
           asm
            mov ah, 10h{номер функции}
            mov al, 01h{номер подфункции}
            mov bh,2{2-новый цвет бордера}
            int 10h  {номер прерывания (Видеосервис)}
           end;

        Вообще когда работаешь с прерываниями под рукой лучше
        иметь справочник. Сам я хороший справочник по прерываниям посоветовать немогу,
        но надеюсь народ тебе счас поможет.
          Так, что получается, если я долблю в клаву и дергаю грызуна постояно происходят прерывания? Я правильно понял?
            Кстати я еще читал, что для динамической переменной любого типа выделяется по 8 байт! А как же тогда для extended? Этот тип же 10 байт занимает...  ???
              как я знаю то вся инфа кодируется .... вот ... текст  точнее буква представлена в виде уникального двоичного кода от 00000000 до 11111111 ..... тобишь одЫн сивол 1 байт .... цифры в зависимости от размера занимает  от бита до 32 .... вроде так ... да и с extended ... тут дело в том какой диапазон у них ....  так у extended (от 3,4*10^-4951 до 1,1*10^4932)  - 10 байт а у real (от 5*10^-324 до 1,7*10^308 )- 8 байт - разницу очучаешь?? ........... вроде так  
              Сообщение отредактировано: lamachok -
                Цитата Unknown_Error, 24.06.03, 23:59:34
                Кстати я еще читал, что для динамической переменной любого типа выделяется по 8 байт! А как же тогда для extended? Этот тип же 10 байт занимает...  ???

                ???
                Первый раз слышу. Под указатель (адресс переменной в оперативной памяти) выделяется 4 байта. А размер памяти, на который он указывает (собственно динамическая переменная) может быть любой длины.  

                Сообщение отредактировано: Zenia -
                  2 Unknown_Error
                  Может ты читал что минимально адресуемой еденицей памяти являеться 1 байт
                  а 1 байт - 8 бит
                  Потом бит перепутался с байтом а остальное - работа воображения;D
                  И вообще раз так много вопросов появилось то лучше зарегится.
                  А то как бы, Vot эту тему не закрыл за офтопики.
                  2 Zenia
                  Цитата
                  А размер памяти, на который он указывает (собственно динамическая переменная) может быть любой длины.

                  А может всеже < 64kb ;)?

                  ЗЫ А на какой вопрос отвечал lamachok  до меня так и не дошло. :)
                    Цитата
                    А может всеже < 64kb ;) ?

                    А это в каком Паскале :) Сколько я знаю, в ТМТ хоть 4 гига адресуй через 1 вшивый пойнтер :) А в ВР/ТР да, до 65520 байт. (почему-то все 65536 не дает, пробовал)
                      64k-$8. $8 - для собственных нужд, наверное, администратора кучи.
                      Сообщение отредактировано: ozzy -
                        Цитата vesper1, 25.06.03, 15:25:51

                        А это в каком Паскале :) Сколько я знаю, в ТМТ хоть 4 гига адресуй через 1 вшивый пойнтер :)

                        Спасибо, товарищ, за поддержку  с фланга :)

                        И не только в ТМТ, но и в VP, FP, наверно, и в других 32 битных … Уж такой при модели памяти flat сегмент большой  :)
                        Сообщение отредактировано: Zenia -
                          Динамическая переменная, собсно любой пойнтер, это просто ДВА числа размещённых в памяти последовательно, т.е. один за другим. Первое определяет СЕГМЕНТ данных на которые указывает указатель(!), а второе-СМЕЩЕНИЕ относительно сегмента. Если компилер 32-битный то оба числа Longint (dword) т.е. 4*2=8 байта размер пойнтера, если же компилер 16-битный , то оба числа Word т.е. 2*2=4 байта размер пойнтера.
                          А теперь про прерывния...

                          Цитата
                          Живёт и работает у тебя в компе процессор. Работает, работает, и вдруг... Ты (т.е. пользователь) в это время например долбанул по клаве и наступило прерывание. Процер смотрит, а его за 56 ножку электрончик дёргает. Он приостанавливает работу, и идёт выяснять-чё блин там случилось. Пришёл, посмотрел, и вызывает специальную программу-контроллер прерываний:
                          -Эй ты, контроллер прерываний, ты что отдыхаешь, бездельник блин? Меня кто-то за 56-ю ножку дёргает . Иди выясняй, чтобы я от работы не отвлекался.
                          Контроллер прётся выяснять. Посмотрел, что там с 56-ой ножкой, и понял! - надо прерывание обработать. И вызывает своего помощника – обработчика прерывания (у него их 255, а вызывает он одного, который отвечает за это прерывание) . Тот идёт разбираться – он читает состояние флагов, регистров, участков памяти и.т.д… и в зависимости от этого выполняет определённую функцию прерывания. Когда прерывание закончилось, электрончику с 56-й ножки контроллер и обработчик прерывания делают харакири и работа ЦПУ благополучно продолжается.
                            То Tosha
                            для 32 битного тоже 4 байта (используется только смещение)
                              Точно, точно... Но не всегда. Есть версии компиляторов (32бит) которые используют сегментированный 32 битный защищённый режим.
                                vot чо я вам скажу нащёт динамической переменной. указатель 4 байта - что в реале, что в 32 бите, только они обозначают разные вещи. в 16бит сегмент-смещение, а в 32бит только смещение.

                                при выделении динамической переменной происходит помимо записи адреса в указатель также отмечание её в каких-то системных закромах, занимающее по одной из теорий 48 байт.

                                65520 байт вот по какой причине. сегменты, как известно, адресуют память только с точностью до 16 байт. соответственно ежели твоя переменная следует в памяти за другой переменной и начинается с адреса, не кратного 16, обращение v[65535] будет ссылаться не на 64к-1 байт вперёд, а на несколько байт до начала переменной, т е на предыдущую переменную.
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0381 ]   [ 15 queries used ]   [ Generated: 6.12.24, 18:04 GMT ]