Форум программистов, компьютерный форум, киберфорум
Assembler, MASM, TASM
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.63/2256: Рейтинг темы: голосов - 2256, средняя оценка - 4.63
Ушел с форума
Автор FAQ
 Аватар для Mikl___
16379 / 7691 / 1080
Регистрация: 11.11.2010
Сообщений: 13,771
14.11.2013, 07:16  [ТС]
ГЛАВА 9
ЛОГИЧЕСКИЕ КОМАНДЫ
(часть 2/2)


Команды обработки бит

Команды сканирования бит
Команда BSF

(Побитное сканирование вперед = Bit Scan Forward)
Синтаксис команды:
BSF <DEST>,<SRC>
Возможные варианты команды:
bsf reg,reg/mem
Семантика команды: для проверки наличия единичных битов в операнде SRC. Если первый единичный бит числа находится в N-ой позиции, значит само число кратно 2N-1.
Псевдокод:
IF SRC=0 THEN ZFhttps://www.cyberforum.ru/cgi-bin/latex.cgi?\leftarrow; DEST имеет неопределенное значение.
ELSE
ZFhttps://www.cyberforum.ru/cgi-bin/latex.cgi?\leftarrow0
DESThttps://www.cyberforum.ru/cgi-bin/latex.cgi?\leftarrow0
WHILE Bit(SRC,DEST)=0 DO
DESThttps://www.cyberforum.ru/cgi-bin/latex.cgi?\leftarrowDEST+1
ENDDO
ENDIF
Алгоритм работы:
  • просмотр битов операнда SRC, начиная с бита 0 и заканчивая битом 15/31, до тех пор, пока не встретится единичный бит;
  • если встретился единичный бит, то флаг ZF устанавливается в 0 и
    в регистр операнда DEST записывается номер позиции, где встретился единичный бит. Диапазон значений зависит от
    разрядности операнда SRC: для 16-разрядного операнда – это 0...15; для 32-разрядного – это 0...31;
  • если единичных битов нет, то флаг ZF устанавливается в 1.
Применение: команду BSF используют при работе на битовом уровне для определения позиции в операнде SRC крайних справа единичных битов.
Найдем номер крайнего справа бита в регистре EBX, содержащего единицу
Assembler
1
2
MOV EBX,8004h
BSF ECX,EBX;ECX=2 в ECX номер крайнего правого единичного бита
что эквивалентно
Assembler
1
2
3
4
5
6
7
 MOV EBX,8004h
PUSH EBX
OR ECX,-1 ;ECX=-1
a1: SHR EAX,1;уменьшаем значение в EAX пока не встретим 1
INC ECX
JNC a1;ECX=2
POP EBX
Найдем номер крайнего справа бита в регистре EBX, содержащего ноль.
Assembler
1
2
3
4
MOV EBX,8004h
NOT EBX
BSF ECX,EBX;ECX=0 в ECX номер крайнего правого единичного бита
NOT EBX;теперь в ECX номер крайнего правого нулевого бита
Выделение крайнего справа единичного бита в регистре EBX.
Assembler
1
2
3
4
MOV EBX,8004h;1000.0000.0000.0100b
MOV EAX,EBX
NEG EAX;EAX=0FFFF7FFCh
AND EAX,EBX;EAX=4=0000.0000.0000.0100b
Команда BSR
(Побитное сканирование назад = Bit Scan Reverse)
Синтаксис команды:
BSR <DEST>,<SRC>
Возможные варианты команды:
bsr reg,reg/mem
Семантика команды: проверка наличия единичных битов в операнде SRC.
Алгоритм работы:
  • просмотр битов SRC, начиная со старшего бита 15/31 и заканчивая битом 0 до тех пор, пока не встретится единичный бит;
  • если встретился единичный бит, флаг ZF устанавливается в 0 и в регистр операнда DEST записывается номер позиции (отсчет осуществляется относительно нулевой позиции), где встретился самый старший единичный бит. Диапазон значений зависит от разрядности SRC: для 16-разрядного операнда это 0...15; для 32-разрядного – 0...31;
  • если единичных битов нет, флаг ZF устанавливается в 1.
