Форум программистов, компьютерный форум, киберфорум
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
ЛОГИЧЕСКИЕ КОМАНДЫ
(часть 1/2)
Булева алгебра располагает тремя основными операциями – И, ИЛИ, НЕ, которые позволяют производить сложение, вычитание, умножение, деление и сравнение символов и чисел. Любые функции, которые Вы только пожелаете реализовать, можно осуществить, комбинируя вентили названных типов. Для всех функций, реализуемых в компьютере, имеется свое схемное представление, которое вступает в действие каждый раз, когда в регистр команд попадает соответствующая команда.
Логические команды выполняют логические операции, известные вам по языкам высокого уровня – инверсию, конъюнкцию и дизъюнкцию. Логические команды реализуют поразрядные операции: i-й разряд результата зависит только от i-х разрядов операндов. Логическая операция выполняется сразу над всеми разрядами операндов одновременно, параллельно.
Операндами логических команд должны быть либо байты, либо слова, либо двойные слова, либо счетверенные слова, но не то и другое одновременно (размер операндов должен обязательно совпадать!). В качестве второго операнда могут также использовать так называемую маску, записанную не в шестнадцатеричном, а в двоичном коде.
Команда NOT
(Логическое отрицание = logical NOT)


 P PII K6 3D! 3Mx+ SSE SSE2 A64 SSE3 E64T
NOT ? ? ? ? ? ? ? ? ? ?
Синтаксис команды: NOT < DEST>
Возможные варианты команды:
not reg/mem
Семантика команды: операция логического отрицания для операнда DEST размерностью байт, слово или двойное слово.
Псевдокод:
https://www.cyberforum.ru/cgi-bin/latex.cgi?DEST \leftarrow NOT https://www.cyberforum.ru/cgi-bin/latex.cgi?DEST
Алгоритм работы:
  • изменить значение каждого бит операнда DEST на противоположное: 0 на 1, 1 на 0;
  • записать результат операции в операнд DEST;
  • в отличии от других команд, если получился нулевой результат, то флаг нуля ZF не устанавливается, так как команда NOT не меняет ZF;
  • в отличие от других логических команд (OR, AND, XOR) команда NOT не сбрасывает флаг CF
Применение: Команда NOT используется для работы с операндами на уровне битов.
Assembler
1
2
MOV AL,0F3h;AL=11110011b
NOT AL ;AL=0Ch=00001100b
Так как для получения числа в дополнительном коде используется сперва инвертирование значения, а потом добавляется 1, то команда NOT DEST может заменить последовательности команд NEG DEST/DEC DEST или IMUL DEST,-1/DEC DEST или XOR DEST,-1
А вот так, если «размазать» по коду последовательности команд, можно «спрятать» команду NOT AL
1-й вариант 2-й вариант 3-й вариант4-й вариант 5-й вариант 6-й вариант
MOV AL,0F3h MOV AL,0F3h XOR BL,BL;BL=0MOV AL,0F3h OR BL,-1 INC AL;AL=0F4h
NEG AL;AL=0Dh IMUL EAX,-1;AL=0Dh SUB BL,AL;BL=0DhXOR AL,-1;AL=0Ch SUB BL,AL;BL=NOT AL NEG AL;AL=0Ch
DEC AL;AL=0Ch DEC AL;AL=0Ch DEC BL;BL=NOT AL   
Команда AND
(Логическое И = logical AND)


 P PII K6 3D! 3Mx+ SSE SSE2 A64 SSE3 E64T
AND ? ? ? ? ? ? ? ? ? ?
ANDPD   ? ? ? ?
ANDPS   ? ? ? ? ?
PAND ? ? ? ? ? ? ? ? ?
Синтаксис команды:
AND <DEST>,<SRC>
Возможные варианты команды:
and reg/mem,reg(8/16/32/64)
and reg,mem(8/16/32/64)
and reg/mem,imm(8/16/32)

MMX
pand mmx,m64/mmx
SSE
andps xmm,m128/xmm
SSE2
andpd xmm,m128/xmm
pand xmm,m128/xmm
Семантика команды
: операция логического умножения над битами операнда DEST размерностью байт, слово, двойное, учетверенное слово или параграф.
Псевдокод:
https://www.cyberforum.ru/cgi-bin/latex.cgi?DEST\leftarrow DEST \wedge SRC
Алгоритм работы:
  • выполнить операцию логического умножения над битами операнда DEST, используя операнд SRC. При этом бит результата равен 1, если соответствующие биты DEST и SRC равны 1, в противном случае бит равен 0;
  • записать результат операции в операнд DEST (операнд SRC остается неизменным);
  • установить флаги.
Применение: команда AND используется для работы с операндами на уровне битов. Удобно использовать для принудительного сброса определенных битов операнда.
Assembler
1
2
3
4
and bl,11110110b ;сбросить нулевой и третий биты регистра BL
mov eax,00000a5a5h
mov edx,000000ff0h
and eax,edx
переменнаяBin Hex
https://www.cyberforum.ru/cgi-bin/latex.cgi?eax 00000000000000001010010110100101b 0A5A5h
https://www.cyberforum.ru/cgi-bin/latex.cgi?edx 00000000000000000000111111110000b 00FF0h
https://www.cyberforum.ru/cgi-bin/latex.cgi?eax=eax \wedge edx 00000000000000000000010110100000b 005A0h
Assembler
1
2
3
4
5
6
7
msk dd 00000FFFFFFFF0000h
dat dd 00000A5A50000FF11h
mov esi,offset dat ; Data pointer
mov ebx,offset msk ; Mask pointer
movq mm7,[esi] ; Get 64 bits of data
pand mm7,[ebx] ; AND it with the mask data
movq [edi],mm7 ; Save the masked data
Можно использовать эту команду для сравнения значения регистра с нулевым или ненулевым значением. Например, надо проверить, равен ли регистр EAX нулю. Для этого можно было бы применить команду cmp eax,0, но вместо этого используют and eax,eax и после этой инструкции помещают условный переход JZ или JNZ. Логическая операция AND, выполненная по отношению к одному и тому же числу, дает в результате это же число. Инструкция AND, как и любая другая математическая инструкция, устанавливает флаги, включая флаг нуля. Результат выполнения AND будет равен нулю только в том случае, если число в регистре нулевое.
Команда cmp eax,0 занимает 3/5 байт и выполняется за 4 такта синхронизации, команда and eax,eax занимает 2 байта и выполняется на 1 такт быстрее. Команду AND можно использовать вместо MOV для размещения в ячейке памяти/регистре нулевого значения. В отличие от MOV логические команды могут использовать знаковое расширение числа.
команда кодировка длина комментарий
mov eax,0 0B800000000h 5 байт Без знакового расширения
and eax,0 2500000000h 5 байт Без знакового расширения
and eax,0 83E000h 3 байта Со знаковым расширением
Команда OR
(Логическое включающее ИЛИ = logical OR)


 P PII K6 3D! 3Mx+ SSE SSE2 A64 SSE3 E64T
OR ? ? ? ? ? ? ? ? ? ?
ORPD ? ? ? ?
ORPS      ? ? ? ? ?
POR  ? ? ? ? ? ? ? ? ?
Синтаксис команды:
OR <DEST>,<SRC>
Возможные варианты команды:
or reg/mem,reg(8/16/32/64)
or reg,mem(8/16/32/64)
or reg/mem,imm(8/16/32)

MMX
por mmx,m64/mmx
SSE
orps xmm,m128/xmm
SSE2
orpd xmm,m128/xmm
por xmm,m128/xmm

Семантика команды: операция логического ИЛИ над битами операнда DEST.
Псевдокод:
https://www.cyberforum.ru/cgi-bin/latex.cgi?DEST \leftarrow DEST \vee SRC
Алгоритм работы:
  • выполнить операцию логического ИЛИ над битами операнда DEST, используя операнд SRC. При этом бит результата равен 0, если соответствующие биты операнда DEST и SRC равны 0, в противном случае бит результата равен 1;
  • записать результат операции в операнд DEST (операнд SRC остается неизменным);
  • установить флаги.
Применение: команду OR можно использовать для работы с операндами на уровне битов. Типичное использование команды – установка определенных разрядов операнда DEST в единицу.
Assembler
1
2
3
4
OR BL,00000001b ;установить нулевой бит регистра BL в 1
mov eax,00000a5a5h
mov edx,000000ff0h
or eax,edx
переменная Bin Hex
https://www.cyberforum.ru/cgi-bin/latex.cgi?eax 00000000000000001010010110100101b 0A5A5h
https://www.cyberforum.ru/cgi-bin/latex.cgi?edx 00000000000000000000111111110000b 00FF0h
https://www.cyberforum.ru/cgi-bin/latex.cgi?eax=eax\vee edx 00000000000000000000010110100000b 0AFF5h
Assembler
1
2
3
4
5
6
7
msk dd 00000ffffffff0000h
dat dd 00000a5a50000ff11h
mov esi,offset dat ; Data pointer
mov ebx,offset msk ; Mask pointer
movq mm7,[esi] ; Get 64 bits of data
por mm7,[ebx] ; OR it with the mask data
movq [edi],mm7 ; Save the masked data
Эту команду можно использовать для сравнения значения регистра с нулевым или ненулевым значением. Например, надо проверить регистр AX, чтобы выяснить равен ли он нулю. Можно было бы применить команду cmp ax,0, но используют or ax,ax и после этой команды помещают условный переход jz или jnz. Логическая операция OR, выполненная по отношению к одному и тому же числу, дает в результате это же число. Инструкция OR, как и любая другая математическая инструкция, устанавливает флаги, включая флаг нуля. Но результат выполнения OR будет равен нулю только в том случае, если число в регистре равно нулю.
Команда cmp eax,0 занимает 3/5 байта и выполняется за 4 такта синхронизации, команда or eax,eax занимает 2 байта и выполняется на 1 такт быстрее.
команда кодировка
CMP EAX,0 3D00000000
CMP EAX,0 83F800
OR EAX,EAX 0BC0
Запись or eax,8000h эквивалентна or ah,80h
Команда XOR
(Логическое исключающее ИЛИ = logical EXCLUSIVE OR)

 P PII K6 3D! 3Mx+ SSE SSE2 A64 SSE3 E64T
XOR ? ? ? ? ? ? ? ? ? ?
ORPD ? ? ? ?
XORPS ? ? ? ? ?
PXOR  ? ? ? ? ? ? ? ? ?
Синтаксис команды:
XOR <DEST>,<SRC>
Возможные варианты команды:
xor reg/mem, reg
xor reg, mem
xor reg/mem, imm

MMX
pxor mmx,m64/mmx
SSE
xorps xmm,m128/xmm
SSE2
xorpd xmm,m128/xmm
pxor xmm,m128/xmm

Семантика команды: операция логического исключающего ИЛИ над операндом DEST размерностью байт, слово или двойное слово.
Алгоритм работы:
  • выполнить операцию логического исключающего ИЛИ над битами операнда DEST, используя операнд SRC. При этом бит результата равен 1, если соответствующие биты операнда DEST и SRC различны, в остальных случаях бит результата равен 0;
  • записать результат операции в операнд DEST (операнд SRC остается неизменным);
  • установить флаги.
Псевдокод:
https://www.cyberforum.ru/cgi-bin/latex.cgi?DEST\leftarrow DEST \oplus SRC
Применение: эту операцию удобно использовать для инвертирования или сравнения определенных битов операндов. Используется для простейшего шифрования и дешифровки:
Assembler
1
2
3
4
5
;изменить значение бита 0 регистра AL на обратное
XOR AL,00000001b
mov eax,00000a5a5h
mov edx,000000ff0h
xor eax,edx
переменная Bin Hex
https://www.cyberforum.ru/cgi-bin/latex.cgi?eax00000000000000001010010110100101b 0A5A5h
https://www.cyberforum.ru/cgi-bin/latex.cgi?edx 00000000000000000000111111110000b 00FF0h
https://www.cyberforum.ru/cgi-bin/latex.cgi?eax=eax\oplus edx 00000000000000001010101001010101b 0AA55h
Операцию XOR можно создать комбинируя AND, OR и NOT.

Но наиболее часто используют эту команду для обнуления значения регистра. Результат выполнения XOR над двумя битами будет равен единице только в том случае, когда один бит установлен в ноль, а другой в единицу. Логическая операция XOR, выполненная по отношению к одному и тому же числу, даст в результате ноль. Команда mov eax,0 занимает 5 байт и выполняется за 4 такта синхронизации, а команда xor ax,ax – 2 байта и выполняется на 1 такт быстрее.
Шифрование с помощью команды XOR
Шифр простой замены. Возьмем символы «A», «B», «C» и выполним операцию XOR с символом «1». В зашифрованном тексте на месте символов «A», «B» и «C» будут стоять «p», «s» и «r» соответственно.
 01000001 код «A»
https://www.cyberforum.ru/cgi-bin/latex.cgi?\oplus 00110001 код «1»
 01110000 код «p»
.
 01000010 код «B»
https://www.cyberforum.ru/cgi-bin/latex.cgi?\oplus 00110001 код «1»
 01110011 код «s»
.
 01000011 код «C»
https://www.cyberforum.ru/cgi-bin/latex.cgi?\oplus 00110001 код «1»
  01110010 код «r»
Для дешифровки полученного таким способом текста этот текст по-символьно выполняет операцию XOR с тем же ключом, которым этот текст шифровался.
 01110000 код «p»
https://www.cyberforum.ru/cgi-bin/latex.cgi?\oplus 00110001 код «1»
 01000001 код «A»
.
 01110011 код «s»
https://www.cyberforum.ru/cgi-bin/latex.cgi?\oplus 00110001 код «1»
 01000010 код «B»
.
 01110010 код «r»
https://www.cyberforum.ru/cgi-bin/latex.cgi?\oplus 00110001 код «1»
 01000011 код «C»
Для дешифровки текста такого рода необходимо знать, на каком языке он написан. Приблизительная частота распределения букв уже давно подсчитана для всех языков мира. Допустим, вы знаете, что зашифрованный текст на русском языке. Вы подсчитываете сколько всего символов в дешифруемом тексте. Затем подсчитывается, сколько раз каждый символ встречается в шифротексте. Полученное число делится на общее количество символов в тексте. Так вы получаете частоту употребления символов в вашей шифровке. Затем заменяете символы в зашифрованном тексте на буквы с аналогичными или близкими частотами. То есть, максимально часто встречающимся символом будет скорее всего пробел, на втором месте по частоте идет буква «о», за ней «е» и так далее...
Частота распределения букв в русском языке
буква частота буква частота буква частота буква частота буква частота
а 0,062 з 0,016 о 0,090 х 0,01 ь 0,014
б 0,014 и 0,062 п 0,023 ц 0,004 э 0,003
в 0,038 й 0,010 р 0,040 ч 0,012 ю 0,006
г 0,013 к 0,028 с 0,045 ш 0,006 я 0,018
д 0,025 л 0,035 т 0,053 щ 0,003 пробел 0,174
е, ё 0,072 м 0,026 у 0,021 ъ 0,014  
ж 0,007 н 0,053 ф 0,002 ы 0,016  
Таблица 9.1.1
Определить какой ключ использовался при шифровании, если вам удалось отгадать хотя бы несколько букв можно, исходя из следующего свойства операции XOR:
X xor Key = Y
Y xor Key = X
X xor Y = Key
Например, если вы определили, что символу «A» (ASCII-код 41h) соответствует символ «p» (ASCII-код 70h), тогда «A» xor «p» = «1» (ASCII-код 31h) вернет ключ, которым текст шифровали.
  01110000код «p»
https://www.cyberforum.ru/cgi-bin/latex.cgi?\oplus 01000001 код «A»
 00110001 код «1»
Для того чтобы спрятать X xor Y от посторонних глаз, или сократить размеры программы, помните, что операция X xor Y может иметь следующие эквиваленты
(X or Y)-(X and Y)
(X and (not Y))or((not X) and Y)
(not(X or (not Y)))or(not((not X) or Y))
not((X or (not Y))and((not X) or Y))
Команда ANDN
(Логическое И-НЕ (штрих Шеффера) = logical AND-NOT)

 P PII K6 3D! 3Mx+ SSE SSE2 A64 SSE3 E64T
ANDNPD      ? ? ? ? 
ANDNPS     ? ? ? ? ? 
PANDN  ? ? ? ? ? ? ? ? ?
Возможные варианты команды:
MMX
pandn mmx,m64/mmx
SSE
andnps xmm,m128/xmm
SSE2
andnpd xmm,m128/xmm
pandn xmm,m128/xmm

Семантика команды: операция штрих Шеффера над операндом DEST размерностью байт, слово, двойное или учетверенное слово.
Алгоритм работы:
  • Выполняется инверсия битов операнда DEST (регистр MMX/XMM), а затем побитовое «логическое И» над операндом DEST и операндом SRC (регистр MMX/XMM или переменная). Результат сохраняется в операнде DEST. Каждый бит операнда DEST устанавливается в 1, только если соответствующий бит операнда SRC равен 1, а операнда DEST – 0, иначе бит операнда DEST сбрасывается в 0.
  • записать результат операции в операнд DEST (операнд SRC остается неизменным);
  • установить флаги.
Пример:
Assembler
1
2
3
mov mm0,00000A5A5h
mov mm7,000000FF0h
pandn mm0,mm7
Переменная Bin Hex
https://www.cyberforum.ru/cgi-bin/latex.cgi?mm0 00000000000000001010010110100101b 00000A5A5h
https://www.cyberforum.ru/cgi-bin/latex.cgi?\bar{mm0} 11111111111111110101101001011010b 0FFFF5A5Ah
https://www.cyberforum.ru/cgi-bin/latex.cgi?mm7 00000000000000000000111111110000b 000000FF0h
https://www.cyberforum.ru/cgi-bin/latex.cgi?mm0=mm7\vee \bar{mm0} 00000000000000001010101001010101b 000000A50h
Команда TEST
(Логическое сравнение = TEST operands)

 P PII K6 3D! 3Mx+ SSE SSE2 A64 SSE3 E64T
TEST ? ? ? ? ? ? ? ? ? ?
Синтаксис команды:
TEST <SRC1>,<SRC2>
Возможные варианты команды:
test reg,reg/mem
test mem,reg
test reg/mem,imm

Семантика команды: операция логического сравнения операнда SRC1 и SRC2 размерностью байт, слово, двойное или учетверенное слово. Аналог операции логического умножения AND, но результат умножения никуда не записывается (и поэтому команда TEST выполняется быстрее команды AND). Главное в команде – установка флагов.
Алгоритм работы:
  • выполнить операцию логического умножения над операндом SRC1 и SRC2: бит результата равен 1, если соответствующие биты операндов равны 1, в остальных случаях бит результата равен 0;
  • установить флаги.
Псевдокод:
TEMP https://www.cyberforum.ru/cgi-bin/latex.cgi?\leftarrowSRC1 AND SRC2
SF https://www.cyberforum.ru/cgi-bin/latex.cgi?\leftarrowMSB(TEMP)
IF TEMP = 0
THEN ZF https://www.cyberforum.ru/cgi-bin/latex.cgi?\leftarrow1
ELSE ZF https://www.cyberforum.ru/cgi-bin/latex.cgi?\leftarrow0
ENDIF;
PFhttps://www.cyberforum.ru/cgi-bin/latex.cgi?\leftarrowBitwiseXNOR(TEMP[0:7])
CFhttps://www.cyberforum.ru/cgi-bin/latex.cgi?\leftarrow0
OFhttps://www.cyberforum.ru/cgi-bin/latex.cgi?\leftarrow0; флаг AF имеет неопределенное значение
Применение: эту команду удобно использовать для получения информации о том, являются ли заданные биты операнда SRC1 нулевыми. Для анализа результата используется флаг ZF, который равен 1, если результат логического умножения равен нулю:
Пример:
Assembler
1
2
3
mov bh,1100b
test bh,0011b ; bh=1100b ZF=1
test bh,1100b ; bh=1100b ZF=0
Наиболее часто используется, чтобы узнать равен ли EAX нулю test eax,eax/jz a1
[CENTER]
команда эквивалент
test eax,ebxpush eax
 and eax,ebx
 pop eax

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

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

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

Изображения
      
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
14.11.2013, 07:16
Ответы с готовыми решениями:

Электронный пропуск
Уважаемый пользователи форума, может кто может помочь? Необходимо разработать драйвер для...

Ищу электронный справочник по ассемблеру
Как то давно скачивал в виде экзешника под дос, справочник по ассемблеру. Сейчас у себя не могу...

Порекомендуйте какой-нибудь учебник для FASM
Здравствуйте. Хочу освоить FASM. Облазил весь интернет в поисках документации для начинающих, но...

51
Закрытая тема Создать тему
Новые блоги и статьи
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть не большие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение 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, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru