Форум программистов, компьютерный форум, киберфорум
Assembler, MASM, TASM
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.86/7: Рейтинг темы: голосов - 7, средняя оценка - 4.86
187 / 180 / 25
Регистрация: 27.01.2012
Сообщений: 1,335
1

Критическая секция запретом аппаратных прерываний

12.01.2013, 09:46. Просмотров 1408. Ответов 15
Метки нет (Все метки)


Собственно вопрос в названии. Могу ли я быть абсолютно уверен в том, что код вида:
Assembler
1
2
3
cli
.. ;всякие проверки на то, что некоторые данные уже используются другим потоком или ещё чего
sti
будет однозначно работать, как цельная транзакция? Если да, то могу ли я так же быть уверен в этом при внесении такого же кода в C/C++ программу?

p.s *в виде бонуса* что быстрее:
Assembler
1
xor ax, ax
или
Assembler
1
mov ax, 0
?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
12.01.2013, 09:46
Ответы с готовыми решениями:

Глобальные перехваты аппаратных прерываний
Вот посидел попробывал и, понял что вот так нельзя из-под доса отследить или эмулировать нажатия...

Обработка аппаратных прерываний по номеру IRQ
Здравствуйте! Подскажите пожалуйста ответ на вопрос:Как ОС различает когда несколько устройств...

Какие функции прерываний используются в обработчике прерываний от клавиатуры?
Под функциями же имеется ввиду int ..h?

Критическая секция
Добрый день. Подскажите пожалуйста: в коде ниже если один поток пишет в file1.txt, другой не сможет...

15
202 / 168 / 11
Регистрация: 30.05.2012
Сообщений: 703
12.01.2013, 11:55 2
Цитата Сообщение от nexen Посмотреть сообщение
огу ли я быть абсолютно уверен в том, что код вида:
Код ASM
cli
.. ;всякие проверки на то, что некоторые данные уже используются другим потоком или ещё чего
sti
будет однозначно работать, как цельная транзакция? Если да, то могу ли я так же быть уверен в этом при внесении такого же кода в C/C++ программу?
В Досе - да, но в многозадачной винде cli и sti не помогут.


Цитата Сообщение от nexen Посмотреть сообщение
что быстрее:
Код ASM
1
xor ax, ax
или
Код ASM
1
mov ax, 0
?
Ну естественно xor ax, ax, так как логические операции работают быстрее комманды mov.
1
Ушел с форума
Автор FAQ
14173 / 7057 / 831
Регистрация: 11.11.2010
Сообщений: 12,665
12.01.2013, 12:43 3
Цитата Сообщение от Anonimys Посмотреть сообщение
Ну естественно xor ax, ax, так как логические операции работают быстрее комманды mov.
а на самом деле скорость sub ax,ax, xor ax,ax, and ax,0, imul ax,0, mov ax,0 будет одинаковой, а вот длина инструкций разной
1
187 / 180 / 25
Регистрация: 27.01.2012
Сообщений: 1,335
12.01.2013, 13:03  [ТС] 4
Получается нельзя в многозадачной ОС "эмулировать" свою транзакцию (без использования обычных мютексов, семафоров и так далее), чтобы никакой другой процесс не вмешивался?
0
2821 / 1630 / 252
Регистрация: 03.12.2007
Сообщений: 4,222
12.01.2013, 15:35 5
Цитата Сообщение от Mikl___ Посмотреть сообщение
а на самом деле скорость sub ax,ax, xor ax,ax, and ax,0, imul ax,0, mov ax,0 будет одинаковой, а вот длина инструкций разной
Что считать скоростью? И какой процессор рассматривать? Например, mov или xor в таком случае возьмут для ax другой регистр, a imul - я что-то не уверен, что он не будет ждать получения значения ax от предыдущих инструкций перед выполнением...
1
Ушел с форума
Автор FAQ
14173 / 7057 / 831
Регистрация: 11.11.2010
Сообщений: 12,665
12.01.2013, 16:43 6
Цитата Сообщение от Somebody Посмотреть сообщение
Например, mov или xor в таком случае возьмут для ax другой регистр, a imul - я что-то не уверен, что он не будет ждать получения значения ax от предыдущих инструкций перед выполнением...
Somebody,
И? О чем ответ?
  • О зависимости значений регистров при конвейерной обработке от предыдущих команд?
    Нет здесь зависимости от предыдущих операций, так как речь идет об ОБНУЛЕНИИ значения регистра вне зависимости от того что там находится
  • Или о том, что при умножении можно задействовать какие-то другие регистры кроме АХ?
    Как раз для двух-трех опрерандном IMUL на непосредственное значение можно использовать ЛЮБОЙ регистр. И при умножении/делении ALU прежде всего убеждается, что сомножитель/делитель/делимое не равно нулю, а уже потом начинает складывать/вычитать/сдвигать, а в том случае, когда сомножитель/делимое равно нулю результат выдается сразу без предварительных вычислений
  • кто мешает написать программу и в цикле десяток миллионов раз обнулить регистр способами указанными мной и при помощи RTDSC замерить время?
1
2821 / 1630 / 252
Регистрация: 03.12.2007
Сообщений: 4,222
12.01.2013, 19:22 7
1) Переименование регистров.
Цитата Сообщение от Mikl___ Посмотреть сообщение
Нет здесь зависимости от предыдущих операций, так как речь идет об ОБНУЛЕНИИ значения регистра вне зависимости от того что там находится
Зависимость есть. Процессор же в общем случае не проверяет операнды до выполнения инструкции, а результат умножения зависит от операндов. Кажется, есть частные случаи для sub и xor с одним и тем же регистром, но вряд ли для imul с нулём.
2) ALU
Цитата Сообщение от Mikl___ Посмотреть сообщение
И при умножении/делении ALU прежде всего убеждается, что сомножитель/делитель/делимое не равно нулю, а уже потом начинает складывать/вычитать/сдвигать, а в том случае, когда сомножитель/делимое равно нулю результат выдается сразу без предварительных вычислений
Зачем ALU проверять операнд, если умножение всё равно настолько быстро, что быстрее уже не будет? Зато будет усложнение схемы.
Цитата Сообщение от Mikl___ Посмотреть сообщение
кто мешает написать программу и в цикле десяток миллионов раз обнулить регистр способами указанными мной и при помощи RTDSC замерить время?
Вообще изначально лень мешает...
Ну, написал. Миллиард итераций по 20 заданных инструкций в каждой. Тут ещё другие факторы могут влиять, но всё равно не в пользу imul'а.
xor eax, eax 11699872380
xor ax, ax 20187548906
imul eax, 0200922229704
imul ax, 0221018268646
2
64 / 64 / 0
Регистрация: 06.10.2011
Сообщений: 300
12.01.2013, 19:23 8
естественно xor eax eax будет быстрее xor eax 0 потому что ноль хоть и сидит уже в кеше, но все таки не в регистре. чтоб проверить надо писать программу и измерять - как видимо и сделали выше, на разных процессорах очень разные результаты
1
187 / 180 / 25
Регистрация: 27.01.2012
Сообщений: 1,335
12.01.2013, 21:07  [ТС] 9
Somebody, imul = умножение?
В гугле забанили
0
202 / 168 / 11
Регистрация: 30.05.2012
Сообщений: 703
14.01.2013, 13:51 10
Цитата Сообщение от nexen Посмотреть сообщение
imul = умножение?
Да,
IMUL

(Integer MULtiply)
Умножение целочисленное со знаком

Схема команды: imul множитель_1
imul множ_1,множ_2
imul рез-т,множ_1,множ_2
Назначение: операция умножения двух целочисленных двоичных значений со знаком.
Синтаксис
Алгоритм работы:
Алгоритм работы команды зависит от используемой формы команды. Форма команды с одним операндом требует явного указания местоположения только одного сомножителя, который может быть расположен в ячейке памяти или регистре. Местоположение второго сомножителя фиксировано и зависит от размера первого сомножителя:

если операнд, указанный в команде, — байт, то второй сомножитель располагается в al;
если операнд, указанный в команде, — слово, то второй сомножитель располагается в ax;
если операнд, указанный в команде, — двойное слово, то второй сомножитель располагается в eax.
Результат умножения для команды с одним операндом также помещается в строго определенное место, определяемое размером сомножителей:
при умножении байтов результат помещается в ax;
при умножении слов результат помещается в пару dx:ax;
при умножении двойных слов результат помещается в пару edx:eax.
Команды с двумя и тремя операндами однозначно определяют расположение результата и сомножителей следующим образом:
в команде с двумя операндами первый операнд определяет местоположение первого сомножителя. На его место впоследствии будет записан результат. Второй операнд определяет местоположение второго сомножителя;
в команде с тремя операндами первый операнд определяет местоположение результата, второй операнд — местоположение первого сомножителя, третий операнд может быть непосредственно заданным значением размером в байт, слово или двойное слово.
Состояние флагов после выполнения команды:
11 07 06 04 02 00
OF SF ZF AF PF CF
r ? ? ? ? r
Команда imul устанавливает в ноль флаги of и cf, если размер результата соответствует регистру назначения. Если эти флаги отличны от нуля, то это означает, что результат слишком велик для отведенных ему регистром назначения рамок и необходимо указать больший по размеру регистр для успешного завершения данной операции умножения. Конкретными условиями сброса флагов of и cf в ноль являются следующие условия:
для однооперандной формы команды imul регистры ax/dx/edx являются знаковыми расширениями регистров al/ax/eax;
для двухоперандной формы команды imul для размещения результата умножения достаточно размерности указанных регистров назначения r16/r32;
то же для трехоперандной команды умножения.
Применение:
Команда выполняет целочисленное умножение операндов с учетом их знаковых разрядов. Для выполнения этой операции необходимо наличие двух сомножителей. Размещение и задание их местоположения в команде зависит от формы применяемой команды умножения, которая, в свою очередь, определяется моделью микропроцессора. Так, для микропроцессора i8086 возможна только однооперандная форма команды, для последующих моделей микропроцессоров дополнительно можно использовать двух- и трехоперандные формы этой команды.
.486
...
mov bx,186
imul eax,bx,8
;если результату не хватило размерности операнда1,
;то перейдем на m1, где скорректируем ситуацию:
jc m1
1
187 / 180 / 25
Регистрация: 27.01.2012
Сообщений: 1,335
14.01.2013, 18:22  [ТС] 11
Anonimys, где взяли столь подробное описание? О_о
0
658 / 245 / 49
Регистрация: 20.11.2012
Сообщений: 541
14.01.2013, 19:51 12
Цитата Сообщение от nexen Посмотреть сообщение
где взяли столь подробное описание?
слей себе Intel-овский Instruction Set Reference. Там все подробно описано и логика со всеми изменениями флагов и т.п. в псевдокоде дана для каждой инструкции.
http://www.intel.com/content/w... nuals.html
Intel® 64 and IA-32 Architectures Software Developer's Manual Combined Volumes 2A, 2B, and 2C: Instruction Set Reference, A-Z
А в документе Intel® 64 and IA-32 Architectures Optimization Reference Manual есть ответы на вопросы вроде
Цитата Сообщение от nexen Посмотреть сообщение
p.s *в виде бонуса* что быстрее:
xor ax, ax или
mov ax, 0?
1
202 / 168 / 11
Регистрация: 30.05.2012
Сообщений: 703
15.01.2013, 18:31 13
Цитата Сообщение от nexen Посмотреть сообщение
Anonimys, где взяли столь подробное описание? О_о
Книжка называется "Справочная система по языку ассемблера IBM PC".

Вот ссылка: http://cs.mipt.ru/docs/comp/ru... index.html
1
187 / 180 / 25
Регистрация: 27.01.2012
Сообщений: 1,335
16.01.2013, 10:02  [ТС] 14
И всё же, если выходит так, что cli/sti не позволяют запретить прерывания на время их активации, то что же делать с изменением стековых регистров?
Assembler
1
2
3
4
5
cli
mov ax, SomeSS
mov ss, ax
mov sp, SomeSP
sti
Выходит, что программу могут прервать другие в момент, когда изменился только сегмент/смещение, а значит, программа поместит ss/sp в стек, не предназначеный для этого (ведь изменились не оба регистра)..
0
658 / 245 / 49
Регистрация: 20.11.2012
Сообщений: 541
16.01.2013, 10:39 15
Цитата Сообщение от nexen Посмотреть сообщение
Выходит, что программу могут прервать другие в момент, когда изменился только сегмент/смещение, а значит, программа поместит ss/sp в стек, не предназначеный для этого (ведь изменились не оба регистра)..
Я ведь выше давал ссылку на intel instruction set reference
Loading the SS register with a MOV instruction inhibits all interrupts until after the execution of the next instruction. This operation allows a stack pointer to be loaded into the ESP register with the next instruction (MOV ESP,
stack-pointer value) before an interrupt occurs
2
202 / 168 / 11
Регистрация: 30.05.2012
Сообщений: 703
16.01.2013, 16:00 16
Цитата Сообщение от WhiteP Посмотреть сообщение
Loading the SS register with a MOV instruction inhibits all interrupts until after the execution of the next instruction. This operation allows a stack pointer to be loaded into the ESP register with the next instruction (MOV ESP,
stack-pointer value) before an interrupt occurs
Перевод:
Загрузка SS регистра коммандой mov подавляет прерывания до исполнения следующей инструкции. Это позволяет заполнить регистр ESP следующей командой до прерывания.
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.01.2013, 16:00

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь или здесь.

Критическая секция
Привет! Вот я уже как дня 2 маюсь с критической секцией CriticalSection.Enter; CS.Enter; ...

Критическая секция
Есть процесс в нем создается 2 потока, проблема в том, что когда один из потоков находится в...

Критическая секция
такая задача. есть глобальный указатель на структуру. в main -е динамически выделяю память под...

Критическая секция
Очень срочно,помогите пожалуйста,на Сях,реализовать работу бензоколонки - бензин 80,92,95,98,Дизель...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.