Главная страница
Предыдущая страница (условные и безусловные переходы)

На предыдущей странице мы рассмотрели команды условного и безусловного перехода. Но реально каждая команда условного перехода реагирует не на выполнение перед ней инструкции cmp, а на изменение флагов. Условные переходы можно делать не только с помощью цепочки cmp-jcc. Их можно делать после любой команды, изменяющей флаги (например, dec). Приведём пример "нестандартного применения" команды условного перехода:
   mov eax, 10;
@DecEax:
   dec eax;
   jnz @DecEax;
После выполнения этой цепочки команд eax примет значение 0. Команда dec в этом примере устанавливает флаги подобно команде cmp (видно, что команда dec меняет флаги аналогично cmp, только CF не трогает).
Понимаю, что если вы только начали изучать Ассемблер, то лучше пользоваться стандартной схемой cmp-jcc, но если вы уже хорошо понимаете что к чему, то с помощью экономии некоторых команд cmp можно добиться некоторого ускорения. Правда, программа становится менее понятной, но ведь само использование Ассемблера в целях ускорения работы программы предполагает, что мы ради скорости жертвуем читабельностью некоторых кусков программы. Мы это же самое могли бы написать средствами Паскаля, и это было бы более понятно, но медленнее

Команды управления флагами
FLAGS – 16-битный регистр, вот его биты:
11
10
?
7
6
4
2
0
OF
DF
IF
SF
ZF
AF
PF
CF
Что означают эти биты можно посмотреть здесь

Примечание: флаг IF не всегда меняется, так как существуют такие операционные системы, как Windows 2000 или Windows XP, которые считают, что чем меньше прикладным программам позволять, тем лучше
stc – установить CF в 1 clc – установить CF в 0
cld – установить DF=0 std – установить DF=1
cli – запретить прерывания (IF=0) sti – разрешить прерывания (IF=1)
pushf – поместить FLAGS в стек popf – загрузить FLAGS из стека

1) cmc – инвертировать
флаг переноса (CF)

2) lahf – загрузить флаги состояния в ah. Копирует младший байт регистра FLAGS в ah, включая SF (бит 7), ZF (бит 6), AF (бит 4), PF (бит 2), CF (бит 0). Бит 1 устанавливается в 1, биты 3 и 5 – в ноль

3) sahf – загрузить флаги состояния из ah. Загружает флаги SF, ZF, AF, PF, CF значениями битов 7, 6, 4, 2, 0 соответственно. Остальные биты регистра флагов не меняются

4) salc – устанавливает al в 0FFh, если CF=1, иначе устанавливает в 00h. Эквивалентна "sbb al, al", но флаги не меняет


Следующая страница (строковые операции)