Псевдокод: IF SRC=0 THEN ZFhttps://www.cyberforum.ru/cgi-bin/latex.cgi?\leftarrow1; DEST имеет неопределенное значение.
ELSE
ZFhttps://www.cyberforum.ru/cgi-bin/latex.cgi?\leftarrow0
DESThttps://www.cyberforum.ru/cgi-bin/latex.cgi?\leftarrowOperandSize-1
WHILE Bit(SRC,DEST)=0 DO
DESThttps://www.cyberforum.ru/cgi-bin/latex.cgi?\leftarrowDEST-1
ENDDO
ENDIF
Применение: команду BSR используют при работе на битовом уровне для определения позиции крайних слева единичных битов.
Найдем номер крайнего слева бита в регистре EBX содержащего единицу.
Assembler
1
2
MOV EBX,8004h
BSR ECX,EBX ;ECX=0Fh
что эквивалентно
Assembler
1
2
3
4
5
6
7
 MOV EBX,8004h
PUSH EBX
MOV ECX,32
a1: SHL EBX,1
DEC ECX
JNC a1 ;ECX=0Fh
POP EBX
Команды проверки и модификации бит

Команда BT

(Проверка битов = Bit Test)
Синтаксис команды:
BT <SRC>,<Index>
Возможные варианты команды:
bt reg/mem,reg
bt reg/mem,imm

Семантика команды: извлечение значения заданного бита в флаг CF.
Алгоритм работы:
  • получить бит в операнде SRC по указанному номеру позиции в Index;
  • установить флаг CF согласно значению этого бита.
Псевдокод:
CFhttps://www.cyberforum.ru/cgi-bin/latex.cgi?\leftarrowBit(SRC, Index)
Применение: команду BT используют для определения значения конкретного бита в операнде SRC. Номер проверяемого бита задается содержимым операнда Index (значение числом из диапазона 0...31). После выполнения команды, флаг CF устанавливается в соответствии со значением проверяемого бита.
Assembler
1
2
BT EBX,8 ; CF равен значению 8-го бита регистра EBX
JC M1 ;перейти на M1, если проверяемый бит равен 1
что эквивалентно
Assembler
1
2
3
4
PUSH EBX
SHR EBX,9 ;CF равен значению 8-го бита регистра EBX
POP EBX
JC M1 ;перейти на M1, если проверяемый бит равен 1
Команда BTC
(Проверка бита и его инверсия = Bit Test and Complement)
Синтаксис команды:
BTC <SRC>,<Index>
Возможные варианты команды:
btc reg/mem,reg
btc reg/mem,imm

Семантика команды: извлечение значения заданного бита в флаг CF и изменение его значения в операнде SRC на обратное.
Псевдокод: CFhttps://www.cyberforum.ru/cgi-bin/latex.cgi?\leftarrowBit(SRC,Index)
Bit(SRC, Index)https://www.cyberforum.ru/cgi-bin/latex.cgi?\leftarrowNOT Bit(SRC, Index)
Алгоритм работы:
  • получить значение бита с номером позиции Index в операнде SRC;
  • инвертировать значение выбранного бита в операнде SRC;
  • установить флаг СF исходным значением бита.
Применение: команда BTС используется для определения и инвертирования значения конкретного бита в операнде SRC. Номер проверяемого бита задается содержимым операнда Index (значение из диапазона 0...31). После выполнения команды флаг CF устанавливается в соответствии с исходным значением бита, то есть тем, которое было до выполнения команды.
Инвертирование 8-го бита регистра EBX:
Assembler
1
2
MOV EBX,010011000b
BTC EBX,8 ;CF=0 и EBX=110011000b
что эквивалентно:
Assembler
1
2
3
4
5
6
MOV EBX,110011000b
CLC;обнуляем CF
PUSH EBX
SHR EBX,9;CF равен измененному значению 8-го бита EBX
CMC;инвертируем CF, то есть устанавливаем его равным
POP EBX;исходному значению 8-го бита
Команда BTR
(Проверка бита с его сбросом в 0 = Bit Test and Reset)
Синтаксис команды:
BTR <SRC >,<Index >
Возможные варианты команды:
btr reg/mem,reg
btr reg/mem,imm

Семантика команды: извлечение значения заданного бита в флаг CF и изменение его значения на нулевое.
Псевдокод: CFhttps://www.cyberforum.ru/cgi-bin/latex.cgi?\leftarrowBit(SRC, Index)
Bit(SRC, Index)https://www.cyberforum.ru/cgi-bin/latex.cgi?\leftarrow0
Алгоритм работы:
  • получить значение бита с указанным номером позиции в операнде SRC;
  • установить флаг CF значением выбранного бита;
  • установить значение исходного бита в операнде SRC в 0.
Применение: команда BTR используется для определения значения конкретного бита в операнде SRC и его сброса в 0. Номер проверяемого бита задается содержимым операнда Index (значение из диапазона 0...31). В результате выполнения команды флаг CF устанавливается в соответствии со значением исходного бита, то есть тем, что было до выполнения операции.
Проверка состояния бита 8 регистра EBX и его сброс
Assembler
1
2
MOV EBX,01001100h
BTR EBX,8 ;CF=1 и EBX=01001000h
что эквивалентно:
Assembler
1
2
3
4
5
PUSH EAX
MOV EAX,EBX
AND EBX,0FFFFFEFFh;EBX=01001000h
SHR EAX,9;CF равен исходному значению 8-го бита EBX
POP EAX
Команда BTS
(Проверка бита с его установкой в 1 = Bit Test and Set)
Синтаксис команды:
BTS <SRC>,<Index>
Возможные варианты команды:
bts reg/mem, reg
bts reg/mem, imm

Семантика команды: извлечение значения заданного бита операнда SRC в флаг CF и установка этого бита в единицу.
Псевдокод: CFhttps://www.cyberforum.ru/cgi-bin/latex.cgi?\leftarrowBit(SRC, Index)
Bit(SRC, Index)https://www.cyberforum.ru/cgi-bin/latex.cgi?\leftarrow1
Алгоритм работы:
  • получить значение бита с указанным номером позиции в операнде SRC;
  • установить флаг CF значением выбранного бита;
  • установить значение исходного бита в операнде SRC в 1.
Применение: команда BTS используется для определения значения конкретного бита в операнде SRC и установки проверяемого бита в 1.
Номер проверяемого бита задается содержимым операнда Index (значение из диапазона 0...31). После выполнения команды флаг CF устанавливается в соответствии со значением исходного бита, то есть тем, что было до выполнения операции.
Проверка состояния 0-го бита регистра EBX и его установка в 1
Assembler
1
2
MOV EBX,01001000h
BTS EBX,0 ;CF=0 EBX=01001001h
что эквивалентно
Assembler
1
2
3
4
5
PUSH EAX
MOV EAX,EBX
OR EBX,1;EBX=01001001h
SHR EAX,1;CF равен исходному значению 0-го бита EBX
POP EAX
Работа с битами
Для обнуления крайнего справа единичного бита (например, 01011000https://www.cyberforum.ru/cgi-bin/latex.cgi?\rightarrow01010000) используется формула
X AND(X – 1)
Установка крайнего справа нулевого бита (01011100https://www.cyberforum.ru/cgi-bin/latex.cgi?\rightarrow01011110)
X OR(X+1)
Для выделения крайнего справа единичного бита (01011000https://www.cyberforum.ru/cgi-bin/latex.cgi?\rightarrow0001000)
X AND(-X)
Для выделения крайнего справа нулевого бита (10100111 https://www.cyberforum.ru/cgi-bin/latex.cgi?\rightarrow 00001000)
(NOT X)AND(X+1)
Для выделения завершающих нулевых битов (например, 01011000https://www.cyberforum.ru/cgi-bin/latex.cgi?\rightarrow00000111) можно использовать одну из трех формул:
  • (NOT X)AND(X-1) или
  • NOT(X OR(-X)) или
  • (X AND(-X))-1
Для выделения крайнего правого единичного бита и всех завершающих нулей (01011000https://www.cyberforum.ru/cgi-bin/latex.cgi?\rightarrow00001111)
X XOR(X-1)
Распространение вправо крайнего правого единичного бита (например 01011000 https://www.cyberforum.ru/cgi-bin/latex.cgi?\rightarrow01011111)
X OR(X-1)
Обнуление крайней справа непрерывной подстроки единичных битов (01011100https://www.cyberforum.ru/cgi-bin/latex.cgi?\rightarrow01000000)
((X OR(X-1))+1)AND X

Команды управления флагами микропроцессора

Установка флага CF
Синтаксис команды:
STC (SET Carry flag)
Семантика команды: установка флага переноса CF.
Псевдокод:[CEnter]EFLAGS.CF[bit 0]https://www.cyberforum.ru/cgi-bin/latex.cgi?\leftarrow1
Сброс флага CF
Синтаксис команды:
CLC (CLEAR Carry flag)
Семантика команды: сброс флага переноса CF
Псевдокод:
EFLAGS.CF[bit 0]https://www.cyberforum.ru/cgi-bin/latex.cgi?\leftarrow0
Инвертировать флаг CF
Синтаксис команды:
CMC (COMPLEMENT Carry flag)
Семантика команды: инвертирование флага переноса CF
Псевдокод:
EFLAGS.CF[bit 0]https://www.cyberforum.ru/cgi-bin/latex.cgi?\leftarrow NOT EFLAGS.CF[bit 0]
Алгоритм работы: Если CF=1, то после команды CMC флага переноса CF сбросится в ноль, если CF=0, то после команды CMC флага переноса CF установится в 1.
Применение: команды STC, CLC, CMC применяют, как правило, для установления признака успешного или не успешного выполнения подпрограмм.
Установка флага DF
Синтаксис команды:
STD (SET Direct flag)
Семантика команды: установка флага направления DF в единицу.
Псевдокод:
EFLAGS.DF[bit 10]https://www.cyberforum.ru/cgi-bin/latex.cgi?\leftarrow1
Сброс флага DF
Синтаксис команды:
CLD (CLEAR Direct flag)
Семантика команды: сброс флага направления DF.
Псевдокод:
EFLAGS.DF[bit 10]https://www.cyberforum.ru/cgi-bin/latex.cgi?\leftarrow0
Применение: в процессе циклического выполнения команд, значения в регистрах ESI и EDI автоматически модифицируются (уменьшаются или увеличиваются) в зависимости от длины элемента строки и значения флага направления DF. Если DF=0, значения в регистрах ESI и EDI увеличиваются (строка символов обрабатывается со стороны меньших адресов в сторону больших адресов). Если DF=1, значения в регистрах ESI и EDI уменьшаются (строка символов обрабатывается со стороны больших адресов в сторону меньших адресов).
Установка флага IF
Синтаксис команды:
STI (SET Interrupt flag)
Семантика команды: установка флага разрешения прерывания IF в единицу, разрешая процессору распознавать маскированные прерывания. Немаскированные прерывания распознаются процессором всегда, независимо от значения флага прерывания IF.
Псевдокод:
EFLAGS.IF[bit 9]https://www.cyberforum.ru/cgi-bin/latex.cgi?\leftarrow1
Сброс флага IF
Синтаксис команды:
CLI (CLEAR Direct flag)
Семантика команды: сброс флага разрешения прерывания IF.
Псевдокод:
EFLAGS.IF[bit 9]https://www.cyberforum.ru/cgi-bin/latex.cgi?\leftarrow0
Применение: организация обработки критических участков программы, в которых прервать работу микропроцессора невозможно. Однако этим не стоит злоупотреблять, так как аппаратные прерывания использует и операционная система.
Установка флага ZF

Синтаксис команды:
XOR AX,AX, или SUB AX, AX, либо любая другая команда, которая даст нулевой результат.
Семантика команды: установка флага ZF.
Псевдокод:
EFLAGS.ZF[bit 6]https://www.cyberforum.ru/cgi-bin/latex.cgi?\leftarrow1
Установка флага TF

Синтаксис команды:
INT 3
Семантика команды: установка флага TF в единицу.
Псевдокод:
EFLAGS.TF[bit 8]https://www.cyberforum.ru/cgi-bin/latex.cgi?\leftarrow1
Применение: пошаговое выполнение программы с целью ее выявления ошибок.
Одновременное изменение значения нескольких флагов
Если необходимо изменить значения других флагов или одновременно изменить значения нескольких флагов используют следующие схемы:
  • для первых 8 флагов (SF, ZF, AF, PF, CF);
    Assembler
    1
    2
    3
    4
    5
    6
    
    LAHF;загрузить значения младшего байта
    ;регистра EFLAGS в регистр AH
    AND AH, маска ;сбросить необходимые флаги
    ;или OR AH, маска;или установить необходимые флаги
    SAHF;загрузить младший байт регистра флагов
    ;значениями установленными в регистре AH
  • для первых 16 флагов (вышеперечисленные и NT, IOPL, OF, DF, IF, TF,);
    Assembler
    1
    2
    3
    4
    5
    6
    7
    8
    
    PUSHF;передать содержимое EFLAGS на вершину стека
    POP AX;прочесть слово, находящееся на вершине стека
    ;в один из регистров или в ячейку памяти
    AND AX, маска;сбросить нужные флаги
    ;или OR AX, маска; или установить нужные флаги
    PUSH AX; вновь передать содержимое регистра
    ;или ячейки памяти на вершину стека
    POPF;прочитать слово с вершины стека в регистр EFLAGS
  • для всех 32 флагов (все вышеперечисленные и AC, VM, RF).
    Assembler
    1
    2
    3
    4
    5
    6
    
    PUSHFD
    POP EAX
    AND EAX, маска
    ;или OR EAX, маска
    PUSH EAX
    POPFD
Обобщаем. Как изменить (установить/сбросить)
определенный бит в байте?
Нумеровать биты принято с нуля, причем младший бит (нулевой) имеет маску 1, первый – 2, второй – 4, третий – 8 и т.д, т.е. маска = 2n (или 1 shl n), где n – номер бита. Управлять битами можно с помощью инструкций and, or, xor, btr, bts и btc:
Assembler
1
2
3
4
5
6
7
8
Mask = 1 shl n ;Маска
and al,not Mask ; Сбросить бит(ы)
or al,Mask ; Установить бит(ы)
xor al,Mask ; Инвертировать (изменить) бит(ы)
and al,not (1 shl 2 + 1 shl 5);Сбросить второй и пятый биты
btr al,n ; Сбросить бит
bts al,n ; Установить бит
btc al,n ; Инвертировать (изменить) бит
Эти операции можно применять к операндам любого размера (байт, слово, двойное слово), находящимся как в регистре, так и в памяти.
Определить состояние бита можно с помощью инструкций test и shr (ror, rcr, sar) и инструкции bt (с помощью инструкций btr, bts и btc тоже можно определить состояние изменяемого бита):
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Mask = 1 shl n ; Маска
test al,Mask ; Проверить состояние бита
jz Reset ; переход, если бит сброшен
jnz Set ; переход, если бит установлен
test al,(1 shl 2+1 shl 5);Проверить состояние 2-ого и 5-ого битов
jz Reset ; переход, если ОБА бита сброшены
jnz Set ;переход, если ХОТЯ БЫ ОДИН из битов установлен
shr al,n+1 ;Проверить бит n (регистр AL изменяется!)
jnc Reset ;переход, если бит сброшен
jc Set; переход, если бит установлен
bt al,n ; Проверить бит n
jnc Reset ; переход, если бит сброшен
jc Set ; переход, если бит установлен
bts al,n ; Проверить бит n и установить его
jnc Reset ; переход, если бит был сброшен
jc Set ; переход, если бит был установлен
Контрольные вопросы и упражнения
  1. Предположим, что регистр BL содержит 11100011b и переменная по имени BOOLDOG содержит 01111001b. Напишите программы, определяющие воздействие на регистр BL следующих команд:
    1. XOR BL,BOOLDOG;
    2. AND BL,BOOLDOG;
    3. OR BL,BOOLDOG;
    4. NOT BL;
    5. XOR BL,BL;
    6. XOR BL,11111111b;
    7. OR BL,11111111b;
    8. AND BL,00000000b.
  2. Предположим, что регистр BL содержит 11100011b. Укажите возможные способы, которыми можно инвертировать содержимое регистра BL.
  3. Составить программу, которая по состоянию 0-го и 1-го битов регистра EDX:
    1. сбрасывала 0-й и 1-й биты, если они оба установлены;
    2. устанавливала 0-й и 1-й биты, если они оба сброшены;
    3. не изменяла 0-й и 1-й биты в остальных случаях.
  4. Составить программу, которая после проверки 2 и 4 битов переменной в ячейке памяти YORK передавала бы управление на метку ERR12, если оба бита установлены, передавала управление на метку ERR1, если установлен бит 2 – передавала управление на метку ERR2, если установлен бит 4 и продолжалась бы, если оба бита сброшены.
Миниатюры
Электронный учебник   Электронный учебник   Электронный учебник  

Электронный учебник   Электронный учебник   Электронный учебник  

Электронный учебник   Электронный учебник   Электронный учебник  

Изображения
      
6
Закрытая тема Создать тему
Новые блоги и статьи
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru