Форум программистов, компьютерный форум, киберфорум
Assembler, MASM, TASM
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.63/2256: Рейтинг темы: голосов - 2256, средняя оценка - 4.63
Ушел с форума
Автор FAQ
 Аватар для Mikl___
16371 / 7683 / 1080
Регистрация: 11.11.2010
Сообщений: 13,757
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
Закрытая тема Создать тему
Новые блоги и статьи
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru