Размер буфера команд процессора

Тема в разделе "WASM.BEGINNERS", создана пользователем FAIR, 12 сен 2005.

  1. FAIR

    FAIR New Member

    Публикаций:
    0
    Регистрация:
    10 сен 2005
    Сообщения:
    17
    Нашел любопытную программу в книге В.Пирогова "Ассемблер.Учебный курс". Вот пояснение к программе: "Иногда программе требуется

    знать, с каким процессором ей приходится работать... ... В каждом процессоре сущ-ет буфер команд...... Из последовательности команд

    выбирается несколько (сколько помещается в буфер) и заносится в буфер. По мере выполнения очередь пополняется новыми командами.

    Так что она всегда полна. Некоторые команды, однако, сбрасывают очередь, так что она заполняется, начиная со следующей команды. К командам, сбрасывающим очередь, относятся INT, IRET, RET, CALL и всевозможные команды перехода. Некоторые марки микропроцессоров можно отличить по размеру буфера. Ниже представлена программа, позволяющая определить размер буфера команд. Варьируя количество команд NOP, Вы легко определите длину буфера......"
    Код (Text):
    1.  
    2. CODE SEGMENT
    3.     ASSUME CS:CODE
    4.     ORG 100h
    5. BEGIN:
    6.     MOV DI, OFFSET MET
    7.     JMP SHORT MET1 ;сбрасываем буфер команд
    8. MET1:
    9.     MOV BYTE PTR [DI], 0C3h ;длина команды З байта
    10.      NOP
    11. MET: NOP
    12.     ;текст будет напечатан, если команда с меткой МЕТ не попадет
    13.     ;в буфер команд после выполнения команды JMP SHORT MET1
    14.     LEA DX, TEXT
    15.     MOV AH, 9
    16.     INT 21h
    17.     RET    
    18.     TEXT DB 'The End!',13,10,'$'    
    19. CODE ENDS
    20. END BEGIN
    21.  




    Поясните пожалуйста программу (если не трудно, то поподробнее).
     
  2. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    FAIR

    А ты на год издания книги посмотрел ? Простая очередь команд закончила свое существование вместе с процессорами 486 (или первыми пентиумами). Современные процессоры (PII и выше) устроены несколько иначе и приведенная программа будет выводить один и тот же результат независимо от того сколько команд "попадет в буфер". Да, в современных процах рулит предсказание и спекулятивное исполнение ветвлений, т.е. процессор начинает выполнять одну из веток, еще не зная точно понадобиться она или программа пойдет по другой ветке. НО спекулятивное исполнение не относится к командам ввода\вывода, прерываниям и некоторым другим serialized инструкциям - встретив такую команду процессор ожидает завершения всех предыдущих операций и однозначного определения направления всех переходов (при неверном предсказании осуществляется откат со сбросом спекулятивно полученных результатов). Это же относится и к записи данных в память - при выполнении mov процессор просто пишет данные во внутренние store-буферы, а действительная запись в кэш или ОЗУ осуществляется позже - когда подтвердится выполнение всех предыдущих операций.

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