Нашел любопытную программу в книге В.Пирогова "Ассемблер.Учебный курс". Вот пояснение к программе: "Иногда программе требуется знать, с каким процессором ей приходится работать... ... В каждом процессоре сущ-ет буфер команд...... Из последовательности команд выбирается несколько (сколько помещается в буфер) и заносится в буфер. По мере выполнения очередь пополняется новыми командами. Так что она всегда полна. Некоторые команды, однако, сбрасывают очередь, так что она заполняется, начиная со следующей команды. К командам, сбрасывающим очередь, относятся INT, IRET, RET, CALL и всевозможные команды перехода. Некоторые марки микропроцессоров можно отличить по размеру буфера. Ниже представлена программа, позволяющая определить размер буфера команд. Варьируя количество команд NOP, Вы легко определите длину буфера......" Код (Text): CODE SEGMENT ASSUME CS:CODE ORG 100h BEGIN: MOV DI, OFFSET MET JMP SHORT MET1 ;сбрасываем буфер команд MET1: MOV BYTE PTR [DI], 0C3h ;длина команды З байта NOP MET: NOP ;текст будет напечатан, если команда с меткой МЕТ не попадет ;в буфер команд после выполнения команды JMP SHORT MET1 LEA DX, TEXT MOV AH, 9 INT 21h RET TEXT DB 'The End!',13,10,'$' CODE ENDS END BEGIN Поясните пожалуйста программу (если не трудно, то поподробнее).
FAIR А ты на год издания книги посмотрел ? Простая очередь команд закончила свое существование вместе с процессорами 486 (или первыми пентиумами). Современные процессоры (PII и выше) устроены несколько иначе и приведенная программа будет выводить один и тот же результат независимо от того сколько команд "попадет в буфер". Да, в современных процах рулит предсказание и спекулятивное исполнение ветвлений, т.е. процессор начинает выполнять одну из веток, еще не зная точно понадобиться она или программа пойдет по другой ветке. НО спекулятивное исполнение не относится к командам ввода\вывода, прерываниям и некоторым другим serialized инструкциям - встретив такую команду процессор ожидает завершения всех предыдущих операций и однозначного определения направления всех переходов (при неверном предсказании осуществляется откат со сбросом спекулятивно полученных результатов). Это же относится и к записи данных в память - при выполнении mov процессор просто пишет данные во внутренние store-буферы, а действительная запись в кэш или ОЗУ осуществляется позже - когда подтвердится выполнение всех предыдущих операций. Резюме: на современных процах такие наивные штучки типа "легко определите длину буфера" не прокатывают, тем более что и самого буфера в таком наивном представлении в них нет. Но это уже несколько другая история