LinuxForum.Fans
Тема

Что такое -msahf?

Автор: bobr 3 сообщений 4763 просмотров
#55454

Баловался с CFLAGS, нашел вот что: gcc-4.5 включает флаг -msahf, если указать -march=native на Intel Atom N270, который вообще-то 32-разрядный. Если -march=atom, то этот флаг не включается. Насколько я понял, немного погуглив на эту тему, этот флаг для 64-битных процессоров. Так зачем же gcc его включает?
[console]
bobr bin # gcc -march=native -Q --help=target|grep enabled
-m32 [enabled]
-m80387 [enabled]
-m96bit-long-double [enabled]
-malign-stringops [enabled]
-mfancy-math-387 [enabled]
-mfp-ret-in-387 [enabled]
-mfused-madd [enabled]
-mglibc [enabled]
-mhard-float [enabled]
-mieee-fp [enabled]
-mmovbe [enabled]
-mno-sse4 [enabled]
-mpush-args [enabled]
-mred-zone [enabled]
-msahf [enabled]
-mstackrealign [enabled]
-mtls-direct-seg-refs [enabled]
[/console]
[console]
bobr bin # gcc -march=atom -Q --help=target|grep enabled
-m32 [enabled]
-m80387 [enabled]
-m96bit-long-double [enabled]
-malign-stringops [enabled]
-mfancy-math-387 [enabled]
-mfp-ret-in-387 [enabled]
-mfused-madd [enabled]
-mglibc [enabled]
-mhard-float [enabled]
-mieee-fp [enabled]
-mno-sse4 [enabled]
-mpush-args [enabled]
-mred-zone [enabled]
-mstackrealign [enabled]
-mtls-direct-seg-refs [enabled]
[/console]

#55475

Тут почитал, ничего не понял :D .


Эта опция позволяет использовать инструкцию SAHF в генерируемом 64битном коде...


SAHF - (Store AH register into register Flags)
Загрузка регистра флагов eFlags/Flags из регистра AH
Схема команды: sahf
Назначение: запись содержимого регистра ah в младший байт регистра eflags/flags, в котором содержатся пять флагов cf, pf, af, zf и sf.
Алгоритм работы:
Команда загружает младший байт регистра eflags/flags содержимым регистра ah. В битах 7, 6, 4, 2 и 0 регистра ah должны, соответственно, содержаться новые значения флагов sf, zf, af, pf и cf.
Применение:
Эта команда используется совместно с командой lahf. Из-за того, что регистр флагов непосредственно недоступен, сочетание этих команд можно применять для анализа - и, возможно, изменения - состояния некоторых флагов в регистре eflags/flags. Содержимое старшей части регистра флагов не изменяется.


LAHF - (Load AH register from register Flags)
Загрузка регистра AH флагами из регистра eFlags/Flags
Схема команды: lahf
Назначение: извлечение содержимого младшего байта регистра eflags/flags, в котором содержатся пять флагов: cf, pf, af, zf и sf.
Алгоритм работы:
команда загружает регистр ah содержимым младшего байта регистра eflags/flags.
Применение:
Из-за того, что регистр флагов непосредственно недоступен, команду lahf можно применять для анализа и последующего изменения командой sahf состояния некоторых флагов регистра eflags/flags.


eflags/flags (flag register) — регистр флагов. Разрядность eflags/flags — 32/16 бит. Отдельные биты данного регистра имеют определенное функциональное назначение и называются флагами. Младшая часть этого регистра полностью аналогична регистру flags для i8086.

Исходя из особенностей использования, флаги регистра eflags/flags можно разделить на три группы:

1. 8 флагов состояния. Эти флаги могут изменяться после выполнения машинных команд.
Флаги состояния регистра eflags отражают особенности результата исполнения арифметических или логических операций. Это дает возможность анализировать состояние вычислительного процесса и реагировать на него с помощью команд условных переходов и вызовов подпрограмм. В табл. 1 приведены флаги состояния и указано их назначение;
2. 1 флаг управления. Обозначается df (Directory Flag).
Он находится в 10-м бите регистра eflags и используется цепочечными командами. Значение флага df определяет направление поэлементной обработки в этих операциях: от начала строки к концу (df = 0) либо наоборот, от конца строки к ее началу (df = 1).
Для работы с флагом df существуют специальные команды: cld (снять флаг df) и std (установить флаг df).
Применение этих команд позволяет привести флаг df в соответствие с алгоритмом и обеспечить автоматическое увеличение или уменьшение счетчиков при выполнении операций со строками;
3. 5 системных флагов, управляющих вводом/выводом, маскируемыми прерываниями, отладкой, переключением между задачами и виртуальным режимом 8086.
Прикладным программам не рекомендуется модифицировать без необходимости эти флаги, так как в большинстве случаев это приведет к прерыванию работы программы.
#55589
mycetophylax написал:
Тут почитал, ничего не понял :D .

Там же читал, это и сбило с толку. Инструкция-то 64-битная, зачем ее использовать на 32-бит процессоре? А ведь, она зачем-то включена в -march=native для этого процессора. Я ее выключил. Может стоит включить?

Войдите или зарегистрируйтесь, чтобы ответить.