Как проверить программу на ассемблере

Команда TEST вычисляет поразрядное логическое «И» своих двух операндов. Каждый бит результата равен 1, если соответствующие биты операндов равны 1, иначе каждый бит равен 0. Результат нигде не запоминается, только соответствующим образом выставляются флаги SF, ZF и PF.

Операция:

TEMP = LeftSRC AND RightSRC; (* Флаги SF, ZF, PF устанавливаются в соответствии с TEMP *)

Особые ситуации защищенного режима:

#GP(0), если используется некорректный эффективный адрес операнда в памяти в сегментах CS, DS, ES, FS, GS или нулевой селектор.
#SS(0) при использовании некорректного эффективного адреса в сегменте SS.
#PF(Код ошибки) при страничной ошибке.
#AC(0) при невыровненной ссылке в память при текущем уровне привилегий равном 3.

Особые ситуации режима реальной адресации:

#GP, если любая часть операнда находится вне пространства эффективных адресов в сегментах CS, DS, ES, FS или GS.
#SS, если любая часть операнда находится вне пространства эффективных адресов в сегменте SS.

АССЕМБЛЕР в 2023? Что такое «Reverse Engineering» и «Cyber Security». Показываю как ломают софт.

Особые ситуации режима V86:

Такие же, как и в режиме реальной адресации.
#PF(Код ошибки) при страничной ошибке.
#AC(0) при невыровненной ссылке в память.

Источник: www.club155.ru

Команда TEST

В Контакте Ютуб Почта

Команда TEST выполняет логическое И между всеми битами двух операндов. Результат никуда не записывается, команда влияет только на флаги (то есть первый операнд не изменяется). Синтаксис:

TEST ЧИСЛО1, ЧИСЛО2

В зависимости от результата могут быть изменены флаги ZF, SF, PF. Инструкция TEST всегда сбрасывает флаги OF и CF.

ЧИСЛО1 может быть одним из следующих:

  • Область памяти (MEM)
  • Регистр общего назначения (REG)

ЧИСЛО2 может быть одним из следующих:

  • Область памяти (MEM)
  • Регистр общего назначения (REG)
  • Непосредственное значение (IMM)

С учётом ограничений, которые были описаны выше, комбинации ЧИСЛО1-ЧИСЛО2 могут быть следующими:

REG, MEM MEM, REG REG, REG MEM, IMM REG, IMM

Читайте также:
Как из двух песен сделать одну программа на телефоне

Таблица истинности для логического И приведена здесь.

Как можно догадаться, команды AND и TEST по сути выполняют одну и ту же операцию — операцию логического И.

Но зачем тогда нужны две команды и когда лучше использовать AND, а когда — TEST?

Отличия, разумеется, есть. Об одном уже было сказано: команда AND записывает результат операции логического И в первый операнд, а команда TEST никуда не записывает результат, а только изменяет флаги (в зависимости от результата).

Если команда AND наиболее часто используется для сброса определённых битов числа, то команда TEST обычно используется для проверки битов и совместно с командами условного перехода.

Ассемблер ДЛЯ НОВИЧКОВ: асм и дизасм

Кроме того, с помощью инструкции TEST можно определить состояние сразу нескольких битов числа.

Допустим, мы хотим узнать, сброшены ли нулевой и третий биты числа в регистре AL. Тогда можно использовать такую команду с битовой маской, где установлены 3-й и 0-й биты:

TEST AL, 00001001b

А теперь несколько примеров, которые показывают, как работает этот код.

0 0 1 0 0 1 0 1 — Исходное значение 0 0 0 0 1 0 0 1 — Битовая маска 0 0 0 0 0 0 0 1 — Результат: ZF = 0 0 0 1 0 1 0 0 0 — Исходное значение 0 0 0 0 1 0 0 1 — Битовая маска 0 0 0 0 1 0 0 0 — Результат: ZF = 0 0 0 1 0 0 1 0 0 — Исходное значение 0 0 0 0 1 0 0 1 — Битовая маска 0 0 0 0 0 0 0 0 — Результат: ZF = 1

То есть флаг нуля ZF будет установлен только в том случае, если оба бита (0-й и 3-й) сброшены.

Пример программы: .model tiny .code ORG 100h start: MOV AX, 5 TEST AX, 1 ;Проверка числа на чётность JNZ Odd ;нечетное, переход на метку Odd JZ Even ;четное, переход на метку Even Odd: ;Если число в АХ нечетное ADD AX, 1 ;AX = AX + 1 JMP EndProg Even: ;Если число в АХ чётное ADD AX, 2 ;AX = AX + 2 EndProg: END start

Здесь мы проверяем, является ли число в регистре АХ чётным или нечётным. И в зависимости от результата переходим к той или иной метке.

Инструкции JNZ и JZ изучим как-нибудь в другой раз. Но если коротко, то JZ выполняет переход, если результат равен нулю, а JNZ выполняет переход, если результат НЕ равен нулю.

Читайте также:
Функции программы the bat

Источник: av-assembler.ru

Логические операции в Assembler

Логические операции в Assembler

Здравствуйте, уважаемые читатели. Сегодня мы поговорим об основных логических операциях в Assembler, и по традиции, разберем практический пример.

Простые логические операторы

Логическое побитовое И

В Assembler этот оператор сравнивает два регистра по одному биту. Он обозначается как and, и вот пример синтаксиса:
;пример логического И в Assembler
mov bx, 01101001b
mov bl, 01000111b
and bx, bl

Очевидно, что результатом этой операции будет 01000001, но возникает один вопрос: куда записывается результат выполнения оператора?

Так вот, результат записывается в регистр, который стоит первым после оператора and, в нашем случае — это регистр bx, то есть теперь его значение поменялось на 01000001.

Логическая инструкция test

Во многих случаях нам бы не хотелось, чтобы число переписывалось и теряло своего первоначального значения. Именно для этого предусмотрели логическую инструкцию test. Она как и and производит побитовое умножение, но не записывает результат в какой либо регистр, а всего лишь поднимает флаги для каждого бита, то есть она имитирует выполнение инструкции and. И для лучшего восприятия мы рассмотрим пример на проверку четности числа с помощью логических операций в Assembler:

.386 .model flat,stdcall option casemap:none include ..INCLUDEkernel32.inc include ..INCLUDEuser32.inc includelib ..LIBkernel32.lib includelib ..LIBuser32.lib .data yes db «Chetnoe» no db «Ne chetnoe» stdout dd ? cWritten dd ? .code start: invoke GetStdHandle, -11 ; дескриптор вывода mov stdout,eax ; по умолчанию помещается в eax mov ah, 23 test ah, 00000001b ; сравниваем последний бит числа jz evn invoke WriteConsoleA, stdout, ADDR no, sizeof no, ADDR cWritten, 0 jmp exit evn: invoke WriteConsoleA, stdout, ADDR yes, sizeof yes, ADDR cWritten, 0 exit: invoke ExitProcess,0 end start

Число, которое мы проверяем на четность, помещаем в регистр ah, затем сравниваем последний бит числа с единицей, и если вернется единица, то число нечетное, а если ноль — четное, что соответственно выводится на экран. Напомню, что команда jz отвечает за условный переход на метку (метка evn), а команда jmp — за безусловный переход.

Читайте также:
Какая программа читает sig на телефоне

Логическое побитовое ИЛИ

В Assembler логическое побитовое ИЛИ обозначается or, и синтаксис идентичен синтаксису команды and, по своей сути представляет побитовое сложение.
;пример логического ИЛИ в Assembler
mov bx, 01101001b
mov bl, 01000111b
or bx, bl

Выполнение этой инструкции вернет 01101111 и поместит это двоичное число в регистр bx.

Логическое исключающее ИЛИ

Также помимо логического ИЛИ, часто используют исключающее ИЛИ в Assembler. Оно обозначается командой xor и выделяет различия в регистрах, то есть, если в одном бите содержится 1, а в другом 0, то xor вернет 1, если же в битах содержатся одинаковые значения, то xor вернет 0.

Разберем на примере, за основу возьмем предыдущий пример проверки на четность:

.386 .model flat,stdcall option casemap:none include ..INCLUDEkernel32.inc include ..INCLUDEuser32.inc includelib ..LIBkernel32.lib includelib ..LIBuser32.lib .data yes db «Chetnoe» no db «Ne chetnoe» stdout dd ? cWritten dd ? .code start: invoke GetStdHandle, -11 ; дескриптор вывода mov stdout,eax ; по умолчанию помещается в eax xor ah, ah ; обнуление регистра ah xor al, al or ah, 21 ; помещаем в регистр число 21 or al, 20 xor ah, al xor al, ah xor ah, al ; конструкция для смены значений регистров test ah, 00000001b jz evn invoke WriteConsoleA, stdout, ADDR no, sizeof no, ADDR cWritten, 0 jmp exit evn: invoke WriteConsoleA, stdout, ADDR yes, sizeof yes, ADDR cWritten, 0 exit: invoke ExitProcess,0 end start

Конструкция из 3 xor позволяет поменять значения в регистрах, и по окончании в регистре ah будет содержаться число 20. Затем выведется сообщение о том, что число четное.

Также отметим конструкцию xor ah, ah — она позволяет обнулить регистр. По сути это аналог команды mov ah, 0 , но программисты любят использовать именно эту конструкцию, так как она занимает всего 2 байта, а команда mov — 5 байт.

В этой статье мы поговорили и разобрали основные моменты работы с логическими инструкциями и операциями в Assembler, не забывайте скачивать и просматривать исходники, а также оставляйте ваши комментарии.

Поделиться ссылкой:

Источник: codetown.ru

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru