Ассемблер логические операции: Лекция 8. Логические команды языка Ассемблер.

Содержание

Assembler: Logic. Всем доброго времени суток! Naize в… | by ITRoot Corp

What is Logic at Assembler?

Вот список логических побитовых команд:

  • AND — Побитовое логическое умножение. Используют для выделения части битов.1100 AND 1010 = 1000
  • OR — Побитовое логическое сложение. Используют вместо команд сравнения
  • XOR — Побитовое сложение по модулю два. Используют для обнуления.
  • TEST — Выполняется логическое умножение, но приемник не меняется. Меняются только флаги.
  • NOT — Инвертирует каждый бит

Побитовые они оттого, что сравнивают каждый байт двоичного числа по-отдельности. За исключением NOT, эта команда нечего не с чем не сравнивает.

Хорошо, в общем виде вы теперь знаете, что к чему. Пора поговорить про все логические операции подробнее, и попутно дать несколько примеров для полного понимания темы.

Логическое И (AND)

В Assembler этот оператор сравнивает два регистра по одному биту. Он обозначается как AND, и вот пример работы:

Во всех примерах, что я сегодня буду показывать, постараюсь “отстраниться” от самого синтаксиса асма, и сфокусироваться на самой работе команд. Поэтому так как показывается в примерах, непосредственно в языке сделать не получиться.

01101001 AND 01000111

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

Возникает один вопрос: куда же будет помещён результат выполнения оператора? Так вот, результат записывается в регистр, который стоит первым после and. Например:

AND eax, ebx

Результат будет помещён в регистр eax.

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

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

Она как и AND производит побитовое умножение, но не записывает результат в какой либо регистр, а всего лишь поднимает флаги для каждого бита, то есть она, как бы так сказать, имитирует выполнение and.

Логическое ИЛИ (OR)

В Assembler логическое побитовое ИЛИ обозначается как OR, и синтаксис идентичен синтаксису команды and, по своей сути представляет побитовое сложение. Давайте посмотрим на простой пример:

01101001 OR 01000111

Результатом этой операции будет 01101111, и, как и в случае с AND, OR поместит это двоичное число в регистр, который стоит первым после самой команды. Вот более удобная запись, кстати:

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

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

Конструкция из 3 xor позволяет поменять местами значения в регистрах.

XOR ax, bx

XOR bx, ax

XOR ax, bx

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

Также отметим конструкцию XOR eax, eax — она позволяет обнулить регистр (естественно, вместо eax может быть любой другой регистр). По сути это аналог команды MOV eax, 0, но многие из тех, то работает с асмом, любят использовать именно эту конструкцию… Потому что она быстрее и тратит меньше памяти.

Давайте посмотрим на простой пример:

00101110 XOR 10011100

В данном примере, после выполнения XOR получится 10110010, думаю суть всего этого вы уже уловили))

Результат этой команды, как и в случае с предыдущими, помещается в тот регистр, который идёт первым.

Логическое НЕ (NOT)

Данная мнемоника инвертирует все биты числа, она единственная из сегодняшнего списка, не сравнивает что то с чем то. И в качестве “аргументов” она принимает только один регистр, в который и помещается в итоге результат ей выполнения:

NOT edx

Так, давайте ка глянем пример:

NOT 01010011

Понятно, что результатом данной операции будет 10101100. В след за предыдущими, пример в более читаемом виде:

Ассемблер. Логические инструкции / Ravesli

  Обновл. 16 Сен 2021  | 

Набор команд процессора содержит логические инструкции AND, OR, XOR, TEST и NOT, которые проверяют, устанавливают и очищают биты в соответствии с потребностями программы.

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

Синтаксис использования логических инструкций следующий:

   AND операнд1, операнд2

   OR операнд1, операнд2

   XOR операнд1, операнд2

   TEST операнд1, операнд2

   NOT операнд1

Во всех случаях первый операнд находится либо в регистре, либо в памяти. Второй операнд может находиться либо в регистре/памяти, либо являться константой. Тем не менее, операции типа «память-в-память» невозможны.

Инструкция AND

Инструкция AND выполняет побитовую операцию И. Побитовая операция И возвращает 1, если совпадающие биты обоих операндов равны 1, в противном случае — возвращается 0. Например:

Операнд №1: 0101
Операнд №2: 0011
--
После применения AND -> Операнд №1: 0001

Операция AND может быть использована для сброса одного или нескольких бит. Например, допустим, что регистр BL содержит 0011 1010. Если вам необходимо сбросить старшие биты в ноль, то вы выполняете операцию AND между этим регистром и числом 0FH:

AND BL, 0FH ; эта строка устанавливает для регистра BL значение 0000 1010

AND BL, 0FH   ; эта строка устанавливает для регистра BL значение 0000 1010

Давайте рассмотрим другой пример. Если вы хотите проверить, является ли определенное число чётным или нечётным, то с помощью простого теста вы сможете проверить младший значимый бит числа. Если им окажется 1, то число нечётное, если же 0 — число чётное.

Например, если число находится в регистре AL, то мы можем написать следующее:

AND AL, 01H ; выполняем операцию AND с 0000 0001
JZ EVEN_NUMBER

AND AL, 01H     ; выполняем операцию AND с 0000 0001

JZ    EVEN_NUMBER

Следующая программа это проиллюстрирует:

Live Demo
section .text
global _start ; должно быть объявлено для использования gcc

_start: ; сообщаем линкеру входную точку
mov ax, 8h ; записываем 8 в регистр AX
and ax, 1 ; выполняем операцию AND с AX
jz evnn
mov eax, 4 ; номер системного вызова (sys_write)
mov ebx, 1 ; файловый дескриптор (stdout)
mov ecx, odd_msg ; сообщение для вывода на экран
mov edx, len2 ; длина сообщения
int 0x80 ; вызов ядра
jmp outprog

evnn:

mov ah, 09h
mov eax, 4 ; номер системного вызова (sys_write)
mov ebx, 1 ; файловый дескриптор (stdout)
mov ecx, even_msg ; сообщение для вывода на экран
mov edx, len1 ; длина сообщения
int 0x80 ; вызов ядра

outprog:

mov eax,1 ; номер системного вызова (sys_exit)
int 0x80 ; вызов ядра

section .data
even_msg db ‘Even Number!’ ; сообщение с чётным числом
len1 equ $ — even_msg

odd_msg db ‘Odd Number!’ ; сообщение с нечётным числом
len2 equ $ — odd_msg

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

Live Demo

section .text

   global _start            ; должно быть объявлено для использования gcc

_start:                     ; сообщаем линкеру входную точку

   mov   ax,   8h           ; записываем 8 в регистр AX

   and   ax, 1              ; выполняем операцию AND с AX

   jz    evnn

   mov   eax, 4             ; номер системного вызова (sys_write)

   mov   ebx, 1             ; файловый дескриптор (stdout)

   mov   ecx, odd_msg       ; сообщение для вывода на экран

   mov   edx, len2          ; длина сообщения

   int   0x80               ; вызов ядра

   jmp   outprog

 

evnn:  

  

   mov   ah,  09h

   mov   eax, 4             ; номер системного вызова (sys_write)

   mov   ebx, 1             ; файловый дескриптор (stdout)

   mov   ecx, even_msg      ; сообщение для вывода на экран

   mov   edx, len1          ; длина сообщения

   int   0x80               ; вызов ядра

 

outprog:

 

   mov   eax,1              ; номер системного вызова (sys_exit)

   int   0x80               ; вызов ядра

 

section   .data

even_msg  db  ‘Even Number!’ ; сообщение с чётным числом

len1  equ  $ — even_msg

  

odd_msg db  ‘Odd Number!’    ; сообщение с нечётным числом

len2  equ  $ — odd_msg

Результат выполнения программы:

Even Number!

Изменяем значение в регистре AX, указав нечётную цифру:

mov ax, 9h ; записываем 9 в регистр AX

mov  ax, 9h    ; записываем 9 в регистр AX

И результат:

Odd Number!

Вы можете точно так же очистить весь регистр, используя AND с 00H.

Инструкция OR

Инструкция OR выполняет побитовую операцию ИЛИ. Побитовый оператор ИЛИ возвращает 1, если совпадающие биты одного или обоих операндов равны 1, и возвращает 0, если оба бита равны нулю. Например:

Операнд №1: 0101
Операнд №2: 0011
--
После применения OR -> Операнд №1: 0111

Операция OR может быть использована для указания одного или нескольких бит. Например, допустим, что регистр AL содержит 0011 1010, и нам необходимо установить четыре младших бита. Мы можем сделать это, используя оператор OR со значением 0000 1111 (т.е. с регистром FH):

OR BL, 0FH ; эта строка устанавливает для BL значение 0011 1111

OR BL, 0FH                   ; эта строка устанавливает для BL значение 0011 1111

В качестве другого примера давайте сохраним значения 5 и 3 в регистрах AL и BL соответственно. Таким образом, следующая инструкция:

Должна сохранить 7 в регистре AL:

section .text
global _start ; должно быть объявлено для использования gcc

_start: ; сообщаем линкеру входную точку
mov al, 5 ; записываем 5 в регистр AL
mov bl, 3 ; записываем 3 в регистр BL
or al, bl ; выполняем операцию OR с регистрами AL и BL, результатом должно быть число 7
add al, byte ‘0’ ; выполняем конвертацию из десятичной системы в ASCII

mov [result], al
mov eax, 4
mov ebx, 1
mov ecx, result
mov edx, 1
int 0x80

outprog:
mov eax,1 ; номер системного вызова (sys_exit)
int 0x80 ; вызов ядра

section .bss
result resb 1

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

section .text

   global _start            ; должно быть объявлено для использования gcc

_start:                     ; сообщаем линкеру входную точку

   mov    al, 5             ; записываем 5 в регистр AL

   mov    bl, 3             ; записываем 3 в регистр BL

   or     al, bl            ; выполняем операцию OR с регистрами AL и BL, результатом должно быть число 7

   add    al, byte ‘0’      ; выполняем конвертацию из десятичной системы в ASCII

   mov    [result],  al

   mov    eax, 4

   mov    ebx, 1

   mov    ecx, result

   mov    edx, 1

   int    0x80

    

outprog:

   mov    eax,1             ; номер системного вызова (sys_exit)

   int    0x80              ; вызов ядра

section    .bss

result resb 1

Результат выполнения программы:

7

Инструкция XOR

Инструкция XOR выполняет побитовую операцию XOR. Побитовая операция XOR возвращает 1, если биты операндов являются различными, если же они являются одинаковыми (оба равны 0 или 1), то возвращается 0. Например:

Операнд №1: 0101
Операнд №2: 0011
--
После применения XOR -> Операнд №1: 0110

Следующая инструкция очищает регистр (сбрасывает все биты в 0):

Инструкция TEST

Инструкция TEST работает так же, как и инструкция AND, но, в отличие от инструкции AND, она не изменяет первый операнд. Таким образом, если нам нужно проверить, является ли число в регистре чётным или нечётным, мы можем сделать это, используя инструкцию TEST, без необходимости изменять исходное число:

TEST AL, 01H
JZ EVEN_NUMBER

TEST    AL, 01H

JZ      EVEN_NUMBER

Инструкция NOT

Инструкция NOT выполняет побитовую операцию НЕ. Побитовая операция НЕ изменяет биты операнда на противоположные. Операнд может находиться либо в регистре, либо в памяти. Например:

Операнд №1: 0101 0011
--
После применения NOT -> Операнд №1: 1010 1100

Оценить статью:

Загрузка…

Поделиться в социальных сетях:

Логическое ИЛИ







ТВ онлайн: более 100 каналов в HD-качестве

1) Большинство каналов бесплатные. 2) Можно смотреть как на сайте, так и в приложениях для iOS, Android и Smart TV. 3) Множество телесериалов и фильмов бесплатно или за 1 рубль. 4) Несколько платных подписок, в том числе 18+ и телеканал «Дождь». 5) А также записи телепередач, новости, ТВ-шоу и др.
Подробнее…




Операция логического ИЛИ в Ассемблере выполняется с помощью команды OR. Эта команда выполняет логическое ИЛИ между всеми битами двух операндов. Результат записывается в первый операнд. Синтаксис:


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


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


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

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


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

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


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


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


Когда мы изучали команду AND, то мы узнали,
что с её помощью можно преобразовать маленькую букву в большую, используя
битовую маску.


Инструкция OR поступает наоборот — она может преобразовать большую букву в маленькую:


MOV AL, 'A'        ; AL = 01000001b
AND AL, 00100000b  ; AL = 01100001b  ('a')


Размер обоих операндов должен быть одинаковым: 8, 16 или 32 разряда.


Команда OR обычно используется для установки в единицу отдельных битов
двоичного числа (например,
флагов состояния процессора) по заданной маске.


Если бит маски равен нулю, то значение соответствующего бита числа не изменяется, а если равен 1, то устанавливается в 1.


Ниже показано, как можно установить четыре младших бита числа:


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


В результате четыре младших бита будут установлены в любом случае, независимо от того, какое состояние у них было в исходном значении (выделены красным цветом). Старшие четыре бита не изменятся, то есть будут такими же, как у исходного значения.


Ещё одно применение инструкции OR — это преобразование двоичной цифры от 0 до 9 в значение, которое соответствует ASCII-коду символа, обозначающему эту цифру. Для этого нужно установить в единицу биты 4 и 5.


Пример:


0 0 0 0 0 1 0 1     - Исходное значение: число 5
0 0 1 1 0 0 0 0     - Битовая маска (биты 4 и 5 установлены)
0 0 1 1 0 1 0 1     - Результат: 35h - ASCII-код символа 5


Пример программы:


.model	tiny
.code
ORG 	100h
	
start:	

MOV AX, 0B800h    ;установить AX = B800h (память VGA).
MOV DS, AX        ;копировать значение из AX в DS.
MOV CL, 'A'       ;CL = 41h (ASCII-код символа 'A').
MOV CH, 01001110b ;CH = атрибуты цвета (желтый текст на красном фоне).
MOV BX, 72eh      ;BX = позиция на экране = 2*(x + y*80) = (39, 11).
MOV [BX], CX      ;[0B800h:015Eh] = CX (записать символ в видеопамять).
OR  CL, 00100000b ;Теперь CL = 61h (ASCII-код символа 'a').
MOV BX, 730h      ;BX = позиция на экране = 2*(x + y*80) = (40, 11).
MOV [BX], CX      ;[0B800h:015Eh] = CX (записать символ в видеопамять).
	
MOV CL, 5         ;Записать число в регистр CL
OR  CL, 00110000b ;Преобразовать в ASCII-код
MOV AX, 0B800h    ;установить AX = B800h (память VGA).
MOV DS, AX        ;копировать значение из AX в DS.
MOV CH, 01001110b ;CH = атрибуты цвета (желтый текст на красном фоне).
MOV BX, 732h      ;BX = позиция на экране = 2*(x + y*80) = (41, 11).
MOV [BX], CX      ;[0B800h:015Eh] = CX (записать символ в видеопамять).

END	start


Таблица истинности логического ИЛИ


Как было сказано, команда OR выполняет операцию логического сложения (логического ИЛИ) между всеми битами двух чисел. Таблица истинности для операции логического сложения выглядит следующим образом:


0	 И	 0	 =	 0
0	 И	 1	 = 	 1
1	 И	 0	 =	 1
1	 И	 1	 =	 1


Логическое ИЛИ — это операция логического сложения. Чтобы легче было запомнить таблицу истинности для логического ИЛИ, вспомните математику:


0 + 0 = 0
0 + 1 = 1
1 + 0 = 1
1 + 1 = 1


Последний случай вас, возможно, смутит. Но на самом деле всё в порядке ))) Просто по правилам булевой алгебры при логическом сложении результат равен нулю, если все операнды равны нулю. Во всех остальных случаях результат равен 1.





Первые шаги в программирование

Главный вопрос начинающего программиста – с чего начать? Вроде бы есть желание, но иногда «не знаешь, как начать думать, чтобы до такого додуматься».
У человека, который никогда не имел дело с информационными технологиями, даже простые вопросы могут вызвать большие трудности и отнять много времени на решение.
Подробнее…


Assembler: 29. Команды побитовой обработки. Типы операндов. Логические операции. Команды доступа у отдельным битам.

Команды побитовой обработки:

  • Позволяют анализировать или изменить часть операнда
  • Выполняются быстрее
  • Имеют 1-3 операнда
  • Операндом может быть: имя регистра, адрес ячейки оперативной памяти, непосредственный операнд
  • Операнды имеют размер: байт, слово, двойное слово
  • По назначению делятся на: логические, доступа к отдельным битам и команды сдвига

Логические операции
Все команды, кроме NOT, изменяют флаги zf, cf, of, pf, sf
AND — Побитовое логическое умножение. Используют для выделения части битов.
1100 AND 1010 = 1000

OR — Побитовое логическое сложение. Используют вместо команд сравнения
1100 OR 1010 = 1110
or ax, ax => cmp ax, 0

XOR — Побитовое сложение по модулю два. Используют для обнуления.
1100 XOR 1010 = 0110
1010 XOR 1010 = 0000

TEST — Выполняется логическое умножение, но приемник не меняется. Меняются только флаги.

NOT — Инвертирует каждый бит
NOT 1010 = 0101

Команды доступа к отдельным битам
Все эти команды изменяют cf
BT (BitTest) операнд, смещение бита. Переносит содержимое бита в cf
BTS (BitTest & Set) операнд, смещение бита. Переносит в cf и устанавливает бит в 1
BTR (BitTest & Reset) операнд, смещение бита. Переносит в cf и устанавливает бит в 0
BTC (BitTest & Convert) операнд, смещение бита. Переносит в cf и инвертирует бит.
BSF (Bit Scanning Forward) операнд_1, операнд_2. Просматривает биты операнда_2 от младшего к старшему в поисках бита, установленного в единицу. Если такой бит будет найден, то в операнд_1 заносится номер этого бита (смещение).Если все биты операнда_2 равны 0, то флаг zf=0.
BSR (Bit Scanning Reverse) операнд_1, операнд_2. То же, что и BSF, но в обратном порядке просматривает.

Арифметические и логические команды

Большинство арифметических и логических команд влияют на регистр состояния процессора
(или Флаги)

Как вы можете видеть, в этом регистре 16 бит. Каждый бит называется флагом
и может принимать значение 1 или 0.

  • Carry Flag (CF) — перенос — этот флаг устанавливается в 1,
    когдаслучается беззнаковое переполнение. Например, если вы
    увеличили байт 255 + 1 (результат не помещается в диапазоне 0…255).
    Если переполнение не происходит, этот флаг установлен в 0.

  • Zero Flag (ZF) — ноль — устанавливается в 1, если
    результат равен нулю. Если результат не нулевой, то этот флаг
    устанавливается в 0.

  • Sign Flag (SF) — знак — установлен в 1, если
    результат — отрицательное число. Если результат положительный,
    то этот флаг устанавливается в 0. Обычно этот флаг принимает
    значение старшего значащего бита.

  • Overflow Flag (OF) — переполнение — устанавливается в 1,
    если случается переполнение при арифметических операциях со знаком.
    Например, если вы увеличили байт 100 + 50 (результат не помещается в диапазоне -128…127).

  • Parity Flag (PF) — контроль четности — этот флаг устанавливается в 1, если
    в младших 8-битовых данных четное число. Если число нечетное, то этот бит установлен в 0.
    Даже если результат — это слово, то анализируются только 8 младших бит!

  • Auxiliary Flag (AF) — внешний перенос — установлен в 1,
    если случилось переполнение без знака младших 4-х битов (т.е. перенос из 3-го бита).

  • Interrupt enable Flag (IF) — прерывание — если этот флаг установлен в 1, то
    процессор реагирует на прерывание от внешних устройств.

  • Direction Flag (DF) — направление — этот флаг используется
    некоторыми командами для обработки цепочки данных. Если флаг установлен
    в 0 — обработка происходит в прямом направлении, если 1
    в обратном.


Имеются три группы команд.


Первая группа: ADD, SUB,CMP, AND, TEST,
OR, XOR

Эти типы операндов поддерживаются:

REG, memory
memory, REG
REG, REG
memory, immediate
REG, immediate

REG: AX, BX, CX, DX, AH, AL, BL, BH, CH, CL, DH, DL, DI, SI, BP, SP.

memory: [BX], [BX+SI+7], переменная, и т.п…

immediate: 5, -24, 3Fh, 10001101b, и т.п…

После операции между операндами результат всегда записывается в первый операнд.
Команды CMP и TEST воздействуют только на флаги и не
записывают результат (эта команда используется для принятия решения во
время выполнения программы).

Эти команды влияют только на флаги:
       CF, ZF,

SF, OF, PF, AF.

  • ADD — Прибавить второй операнд к первому.
  • SUB — Вычесть второй операнд из первого.
  • CMP — Вычесть второй операнд из первого только для флагов.
  • AND — Логическое И между всеми битами двух операндов. При этом соблюдаются правила:

    1 AND 1 = 1
    1 AND 0 = 0
    0 AND 1 = 0
    0 AND 0 = 0

    Как видите, мы получаем 1 только в том случае,
    если оба бита равны 1.

  • TEST — То же самое, что AND, но только для флагов.
  • OR — Логическое ИЛИ между всеми битами двух операндов. При этом соблюдаются правила:

    1 OR 1 = 1
    1 OR 0 = 1
    0 OR 1 = 1
    0 OR 0 = 0

    Как видите, мы получаем 1 каждый раз, когда
    хотя бы один бит равен 1.

  • XOR — Логическое XOR (исключающее ИЛИ) между всеми битами двух операндов. При этом соблюдаются правила:

    1 XOR 1 = 0
    1 XOR 0 = 1
    0 XOR 1 = 1
    0 XOR 0 = 0

    Как видите, мы получаем 1 каждый раз, когда
    биты имеют различное значение.


Вторая группа: MUL, IMUL, DIV, IDIV

Эти типы операндов поддерживаются:

REG
memory

REG: AX, BX, CX, DX, AH, AL, BL, BH, CH, CL, DH, DL, DI, SI, BP, SP.

memory: [BX], [BX+SI+7], переменная, и т.п…

Команды MUL и IMUL влияют только на эти флаги:
       CF, OF
Если результат превышает размер операнда, то эти флаги установлены в 1,
если результат умещается в размер операнда, то эти флаги установлены в 0.

Для команд DIV и IDIV флаги не определены.

  • MUL — беззнаковое умножение:

    если операнд — это байт:
    AX = AL * операнд.

    если операнд — это слово:
    (DX AX) = AX * операнд.

  • IMUL — умножение со знаком:

    если операнд — это байт:
    AX = AL * операнд.

    если операнд — это слово:
    (DX AX) = AX * операнд.

  • DIV — беззнаковое деление:

    если операнд — это байт:
    AL = AX / операнд
    AH = остаток (модуль).
    .

    если операнд — это слово:
    AX = (DX AX) / операнд
    DX = остаток (модуль).
    .

  • IDIV — деление со знаком:

    если операнд — это байт:
    AL = AX / операнд
    AH = остаток (модуль).
    .

    если операнд — это слово:
    AX = (DX AX) / операнд
    DX = остаток (модуль).
    .


Третья группа: INC, DEC, NOT, NEG

Эти типы операндов поддерживаются:

REG
memory

REG: AX, BX, CX, DX, AH, AL, BL, BH, CH, CL, DH, DL, DI, SI, BP, SP.

memory: [BX], [BX+SI+7], переменная, и т.п…

Команды INC и DEC влияют только на эти флаги:
       ZF, SF, OF, PF, AF.

Команда NOT не влияет ни на какие флаги!

Команда NEG влияет только на эти флаги:
       CF, ZF, SF, OF, PF, AF.

  • NOT — инвертирование каждого бита операнда.
  • NEG — Меняет знак операнда (дополнение до двух).
    Обычно она инвертирует каждый бит операнда, а затем
    прибавляет к нему единицу. Например, 5 преобразуется в -5,
    а -2 преобразуется в 2.


<<< Предыдущая часть <<<
    
>>> Следующая часть >>>


Логические команды Логические операции

Самые
распространённые варианты значений,
которые может принимать один бит, –
это значения «правда» (True)
и «ложь» (False),
используемые в логике, откуда происхо­дят
так называемые «логические
операции
»
над битами. Так, если объединить «правду»
и «правду» – получится «правда», а если
объединить «правду» и «ложь» – «правды»
не получится. В ассемблере нам встретятся
четыре основные опера­ции – И (AND),
ИЛИ (OR), «исключающее ИЛИ» (XOR) и отрицание
(NOT), действие которых приводится в табл.
1.

Таблица
1
.
Логические операции

И

лог. умножение

ИЛИ

лог. сложение

Исключающее
ИЛИ

сумма по модулю
2 или

нетождеств.

Отрицание

0 AND 0 = 0

0 OR 0 = 0

0 XOR 0 = 0

NOT 0 = 1

0 AND 1 = 0

0
OR
1
= 1

0 XOR 1 = 1

NOT 1 = 0

1 AND 0 = 0

1 OR 0 = 1

1 XOR 0 = 1

1 AND 1 = 1

1 OR 1 = 1

1 XOR 1 = 0

Все перечисленные
операции являются побитовыми, поэтому
для выполнения логического действия
над числом надо перевести его в двоичный
формат и про­извести операцию над
каждым битом, например:

96h OR
0Fh = 10010110b

OR
01000000b =

11010110b
= D6h

Логические команды

Команда:

AND
приёмник,
источник

Назначение:

Логическое
И

Процессор:

8086

от
англ.
“AND”
и

Команда
выполняет побитовое «логическое И»
над приёмником
(регистр или переменная) и источником
(число, регистр или переменная) и помещает
результат в приёмник.
Источник и приёмник не могут быть
переменными одновременно. Любой бит
результата равен 1, только если
соответствующие биты обоих операндов
были равны 1, и равен 0 в остальных
случаях. Наиболее часто AND применяют
для выборочного обнуления отдельных
бит, например, команда

and
al,00001111b

обнулит
старшие четыре бита регистра AL, сохранив
неизменными четыре младших.

Флаги
OF и CF обнуляются, SF, ZF и PF устанавливаются
в соответствии с результатом, AF не
определён.

Команда:

OR
приёмник,
источник

Назначение:

Логическое
ИЛИ

Процессор:

8086

от
англ.
“OR”
или

Выполняет
побитовое «логическое ИЛИ» над приёмником
(регистр или переменная) и источником
(число, регистр или переменная) и помещает
результат в приёмник.
Источник и приёмник не могут быть
переменными одновременно. Любой бит
результата равен 0, только если
соответствующие биты обоих операндов
были равны 0, и равен 1 в остальных
случаях. Команду OR чаще всего используют
для выборочной установки в “1” отдельных
бит, например, команда

or
al,00001111b

приведёт
к тому, что младшие четыре бита регистра
AL будут установлены в 1, а старшие
останутся такими же.

При
выполнении команды OR флаги OF и CF
обнуляются, SF, ZF и PF устанавливаются в
соответствии с результатом, AF не
определён.

Команда:

XOR
приёмник,
источник

Назначение:

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

Процессор:

8086

от
англ. “
eXclusionary
OR
– исключающее или

Выполняет
побитовое «логическое исключающее
ИЛИ» над приёмником
(регистр или переменная) и источником
(число, регистр или переменная) и помещает
результат в приёмник.
Источник и
приёмник не могут быть переменными
одновременно
.
Любой бит результата равен 1, если
соответствующие биты операндов различны,
и нулю, если одинаковы. XOR используется
для самых разных операций,

xor
al,00001111b
; младшие 4
бита инвертируются

например:

xor
ах,ах ; обнуление регистра АХ

или

xor
ах,bх

xor
bх,ах

xor
ах,bх ; меняет местами содержимое
АХ и ВХ

Докажем последний
пример:

;

Оба
этих примера выполняться быстрее, чем
соответствующие очевидные команды

mov
ax,0

или

xchg
ax,bx

Команда:

NOT
приёмник

Назначение:

Инверсия

Процессор:

8086

от
англ.
“NOT”
не

Каждый
бит приёмника
(регистр или переменная) инвертируется
(заменяется на противоположный): бит,
равный нулю, устанавливается в 1, а бит,
равный 1, сбрасывается в 0. Флаги не
затрагиваются.

Команда:

TEST
приёмник,
источник

Назначение:

Логическое
сравнение

Процессор:

8086

от
англ.
“TEST”
проверка,
тест

Вычисляет
результат действия побитового
«логического И» над приёмником
(регистр или переменная) и источником
(число, регистр или переменная) и
устанавливает флаги SF, ZF и PF в соответствии
с полученным результатом, не сохраняя
результат (флаги OF и CF обнуляются,
значение AF не определено). Источник и
приёмник не могут быть переменными
одновременно. TEST, так же как и СМР,
используется в основном в сочетании с
командами условного перехода (J*),
условной пересылки данных (CMOV*) и условной
установки байт (SET*).

mips assembly код, логические операции с использованием функций сдвига

Итак, вот задание, а затем ниже приведены мои вопросы и код, который у меня есть до сих пор.

Напишите программу, которая загружает четыре целочисленных операнда со знаком (A, B, C и D) из памяти в регистры,

сдвиг и поворот инструкциям, чтобы умножить значение на 5,

разделите значение B на 4 (усечение результата),

затем сдвигает значение C вправо на 3 битных места и

вращает значение D 2 бит находится слева.

Наконец, программа запишет новые значения A, B, C и D обратно в память.

Обязательно тщательно протестируйте свою программу, используя как положительные, так и отрицательные целые числа для входных данных. Проверьте правильность работы программы, изучив обновленное содержимое операндов памяти. не используйте инструкции по умножению или делению! (HINT: 5А = 4А + А.)

Пожалуйста, укажите код C для каждой строки, если это возможно. Спасибо!


  1. Я не могу понять, как умножить на нечетное число, я знаю, что мне нужно умножить, чтобы как можно ближе добавить 1, но я не могу понять, как это сделать.

  2. Этот код, который я вставлю ниже, который до сих пор работает для B, C и D….for как положительных, так и отрицательных чисел, однако в разделе ввода-вывода Mars печатает результат, который я прошу, а затем говорит: программа закончена (сброшена снизу). Что это значит и как мне это исправить?

  3. Я не уверен, что B на самом деле усекает результат, Пожалуйста, подтвердите или исправьте и объясните. Thanks…..below-это мой код до сих пор.


.text

main:

lw $t0, A
lw $t1, B
lw $t2, C
lw $t3, D

sll $s0, $t0, 2 # A= 5*4=20

sra $s1, $t1, 2 # B= -44/4=-11

sra $s2, $t2, 3 # C= -128/8=-16

rol $s3, $t3, 2 # D= -8 becomes -29

li $v0, 1
move $a0, $s3 # system call to print and check results
syscall

.data # the .data directive starts the data section

A: .word 5
B: .word -44
C: .word -128
D: .word -8

li $v0, 10 # exit
syscall

assembly

rotation

mips

logical-operators

bit-shift

Поделиться

Источник


darkn3t    

09 февраля 2014 в 01:50

2 ответа


  • MIPS Assembly-Строковые (ASCII) Инструкции

    Я пишу ассемблер в C для MIPS assembly (поэтому он преобразует MIPS assembly в машинный код). Теперь MIPS имеет три различных инструкции: R-Type, I-Type и J-Type. Однако в разделе .data . у нас может быть что-то вроде message: .asciiz hello world . В этом случае, как бы мы преобразовали строку…

  • Почему не существует кода операции subi для MIPS?

    Я очень новичок в языке Assembly . Я читал об архитектуре MIPS и узнал, что у вас есть код addi , но нет кода subi . Почему у нас нет кода операции subi ?



2

После sll $s0, $t0, 2 , $s0 = 20, а не 25, так как это $t0 << 2. Как и в подсказке, вам также нужно добавить.

Поделиться


rcgldr    

09 февраля 2014 в 01:57



1

Для вашего второго вопроса, где вы сказали, что программа говорит: «Однако в разделе ввода-вывода Mars печатает результат, который я прошу, а затем говорит-программа закончена (сброшена снизу) -. Что это значит и как это исправить.»

Поймите, что MARS (компилятор, используемый для выполнения инструкций MIPS) запускает весь код в одном направлении, начинает чтение из раздела .text и продолжает идти вниз, пока не найдет больше кода для чтения. Если он не вышел должным образом, он как бы выпадает из последней строки кода и выходит не так изящно.

В вашем случае у вас есть инструкция syscall 10 в разделе данных. Поместите инструкцию syscall 10 в раздел .text, который находится прямо над вашим разделом .data, чтобы программа не упала снизу. Надеюсь, это помогло

Поделиться


Aruna    

05 мая 2014 в 22:21


Похожие вопросы:

Где существует таблица поиска кода операции MIPS?

В настоящее время мы рассматриваем архитектуру MIPS. Я начинаю понимать компьютерную архитектуру и MIPS assembly, что очень хорошо. Тем не менее, я попытался погуглить этот ответ, но не нашел…

Команда gcc для преобразования кода c в код MIPS assembly

Я изучал примерно MIPS assembly язык. Я слышал, что существует команда gcc для преобразования исходного кода c в код MIPS Assembly.

mips assembly код для сдвига битового программирования

Прочтите в своем ученике ID и сохраните его в регистре, а затем прочтите в номере “10010000x” в качестве начального адреса памяти. Затем перенесите ваш студент ID числа вправо на один бит за один…

MIPS Assembly-Строковые (ASCII) Инструкции

Я пишу ассемблер в C для MIPS assembly (поэтому он преобразует MIPS assembly в машинный код). Теперь MIPS имеет три различных инструкции: R-Type, I-Type и J-Type. Однако в разделе .data . у нас…

Почему не существует кода операции subi для MIPS?

Я очень новичок в языке Assembly . Я читал об архитектуре MIPS и узнал, что у вас есть код addi , но нет кода subi . Почему у нас нет кода операции subi ?

Представляют операции BitWise и,или, сдвига в псевдокоде

Как я могу представить побитовое AND или операции и операции сдвига с использованием PsuedoCode? Пожалуйста Хэп меня

C-код до MIPS Assembly

Я пытался преобразовать код C в MIPS assembly. Вот эти два следующих фрагмента кода C. Проблема в том, что мое решение отличается от стандартного. Кроме того, я не понимаю стандартного решения. Я…

Код операции и код функции в MIPs Assembly

Мой профессор вечно отвечает на электронные письма, вполне разумно, так как сегодня суббота, так что я просто хотел спросить Здесь. Я читал здесь , что код функции определяет, что такое используемая…

Объектно-ориентированное наследование в MIPS Assembly

Я студент-информатик, в настоящее время прохожу курс компиляции , во время курса у нас есть проект по созданию компилятора на языке IC, который является подмножеством языка Java. Я нахожусь в…

есть ли компилятор, который преобразует код c++ в язык mips assembly

Привет, я студент и изучаю язык mips assembly, я курьез, то есть есть любой компилятор, который преобразует код c++ в язык mips assembly, IDE, который я использую для кодирования для mips, — это…

побитовых операторов — как написать операцию NOT для Risc-V (язык ассемблера)?

Подобно MIPS и некоторым другим архитектурам, RISC V не предоставляет специальных инструкций для многих вещей, включая унарные операции с двумя операндами, поскольку эти операции могут выполняться с использованием их формата с тремя операндами, обычно с x0 в качестве третьего операнда, но иногда константа 1 или -1 в качестве третьего операнда.

Для удобства ассемблер примет так называемые псевдоинструкции для этих унарных операций (и других).Вот список распространенных псевдоинструкций RISC V и их замен.

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

  li rd, немедленная | Мириады последовательностей | Загрузить немедленно
мв рд, рс | addi rd, rs, 0 | Копировать регистр
не rd, rs | xori rd, rs, -1 | Дополнение
негр, рс | sub rd, x0, rs | Два дополнения
негр, рс | subw rd, x0, rs | Дополнительное слово до двух
sext.w rd, rs | addiw rd, rs, 0 | Знак продлить слово
seqz rd, rs | sltiu rd, rs, 1 | Установить, если = ноль
снез рд, рс | sltu rd, x0, RS | Установите, если ̸ = ноль
sltz rd, rs | slt rd, RS, x0 | Установить, если <ноль
sgtz rd, rs | slt rd, x0, rs | Установить, если> ноль
beqz rs, смещение | beq rs, x0, смещение | Перейти, если = ноль
бнез рс, офсетная | bne rs, x0, смещение | Переход, если ̸ = ноль
blez rs, смещение | bge x0, rs, смещение | Переход, если ≤ ноль
bgez rs, смещение | bge rs, x0, смещение | Перейти, если ≥ ноль
bltz rs, смещение | blt rs, x0, смещение | Перейти, если <ноль
bgtz rs, смещение | blt x0, rs, смещение | Перейти, если> ноль
bgt rs, rt, смещение | blt rt, rs, смещение | Перейти, если>
ble rs, rt, смещение | bge rt, rs, смещение | Переход, если ≤
bgtu rs, rt, смещение | bltu rt, rs, смещение | Переход, если>, без знака
bleu rs, rt, смещение | bgeu rt, rs, смещение | Переход, если ≤, без знака
j смещение | jal x0, смещение | Прыжок
jal офсет | jal x1, смещение | Перейти и связать
jr rs | jalr x0, 0 (RS) | Регистр прыжков
jalr rs | jalr x1, 0 (RS) | Перейти и связать регистр
ret | jalr x0, 0 (x1) | Возврат из подпрограммы
позвонить аа | auipc x1, aa [31: 12] + aa [11] | Подпрограмма вызова удаленного абонента
                     | jalr x1, aa [11: 0] (x1) | (две инструкции)
хвост аа | auipc x6, aa [31: 12] + aa [11] | Подпрограмма удаленного вызова
                     | jalr x0, aa [11: 0] (x6) | (также две инструкции)
  

Кроме того, есть учебный процессор под названием LC-3.Он имеет только три арифметических / логических операции: ADD , AND , NOT . Тем не менее, ожидается, что студенты напишут код, который выполняет умножение, деление, модуль, XOR, , OR и т. Д. !! Умножение и деление / модуль выполняются с помощью цикла; XOR и OR выполняются с использованием логических последовательностей — мы знаем, что все логические операции могут быть выполнены с использованием только логических элементов NAND, поэтому наличие (только) AND и NOT является примитивным, но достаточным.

Моя любимая последовательность для XOR на этом процессоре получается из этой формулы:

  (А И НЕ В) + (НЕ А И В)
  

Где здесь + буквально ADD , который работает как замена ИЛИ , потому что оба операнда никогда не будут равны 1 одновременно, поэтому перенос из одной битовой позиции в другую не произойдет, и ниже при таких обстоятельствах ADD и OR эквивалентны.

8086 Логические инструкции с примерами программирования сборки

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

И Инструкция

Инструкция AND выполняет логическую операцию AND между двумя операндами. Источник может быть непосредственным, регистром или ячейкой памяти, а местом назначения может быть регистр или ячейка памяти. И исходный, и целевой операнды не могут быть ячейкой памяти. Он объединяет каждый бит исходного операнда с операндом-адресатом и сохраняет результат обратно в операнд-адресат.Однако содержимое исходного операнда остается неизменным. Если оба входных бита равны 1, только тогда операция И сгенерирует 1 в качестве выходного бита.

 Формат: И Назначение, Источник 

И пример логики

Предположим, что два числа 3527 и 2968.

Двоичный из 3527: 1101 1100 0111

Двоичный из 2968: 1011 1001 1000

Операция И между этими двумя числами дает:

Шестнадцатеричное значение 1001 1000 0000 — 980.

AND Пример сборки

Код приведен ниже. Два числа хранятся в BX и CX. Окончательный результат, полученный после операции И, попадает в регистр BX.

 ORG 100ч
.МОДЕЛЬ МАЛЫЙ
.КОД
MOV BX, 3527
MOV CX, 2968
И BX, CX
RET 

Выход:

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

Он выполняет операцию ИЛИ между двумя операндами и сохраняет результат обратно в операнд-адресат. Операнд-адресат может быть регистром или ячейкой памяти, тогда как источником может быть непосредственный, регистр или ячейка памяти.Но имейте в виду, что оба операнда не должны быть ячейками памяти. Команда OR сбрасывает флаги CF и OF на 0 и обновляет флаги PF, ZF и SF. Операция ИЛИ дает 1 на выходе, если любой из входов равен 1, и дает 0 на выходе только тогда, когда оба входа равны 0.

 Формат: ИЛИ Назначение, Источник 

Пример логики ИЛИ

Предположим, два числа 3527 и 2968. Операция ИЛИ между этими двумя числами дает:

Шестнадцатеричное значение 4063 — FDF.

OR Пример сборки

Данный код выполняет операцию ИЛИ между содержимым регистра CX и данными, хранящимися по адресу смещения 102h.

  ORG 100ч
.МОДЕЛЬ МАЛЫЙ
.ДАННЫЕ
VAR_1 DW 3527
.КОД
MOV AX, 0700h
MOV DS, AX
MOV CX, 2968
ИЛИ CX, [102h]
RET
  

Выход:

Инструкция XOR 8086

Эта инструкция выполняет операцию XOR между битами исходного и целевого операндов. Операция XOR дает 1, если оба входа различны. Когда оба входа одинаковы, выход будет нулевым. Исходный операнд может быть адресом регистра или памяти, тогда как операнд назначения может быть непосредственным, регистром или ячейкой памяти.

 Формат: назначение XOR, источник 

Пример логики XOR

Предположим, что в AH загружено 68H. Инструкция XOR выполняет операцию XOR между содержимым AH и непосредственным значением 9CH.

Пример сборки

  ORG 100ч
.МОДЕЛЬ МАЛЫЙ
.КОД
MOV AH, 68H
XOR AH, 9 каналов
RET
  

Выход:

Красный прямоугольник в выходных данных указывает результат операции XOR.

Инструкция по дополнению NEG 2

Команда NEG вычисляет дополнение до 2 операнда-адресата. Адресатом может быть регистр или адрес памяти. Он может изменять флаги AF, PF, ZF и OF регистра флагов.

 Формат: NEG Назначение 

Пример сборки

  ORG 100ч
.МОДЕЛЬ МАЛЫЙ
.КОД
MOV AX, 25H; устанавливает AX на 25H
NEG AX; дополнение данных Compute 2 в AX
MOV DX, 0711H
MOV DS, DX; устанавливает указатель стека данных на 0711H
NEG [9H]; вычислить 2-дополнение значения, хранящегося по адресу памяти DS: 0009H
RET; Останавливает программу  

Выход:

Команда NEG AX вычисляет 2-дополнение данных AX и сохраняет их в регистре AX.Дополнительное двоичное число 25H можно найти, преобразовав его в двоичное число. Двоичное значение 25H равно 0000 0000 0010 0101. Инвертируйте все биты и прибавьте 1 к результату. Дополнение к двум будет:

Шестнадцатеричное значение 1111 1111 1101 1011 — это FFDB. Таким образом, AX становится равным FFDB. В последней инструкции NEG [9H] вычисляется два дополнения данных, хранящихся по адресу смещения 0009H.

CMP Сравнить инструкцию 8086

Команда сравнения (CMP) сравнивает данные двух операндов и в зависимости от результата устанавливает флаг.Операнд назначения остается неизменным. Он сравнивает два операнда, вычисляя разницу между двумя операндами и устанавливает флаги CF, ZF и SF.

 Формат: назначение CMP, источник 
CF ZF SF
Dest = Источник 0 1 0
Dest> Источник8 0 9016 9016 901 901 901

0 9016 9016 <Источник 1 0 1

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

Пример сборки CMP

  ORG 100ч
.МОДЕЛЬ МАЛЫЙ
.КОД
MOV AX, 0025H; Устанавливает AX на 25H
MOV BX, 00A5H; Устанавливает BX на A5H
CMP AX, BX; Сравните содержимое AX с BX
RET; Останавливает программу  

Выход:

Проверяет содержимое AX и BX. В этом примере BX больше, чем AX.Разница AX-BX устанавливает CF и SF в 1, в то время как содержимое AX остается неизменным.

Выход:

Shift Right Инструкция

Есть две инструкции сдвига вправо, а именно логический сдвиг вправо (SHR) и арифметический сдвиг вправо (SAR). Обе инструкции описаны ниже.

 Формат: назначение SHR, счетчик 

SHR — это команда логического сдвига вправо, используемая для беззнаковых операндов. Он сдвигает биты операнда один за другим вправо.При каждом сдвиге младший бит передается флагу переноса и вставляет нули в старший бит. Сдвигаемый операнд может быть регистром или ячейкой памяти. Укажите количество смен, загрузив значение в регистр CL. Если биты нужно сдвинуть один раз, укажите это в инструкции. Операнд-адресат может быть регистром или ячейкой памяти и счетчиком, указывающими количество сдвигов.

Пример сборки инструкции правого переключения передач 1

Предположим, что регистр BL содержит шестнадцатеричное значение 6D.Двоичное значение 6D — 0110 1101.

SHR BL, 1 инструкция сдвигает 6D на 1. Таким образом, младший значащий бит, равный 1, передается флагу переноса, а все остальные биты сдвигаются на 1. Вставьте 0 в самый старший бит. Итак, окончательный результат, полученный после сдвига, будет (0011 0110), шестнадцатеричное значение которого равно 36.

  ORG 100ч
.МОДЕЛЬ МАЛЫЙ
.КОД
MOV BL, 6DH
ШР БЛ, 1
RET  

Выход:

Пример сборки 2

Допустим, вы хотите его 3 раза сдвинуть.Затем вы сначала загрузите регистр CL с номером 3.

Сдвигаемый операнд — 0110 1101.

1 st смена: 0011 0110 CF = 1

2 -я смена : 0001 1011 CF = 0

3 ряд ​​ смена: 0000 1101 CF = 1

Следовательно, окончательный результат — 0000 1101, шестнадцатеричное значение которого — D.

  ORG 100ч
.МОДЕЛЬ МАЛЫЙ
.КОД
МОВ ЦЛ, 3
MOV BL, 6DH
SHR BL, CL
RET
  

Выход:

8086 Инструкция Arithemtic Right Shift

Эта инструкция представляет собой арифметический сдвиг вправо, который имеет дело со знаковыми операндами.Работа этой инструкции аналогична инструкции SHR. Единственная разница в том, что когда биты сдвигаются вправо, пустые биты в MSB заполняются знаковым битом вместо нулей. Эту инструкцию также можно использовать для деления числа со знаком на 2, если счет равен 1.

 Формат: пункт назначения SAR, счетчик 

Пример сборки SAR

  ORG 100ч
.МОДЕЛЬ МАЛЫЙ
.КОД
МОВ ЦЛ, 1
MOV BL, -6DH
SAR BL, CL
RET
  

Выход:

Shift Left Инструкция

Есть две инструкции сдвига влево.Один используется для операндов со знаком, а другой — для операндов без знака. Обе инструкции объясняются в этом разделе.

 Формат: назначение SHL, счетчик 

SHL — это логический сдвиг влево для беззнаковых операндов. Он сдвигает биты операнда влево. Назначением может быть регистр или ячейка памяти. Количество сдвигов сохраняется в регистре CL, который затем загружается в операнд счетчика. Если количество смен равно 1, вы можете напрямую указать это в инструкциях, например SHL Destination, 1.После сдвига старший бит переходит в регистр флага CF, а младший бит заполняется нулями.

Пример сборки левого рычага

Предположим, что AX равно 029AH, а count равно 2. Тогда

Двоичное значение операнда 029A = 0010 1001 1010

1 st смена: 0101 0011 0100 CF = 0

2 -я смена : 1010 0110 1000 CF = 1

Шестнадцатеричное значение 1010 0110 1000 — A68H.

  ORG 100ч
.МОДЕЛЬ МАЛЫЙ
.КОД
МОВ ЦЛ, 2
MOV AX, 029AH
SHL AX, CL
RET
  

Выход:

Инструкция SAL 8086

Операция SAL аналогична инструкции SHL. Самый старший бит операнда остается неизменным, поскольку это бит со знаком, в то время как остальные биты сдвигаются влево, а пустые биты в LSB заполняются нулями.

 Формат: SAL Destination, Count 

Пример сборки SAL

  ORG 100ч
.МОДЕЛЬ МАЛАЯ
.КОД
МОВ ЦЛ, 2
MOV AX, -029AH
SAL AX, CL
RET
  

Выход:

Другое 8086 Учебники:

логических инструкций

логических инструкций

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

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

Логическая операция работает на поразрядном уровне. Начиная слева, немного
от каждого операнда выполняется логическая операция, в результате
логическое (истина / ложь) значение. Этот процесс продолжается до тех пор, пока все биты не будут
была выполнена логическая операция.

Возможные логические операции: И, ИЛИ и ИСКЛЮЧИТЕЛЬНОЕ ИЛИ. Поскольку эти
инструкции работают на поразрядном уровне, значение 0 считается ложным, а
значение 1 считается истинным.

И операция

  И Таблица истинности

Опер 1 Опера 2
  Бит   Бит   Результат  
  0 0 0 Когда выполняется операция И,
  0 1 0 результат будет 1 ТОЛЬКО если оба бита
  1 0 0 равны 1; в противном случае результат равен 0.
  1 1 1

 

Операция И используется для установки битов в 0

И немного с 1, остается неизменным.И немного с 0 становится 0

Формат RX: метка N R, D (X, B)

 

Полное слово в регистре и полное слово в D (X, B) соединяются вместе.
Результат операции заносится в реестр.

Формат RR: этикетка NR R  1 , R  2  

Полное слово в R 1 и полное слово в R 2 являются
И соединены вместе.Результат операции помещается в R 1 .

Формат SI: метка NI D (B), байт

 

Байт, расположенный в D (B), и ближайший байт, указанный байтом, являются
И соединены вместе. Результат операции помещается в D (B).

Формат SS: этикетка NC D  1  (L, B  1 ), D  2  (B  2 )

 

Области хранения байтов L в D 1 (B 1 ) и
D 2 (B 2 ) соединяются вместе.Результат операции
размещается, начиная с D 1 (B 1 ).

Для всех форматов, если каждый бит результата равен 0, устанавливается код условия.
до 0; в противном случае код условия устанавливается на 1.


  И Примеры: 

Предположим, что область памяти BYTE содержит X'C5 '. В двоичном формате:

          БАЙТ 1 1 0 0 0 1 0 1

     номер бита 0 1 2 3 4 5 6 7


Выполнение инструкции: NI BYTE, B'11111010 '


          БАЙТ 1 1 0 0 0 1 0 1
                   1 1 1 1 1 0 1 0 
  
        РЕЗУЛЬТАТ 1 1 0 0 0 0 0 0

изменит или "выключит" биты 5 и 7 в БАЙТЕ.BYTE сейчас
содержит X'C0 '.



Предположим, что регистр 5 содержит 00 00 0A 07. Тогда выполнение
Инструкция:


      N R5, = X'00000000 '


     Регистр 5 0000 0000 0000 0000 0000 1010 0000 0111
     X'00000000 ' 0000 0000 0000 0000 0000 0000 0000 0000 
                  0000 0000 0000 0000 0000 0000 0000 0000

обнулит регистр 5.


При выполнении N R5 = X'FFFFFFFF '


     Регистр 5 0000 0000 0000 0000 0000 1010 0000 0111
     X'FFFFFFFF ' 1111 1111 1111 1111 1111 1111 1111 1111 
                  0000 0000 0000 0000 0000 1010 0000 0111

ничего не будет делать.

ИЛИ операция

  ИЛИ Таблица истинности

Опер 1 Опера 2
  Бит   Бит   Результат  
  0 0 0 Когда выполняется операция ИЛИ,
  0 1 1 результат будет 0 ТОЛЬКО если оба бита
  1 0 1, иначе результат равен 1.
  1 1 1

 

Операция ИЛИ используется для установки битов на 1

ИЛИ бит с 0, он остается прежним.ИЛИ немного с 1, это становится 1

Формат RX: метка O R, D (X, B)

 

Полное слово в регистре и полное слово в D (X, B) соединяются вместе по ИЛИ.
Результат операции заносится в реестр.

Формат RR: этикетка ИЛИ R  1 , R  2  

Полное слово в R 1 и полное слово в R 2 являются
ИЛИ вместе.Результат операции помещается в R 1 .

Формат SI: метка OI D (B), байт

 

Байт, расположенный в D (B), и ближайший байт, указанный байтом, являются
ИЛИ вместе. Результат операции помещается в D (B).

Формат SS: этикетка OC D  1  (L, B  1 ), D  2  (B  2 )

 

Области хранения байтов L в D 1 (B 1 ) и
D 2 (B 2 ) объединяются по ИЛИ.Результат операции
размещается, начиная с D 1 (B 1 ).

Для всех форматов, если каждый бит результата равен 0, устанавливается код условия.
до 0; в противном случае код условия устанавливается на 1.


  ИЛИ Примеры: 

Предположим, что область памяти BYTE содержит X'05 '. В двоичном формате:

          БАЙТ 0 0 0 0 0 1 0 1


Выполнение инструкции: OI BYTE, X'F0 '


          БАЙТ 0 0 0 0 0 1 0 1
                   1 1 1 1 0 0 0 0 
  
        РЕЗУЛЬТАТ 1 1 1 1 0 1 0 1

изменит или «включит» биты с 0 по 3 в БАЙТЕ.Итак, БАЙТ
теперь содержит X'F5 '(символьное представление 5).



Предположим, что NUM содержит X'00378C '. Затем выполнение
инструкции:


      UNPK NUMOUT (5), NUM (3) приводит к NUMOUT F0 F0 F3 F7 C8
      OI NUMOUT + 4, X'F0 '


     ЧИСЛО + 4 = C8 1100 1000
     X'F0 ' 1111 0000 
                     1111 1000


Теперь содержимое NUMOUT выглядит следующим образом: F0 F0 F3 F7 F8.



Выполнение O R5, = X'FFFFFFFF '


     Регистр 5 0000 0000 0000 0000 0000 1010 0000 0111
     X'FFFFFFFF ' 1111 1111 1111 1111 1111 1111 1111 1111 
                  1111 1111 1111 1111 1111 1111 1111 1111

изменит содержимое регистра 5 на все Fs.При исполнении O R5 = X'00000000 '


     Регистр 5 0000 0000 0000 0000 0000 1010 0000 0111
     X'00000000 ' 0000 0000 0000 0000 0000 0000 0000 0000 
                  0000 0000 0000 0000 0000 1010 0000 0111

ничего не будет делать.

 

Операция EXCLUSIVE OR (XOR)

  Таблица истинности XOR

Опер 1 Опера 2
  Бит   Бит   Результат  
  0 0 0 Когда выполняется операция ИСКЛЮЧИТЕЛЬНОЕ ИЛИ.
  0 1 1 выполнено, результат равен 1, если оба
  1 0 1 биты разные; результат 0
  1 1 0, если оба бита одинаковы.

Операция XOR используется для установки битов на противоположное значение.

XOR немного с 0, он остается прежним. XOR немного с 1, он становится
противоположное значение

Формат RX: метка X R, D (X, B)

 

Полное слово в регистре и полное слово в D (X, B) объединяются с помощью XOR.
Результат операции заносится в реестр.

Формат RR: этикетка XR R  1 , R  2  

Полное слово в R 1 и полное слово в R 2 являются
XORed вместе.Результат операции помещается в R 1 .

Формат SI: метка XI D (B), байт

 

Байт, расположенный в D (B), и ближайший байт, указанный байтом, являются
XORed вместе. Результат операции помещается в D (B).

Формат SS: этикетка XC D  1  (L, B  1 ), D  2  (B  2 )

 

Области хранения байтов L в D 1 (B 1 ) и
D 2 (B 2 ) объединяются с помощью XOR.Результат операции
размещается, начиная с D 1 (B 1 ).

Для всех форматов, если каждый бит результата равен 0, устанавливается код условия.
до 0; в противном случае код условия устанавливается на 1.


  Примеры XOR: 

Предположим, что область памяти FLD1 содержит X'C2C3 '. В двоичном формате:

          ФЛД1 1100 0010 1100 0011


Выполнение инструкции: XC FLD1 (2), FLD1


          ФЛД1 1100 0010 1100 0011
          FLD1  1100 0010 1100 0011 
  
   FLD1 РЕЗУЛЬТАТ 0000 0000 0000 0000

установит в поле все нули.Итак, XORing поле против самого себя
установит в поле все нули.



Предположим, что R5 содержит 00 00 0A 07, а R7 содержит 00 34 00 67. Тогда
выполнение инструкции:


      XR R5, R7


     Регистр 5 0000 0000 0000 0000 0000 1010 0000 0111
     Регистр 7  0000 0000 0011 0100 0000 0000 0110 0111 
                  0000 0000 0011 0100 0000 1010 0110 0000


Теперь R5 содержит 00 34 0A 60, а R7 содержит 00 34 00 67.


Исполнение:

      XR R7, R5


     Регистр 7 0000 0000 0011 0100 0000 0000 0110 0111
     Регистр 5  0000 0000 0011 0100 0000 1010 0110 0000 
                  0000 0000 0000 0000 0000 1010 0000 0111


Теперь R5 содержит 00 34 0A 60, а R7 содержит 00 00 0A 07


Исполнение:

      XR R5, R7


     Регистр 5 0000 0000 0011 0100 0000 1010 0110 0000
     Регистр 7  0000 0000 0000 0000 0000 1010 0000 0111 
                  0000 0000 0011 0100 0000 0000 0110 0111


Теперь R5 содержит 00 34 00 67, а R7 содержит 00 00 0A 07


Три инструкции XR поменяли местами содержимое двух регистров.

Логические инструкции в x86 — Ресурсы Infosec

В этой статье определяются логические инструкции, выполняемые процессорами x86. Далее приводится краткое описание четырех основных классификаций логических инструкций.

Эта статья предназначена для студентов и профессионалов, которые хотят получить подробное представление о логических инструкциях, их классификации и способах их использования. Благодаря использованию эмулятора 8086 эта статья даст вам лучшее понимание логических инструкций, их синтаксиса и, в некоторых случаях, потока памяти во время выполнения.

Логические инструкции в x86

Логические инструкции определяют набор операций, выполняемых арифметико-логическим блоком процессора (ALU). В этой статье будут рассмотрены только четыре ключевые операции логических инструкций: И , ИЛИ , XOR и НЕ .

Базовый формат инструкций

Таблица 1: Логические инструкции и их основные форматы

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

И инструкция

Инструкция AND используется для выполнения операций с битами.

Таблица 2: Возможные двоичные состояния для двух входов

Рисунок 1: Логика И находится в состоянии ВЫКЛ, когда оба входа ВЫКЛЮЧЕНЫ

Рисунок 2: Логика И находится в состоянии ВЫКЛ, когда любой из входов ВЫКЛ.

Рисунок 3: Логика И находится в состоянии ВЫКЛ, когда любой из входов ВЫКЛ.

Рисунок 4: Логика И находится в состоянии ВКЛ, только когда оба входа включены

Таблица 3: Выход логики И с двумя входами

Следуя рисункам с 1 по 4, можно резюмировать, что побитовая операция И возвращает 1, если совпадающие биты из обоих входов или операндов равны 1.В противном случае возвращается 0.

Пример 1

  • MOV AX, 10100011b; Скопируйте двоичное значение 10100011 в аккумулятор
  • MOV BX, 00111101b; Скопируйте двоичное значение 00111101 в регистр BX
  • AND AX, BX; Выполните операцию И над значениями в регистрах AX и BX. Сохраните вывод в аккумуляторе

Операция И выполняется, как показано ниже:

Operand1 (AX): 1010 0011

Operand2 (BX): 0011 1101

———————————-

Операнд1 (AX): 0010 0001

Аккумулятор AX будет иметь значение 00100001 после выполнения операции AND.Это значение будет сохранено в 8-битном младшем регистре AL аккумулятора.

Рисунок 5: Содержимое регистров AX и BX до выполнения операции AND

Рисунок 6: Содержимое регистров AX и BX после выполнения операции AND

ИЛИ инструкция

Инструкция OR используется для выполнения операций с битами. Чтобы понять, как это работает, мы запустим имитатор логических вентилей, чтобы сгенерировать возможные выходные состояния логики ИЛИ для двух двоичных входов, A и B.Эти входы также являются операндами. Входы для логики ИЛИ такие же, как показано в Таблице 2.

Рисунок 7: Логика ИЛИ находится в состоянии ВЫКЛЮЧЕНО, когда оба входа ВЫКЛЮЧЕНЫ

Рисунок 8: Логика ИЛИ находится в состоянии ВКЛ, когда один из входов ВКЛ

Рисунок 9: Логика ИЛИ находится в состоянии ВКЛ, когда один из входов ВКЛ

Рис. 10. Логика ИЛИ находится в состоянии ВКЛ, когда оба входа включены

Таблица 4: Выход логики ИЛИ с двумя входами

Следуя рисункам с 7 по 10, можно резюмировать, что побитовая операция ИЛИ возвращает 1, если любой из битов на входе равен 1.В противном случае возвращается 0. Выход возвращает 1, когда оба входа равны 1.

Пример 2

Операция И выполняется, как показано ниже:

Operand1 (AX): 1010 0011

Operand2 (BX): 0011 1101

———————————-

Operand1 (AX): 1011 1111

Аккумулятор AX будет иметь значение 10111111 после выполнения операции ИЛИ. Это значение будет сохранено в 8-битном младшем регистре AL аккумулятора.

Рисунок 11: Содержимое регистров AX и BX до выполнения операции ИЛИ

Рисунок 12: Содержимое регистров AX и BX после выполнения операции ИЛИ

Инструкция XOR

Инструкция XOR используется для выполнения операций с битами.Мы воспользуемся симулятором, чтобы сгенерировать возможные выходные состояния логики XOR для двух двоичных входов A и B. Эти входы также представляют собой операнды команд. Входы для логики XOR такие же, как показано в таблице 2.

Рисунок 13: Логика XOR находится в состоянии ВЫКЛ, когда оба входа ВЫКЛЮЧЕНЫ

Рисунок 14: Логика XOR находится в состоянии ВКЛ, когда один из входов ВКЛ

Рисунок 15: Логика XOR находится в состоянии ВКЛ, когда один из входов включен

Рисунок 16: Логика XOR находится в состоянии ВЫКЛ, когда оба входа включены

Таблица 5: Выход логики XOR с двумя входами

Следуя рисункам с 13 по 16, можно резюмировать, что побитовая операция XOR возвращает 1, только если любой из битов на входе равен 1.В противном случае возвращается 0. Выход возвращает 0, если оба входа равны 1 или 0.

Пример 3

Операция XOR выполняется, как показано ниже:

Operand1 (AX): 1010 0011

Operand2 (BX): 0011 1101

———————————-

Операнд1 (AX): 1001 1110

Аккумулятор AX будет иметь значение 10011110 после выполнения операции XOR. Это значение будет сохранено в 8-битном младшем регистре AL аккумулятора.

Рисунок 17: Содержимое регистров AX и BX до выполнения операции XOR

Рисунок 18: Содержимое регистров AX и BX после выполнения операции XOR

НЕ инструкция

Инструкция НЕ используется для выполнения операций с битами.Эта инструкция меняет местами биты в операнде. Входы в логику НЕ показаны ниже в Таблице 6.

Таблица 6: Возможные двоичные состояния для одного входа

Рисунок 19: Логика НЕ ​​находится в состоянии ВКЛ, когда одноразрядный вход ВЫКЛ.

Рисунок 20: Логика НЕ ​​находится в состоянии ВЫКЛ, когда однобитовый вход включен

Таблица 7: Выход логики НЕ с одним входом

Пример 4

Операция НЕ выполняется, как показано ниже:

Operand1 (AL): 1010 0011

———————————-

Operand1 (AL): 0101 1100

Аккумулятор AL будет иметь значение 0101 1100 после выполнения операции NOT.

Рисунок 21: Содержимое регистра AL до выполнения операции NOT

Рисунок 22: Содержимое регистра AL после выполнения операции NOT

Заключение

В этой статье объясняются четыре ключевые инструкции логических операций. Чтобы адекватно помочь в понимании того, как работают операции AND, OR, XOR и NOT, в статье также представлен поток инструкций во время их выполнения. Эти потоки показывают содержимое регистров, особенно до и после выполнения операций.

Для всех четырех логических операций результаты анализа, показанные в примерах, совпадают с выходными данными и содержимым регистров после выполнения операций.

Источники

Арифметические инструкции, ScienceDirect

Операторы Ассемблера

Операторы Ассемблера

Операторы Ассемблера

Операторы выполняют арифметические и логические операции и конвертируют между различными типами и классами операторов.

Каждый оператор обсуждается в следующих разделах.

& — оператор переопределения идентификатора

Используйте оператор & для ссылки на идентификатор Modula-2 или Ada95, когда он конфликтует с зарезервированным словом встроенного ассемблера.

Пример:

& AX

Это может использоваться для ссылки на переменную AX вместо регистра AX.

() — оператор круглых скобок

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

[] — оператор обращения к памяти

Используйте квадратные скобки для создания операнда обращения к памяти. Квадратные скобки могут содержать:

  • Имена регистров, которые становятся индексными регистрами
  • Непосредственные операнды, которые складываются вместе для получения части смещения адреса

Внутри скобок можно складывать несколько элементов вместе.Если скобкам предшествует выражение, выражение добавляется, а тип результата — это тип предыдущего выражения.

16-битные примеры:

INC WORD PTR [BP + 4 + 2]

INC WORD PTR 6 [BP]

Оба примера ссылаются на смещение 6 из регистра BP.

32-битные примеры:

INC WORD PTR [EBP + 4 + 2]

INC WORD PTR 6 [EBP]

32-битные примеры функционально идентичны 16-битным примерам.

16-битные компиляторы:

Регистры BX, BP, SI и DI могут использоваться в качестве индексных регистров.Операнды могут иметь не более двух индексных регистров. Когда операнд имеет два индексных регистра, один из регистров должен быть из набора {BX, BP}, а другой из набора {SI, DI}. Любая другая комбинация регистров недопустима.

Примеры:

PUSH 2 [BP + SI] {legal}

PUSH 2 [BP] [SI] {то же, что и выше}

PUSH 2 [BP + BX] {invalid}

32-битные компиляторы:

Любая комбинация (1 или 2) регистров EAX, EBX, ECX, EDX, ESI, EDI, EBP или ESP * может использоваться в качестве индексных регистров.Дополнительно индексный регистр можно масштабировать (умножать на 2, 4 или 8).

* ESP может использоваться только как базовый регистр, но не как индексный регистр.

Примеры:

PUSH 4 [EBP + ESI] {Legal}

PUSH [EBP + ESI + 4] {то же, что и выше}

PUSH 4 [EBP] [ESI] {то же, что и выше}

PUSH [ EAX + EAX * 2 + 4] {legal}

PUSH 4 [EBP + ESP * 4] {недействительный ESP не может быть индексным регистром}

. — оператор выбора поля

Используйте оператор выбора поля, чтобы добавить операнд слева к операнду справа.Результат принимает тип операнда справа. Если операнд слева является типом записи Modula-2, правый операнд может быть идентификатором поля записи.

HIGH — оператор старшего байта

Этот оператор возвращает старший байт абсолютного непосредственного операнда. Результат абсолютный и немедленный.

LOW — оператор младшего байта

Оператор LOW возвращает младший байт абсолютного непосредственного операнда. Результат абсолютный и немедленный.

+ — оператор унарного плюса

Этот оператор возвращает свой операнд без изменений.

— — унарный оператор минус

Унарный оператор минус возвращает отрицательное значение своего абсолютного непосредственного операнда. Результат абсолютный и немедленный.

: — оператор переопределения сегмента

Операнд слева от двоеточия (:) — это регистр сегмента (ES, SS, CS илиDS), а операнд справа — операнд класса памяти. Указанный регистр сегмента отменяет сегмент по умолчанию для правого операнда. Класс и возможность перемещения операнда остаются прежними.

OFFSET — смещение оператора операнда памяти

Единственный операнд должен быть операндом класса памяти. Возвращается непосредственный операнд класса, который является частью смещения адреса операнда памяти.

SEG — сегмент оператора операнда памяти

Единственный операнд должен быть операндом класса памяти. Непосредственный операнд класса, который является Возвращается сегментная часть адреса операнда памяти.

TYPE — тип оператора операнда

Операнд TYPE возвращает тип своего единственного операнда.

  • Немедленные значения возвращают 0.
  • Ближайшие метки возвращают -2.
  • Дальние метки возвращают -1.

Другие типы операндов возвращают свою длину. Результат абсолютный и немедленный.

PTR — оператор замены типа

Левый операнд — это имя типа (или BYTE, WORD, DWORD, FWORD, QWORD, TBYTE, NEAR или FAR).

Правый операнд — это операнд класса памяти. PTR изменяет тип операнда памяти на тип, подразумеваемый левым операндом.

* — оператор умножения

Этот оператор умножает два своих операнда. Оба операнда должны иметь абсолютные промежуточные значения. Результат абсолютный и немедленный.

/ — оператор деления

Этот оператор делит левый операнд на правый операнд. Оба операнда должны быть абсолютными непосредственными операндами. Результат абсолютный и немедленный.

MOD — Оператор модуля

Этот оператор делит левый операнд на правый операнд, возвращая остаток.Оба операнда должны быть абсолютными непосредственными операндами. Результат абсолютный и немедленный.

SHL — Оператор сдвига влево

Этот оператор сдвигает левый операнд влево на количество битов, заданное правым операндом. Оба операнда должны быть абсолютными непосредственными операндами. Результат абсолютный и немедленный.

SHR — оператор

Этот оператор сдвигает левый операнд вправо на количество битов, заданное правым операндом. Оба операнда должны быть абсолютными непосредственными операндами.Результат абсолютный и немедленный.

+ — оператор сложения

Оператор сложения складывает левый и правый операнды. Операнды могут быть либо непосредственными, либо операндами класса памяти.

Один из операндов должен быть абсолютным. Если другой операнд перемещаемый, результат можно перемещать. В противном случае результат будет абсолютным.

Если оба операнда являются немедленными, результат будет немедленным. В противном случае результатом будет класс памяти.

Внутри скобок ссылки на память вы также можете использовать разрешенные компилятором регистры (16-битные или 32-битные) в качестве операндов оператора +.В этом случае операнд становится индексированной ссылкой на память.

— — оператор вычитания

Оператор вычитания вычитает правый операнд из левого. Правый операнд должен быть абсолютно непосредственным операндом. Левый операнд может быть любым классом. Если левый операнд перемещаемый, результат можно перемещать. В противном случае это абсолютно. Результат — тот же класс, что и левый операнд.

NOT — оператор побитового дополнения

Этот оператор дополняет единственный операнд.Нулевые биты превращаются в единицу, а один бит — в ноль. Операнд должен быть абсолютным непосредственным операндом.

AND — побитовый оператор and

Оператор AND объединяет биты левого и правого операндов. Ботоперанды должны быть абсолютно непосредственными операндами. Результат абсолютный и немедленный.

OR — побитовый оператор или

Оператор OR объединяет биты левого и правого операндов. Ботоперанды должны быть абсолютно непосредственными операндами. Результат абсолютный и немедленный.

XOR — побитовый оператор исключающего ИЛИ

Этот оператор XOR объединяет биты левого и правого операндов. Ботоперанды должны быть абсолютно непосредственными операндами. Результат абсолютный и немедленный.

Приоритет операторов

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

двоичное сложение

Операторы двоичного дополнения

Оператор Описание
и Переопределение идентификатора
() []. Круглые скобки, квадратные скобки и выбор поля
HIGH LOW Операторы старших и младших байтов
+ — Унарный плюс и минус
: 901 901 901 901 901 TYPE Унарный оператор
PTR Переопределение типа
* / MOD SHL SHR Операторы двоичного умножения
+ — Операторы двоичного сложения

И Побитовое логическое значение и
ИЛИ XOR Побитовое логическое значение

Арифметические и логические команды

Арифметические и логические команды

Во всех приведенных ниже инструкциях Src2 может быть регистром или регистром.
немедленное значение (16-битное целое число).Непосредственные формы
инструкции включены только для справки. Ассемблер будет
перевести более общую форму инструкции (например, добавить)
в непосредственную форму (например, addi), если второй аргумент равен
постоянный.


abs Rdest, Rsrc Абсолютное значение


Поместите абсолютное значение целого числа из регистра Rsrc в
зарегистрировать Rdest.


добавить Rdest, Rsrc1, Src2Addition (с переполнением)


addi Rdest, Rsrc1, ImmAddition Immediate (с переполнением)


addu Rdest, Rsrc1, Src2Addition (без переполнения)


addiu Rdest, Rsrc1, ImmAddition Immediate (без переполнения)


Поместите сумму целых чисел из регистров Rsrc1 и Src2 (или Imm) в регистр Rdest.


и Rdest, Rsrc1, Src2AND


andi Rdest, Rsrc1, ImmAND Immediate


Поставьте логическое И целых чисел из регистра Rsrc1 и
Src2 (или Imm) в регистр Rdest.


div Rsrc1, Rsrc2Divide (со знаком)


divu Rsrc1, Rsrc2Divide (без знака)


Разделите содержимое двух регистров.
divu рассматривает операнды как беззнаковые значения. Оставьте частное в
Зарегистрируйте lo, а остаток — в регистре hi.Обратите внимание, что
если операнд отрицательный, остаток не определяется MIPS
архитектура и зависит от условностей машины, на которой
СПИМ запускается.


div Rdest, Rsrc1, Src2Divide (со знаком, с переполнением)


divu Rdest, Rsrc1, Src2Divide (без знака, без переполнения)


Поместите частное целых чисел из регистров Rsrc1 и Src2 в регистр Rdest. divu рассматривает операнды как
беззнаковые значения.


mul Rdest, Rsrc1, Src2Multiply (без переполнения)


mulo Rdest, Rsrc1, Src2Multiply (с переполнением)


mulou Rdest, Rsrc1, Src2 Беззнаковое умножение (с переполнением)


Поместите произведение целых чисел из регистров Rsrc1 и Src2 в регистр Rdest.


mult Rsrc1, Rsrc2Multiply


multu Rsrc1, Rsrc2 Беззнаковое умножение


Умножьте содержимое двух регистров. Оставьте младшее слово
продукта в регистре lo и старшего слова в регистре hi.


neg Rdest, RsrcNegate Value (с переполнением)


negu Rdest, RsrcNegate Value (без переполнения)


Поместите отрицательное число из регистра Rsrc в
зарегистрировать Rdest.


ни Rdest, Rsrc1, Src2NOR


Поместите логическое ИЛИ целых чисел из регистра Rsrc1 и
Src2 в регистр Rdest.


not Rdest, RsrcNOT


Поместите поразрядное логическое отрицание целого числа из регистра Rsrc в регистр Rdest.


или Rdest, Rsrc1, Src2OR


ori Rdest, Rsrc1, ImmOR Immediate


Поместите логическое ИЛИ целых чисел из регистра Rsrc1 и Src2 (или Imm) в регистр Rdest.


rem Rdest, Rsrc1, Src2Remainder


remu Rdest, Rsrc1, Src2 Беззнаковый остаток


Положите остаток от деления целого числа в регистре Rsrc1 на
целое число из Src2 в регистр Rdest.Обратите внимание, что если
операнд отрицательный, остаток не указан в MIPS
архитектура и зависит от условностей машины, на которой
СПИМ запускается.


rol Rdest, Rsrc1, Src2 Повернуть влево


ror Rdest, Rsrc1, Src2 Повернуть вправо


Поверните содержимое регистра Rsrc1 влево (вправо) с помощью
расстояние, указанное Src2, и занести результат в регистр
Rdest.


sll Rdest, Rsrc1, Src2 Сдвиг влево, логический


sllv Rdest, Rsrc1, Rsrc2 — сдвиг влево логической переменной


sra Rdest, Rsrc1, Src2 Арифметика сдвига вправо


srav Rdest, Rsrc1, Rsrc2 Арифметическая переменная сдвига вправо


srl Rdest, Rsrc1, Src2 Сдвиг вправо, логический


srlv Rdest, Rsrc1, Rsrc2 Сдвиг вправо логической переменной


Сдвиньте содержимое регистра Rsrc1 влево (вправо) на
расстояние, обозначенное Src2 (Rsrc2), и поместите
приведи в реестр Rdest.


sub Rdest, Rsrc1, Src2Subtract (с переполнением)


subu Rdest, Rsrc1, Src2Subtract (без переполнения)


Поместите разницу целых чисел из регистров Rsrc1 и Src2 в регистр Rdest.


xor Rdest, Rsrc1, Src2XOR


xori Rdest, Rsrc1, ImmXOR Immediate


Поместите логический XOR целых чисел из регистра Rsrc1 и
Src2 (или Imm) в регистр Rdest.

Ян Мур
2009-03-11

% PDF-1.3
%
8112 0 объект
>
эндобдж
xref
8112 324
0000000016 00000 н.
0000006855 00000 н.
0000007063 00000 н.
0000007205 00000 н.
0000011880 00000 п.
0000012061 00000 п.
0000012130 00000 н.
0000012234 00000 п.
0000012371 00000 п.
0000012543 00000 п.
0000012644 00000 п.
0000012741 00000 п.
0000012849 00000 п.
0000012966 00000 п.
0000013073 00000 п.
0000013180 00000 п.
0000013287 00000 п.
0000013404 00000 п.
0000013521 00000 п.
0000013639 00000 п.
0000013756 00000 п.
0000013864 00000 п.
0000013981 00000 п.
0000014098 00000 п.
0000014206 00000 п.
0000014313 00000 п.
0000014420 00000 п.
0000014537 00000 п.
0000014654 00000 п.
0000014761 00000 п.
0000014878 00000 п.
0000014986 00000 п.
0000015156 00000 п.
0000015261 00000 п.
0000015410 00000 п.
0000015529 00000 п.
0000015654 00000 п.
0000015789 00000 п.
0000015919 00000 п.
0000016053 00000 п.
0000016223 00000 п.
0000016343 00000 п.
0000016516 00000 п.
0000016685 00000 п.
0000016825 00000 п.
0000016965 00000 п.
0000017129 00000 п.
0000017242 00000 п.
0000017354 00000 п.
0000017484 00000 п.
0000017646 00000 п.
0000017750 00000 п.
0000017856 00000 п.
0000017977 00000 п.
0000018140 00000 п.
0000018255 00000 п.
0000018366 00000 п.
0000018481 00000 п.
0000018597 00000 п.
0000018708 00000 п.
0000018837 00000 п.
0000018965 00000 п.
0000019094 00000 п.
0000019221 00000 п.
0000019333 00000 п.
0000019444 00000 п.
0000019581 00000 п.
0000019709 00000 п.
0000019845 00000 п.
0000020022 00000 н.
0000020117 00000 п.
0000020218 00000 н.
0000020333 00000 п.
0000020522 00000 п.
0000020618 00000 п.
0000020759 00000 п.
0000020920 00000 н.
0000021033 00000 п.
0000021151 00000 п.
0000021274 00000 п.
0000021396 00000 п.
0000021512 00000 п.
0000021615 00000 п.
0000021795 00000 п.
0000021890 00000 п.
0000022031 00000 п.
0000022146 00000 п.
0000022259 00000 п.
0000022363 00000 п.
0000022485 00000 п.
0000022661 00000 п.
0000022758 00000 п.
0000022900 00000 п.
0000023060 00000 п.
0000023177 00000 п.
0000023289 00000 п.
0000023405 00000 п.
0000023524 00000 п.
0000023630 00000 п.
0000023754 00000 п.
0000023882 00000 п.
0000024009 00000 п.
0000024189 00000 п.
0000024284 00000 п.
0000024425 00000 п.
0000024586 00000 п.
0000024705 00000 п.
0000024818 00000 п.
0000024956 00000 п.
0000025098 00000 п.
0000025213 00000 п.
0000025331 00000 п.
0000025451 00000 п.
0000025577 00000 п.
0000025716 00000 п.
0000025860 00000 п.
0000026009 00000 п.
0000026148 00000 п.
0000026290 00000 н.
0000026468 00000 н.
0000026563 00000 п.
0000026704 00000 п.
0000026865 00000 п.
0000026983 00000 п.
0000027095 00000 п.
0000027221 00000 н.
0000027347 00000 п.
0000027462 00000 п.
0000027573 00000 п.
0000027679 00000 н.
0000027804 00000 п.
0000027924 00000 н.
0000028104 00000 п.
0000028199 00000 п.
0000028340 00000 п.
0000028500 00000 п.
0000028618 00000 п.
0000028729 00000 п.
0000028845 00000 п.
0000028950 00000 п.
0000029060 00000 н.
0000029189 00000 п.
0000029318 00000 п.
0000029449 00000 н.
0000029576 00000 п.
0000029752 00000 п.
0000029847 00000 п.
0000029944 00000 н.
0000030060 00000 п.
0000030175 00000 п.
0000030350 00000 п.
0000030445 00000 п.
0000030586 00000 п.
0000030746 00000 п.
0000030855 00000 п.
0000030976 00000 п.
0000031111 00000 п.
0000031226 00000 п.
0000031341 00000 п.
0000031465 00000 п.
0000031603 00000 п.
0000031742 00000 п.
0000031916 00000 п.
0000032012 00000 н.
0000032153 00000 п.
0000032313 00000 п.
0000032431 00000 п.
0000032539 00000 п.
0000032671 00000 п.
0000032801 00000 п.
0000032937 00000 п.
0000033052 00000 п.
0000033170 00000 п.
0000033278 00000 п.
0000033425 00000 п.
0000033556 00000 п.
0000033686 00000 п.
0000033824 00000 п.
0000033966 00000 п.
0000034140 00000 п.
0000034236 00000 п.
0000034333 00000 п.
0000034493 00000 п.
0000034608 00000 п.
0000034732 00000 п.
0000034838 00000 п.
0000035003 00000 п.
0000035098 00000 п.
0000035243 00000 п.
0000035358 00000 п.
0000035473 00000 п.
0000035596 00000 п.
0000035730 00000 п.
0000035862 00000 п.
0000035988 00000 п.
0000036121 00000 п.
0000036289 00000 п.
0000036402 00000 п.
0000036496 00000 н.
0000036606 00000 п.
0000036716 00000 п.
0000036849 00000 п.
0000036965 00000 п.
0000037080 00000 п.
0000037207 00000 п.
0000037333 00000 п.
0000037447 00000 п.
0000037561 00000 п.
0000037680 00000 п.
0000037790 00000 п.
0000037901 00000 п.
0000038014 00000 п.
0000038124 00000 п.
0000038238 00000 п.
0000038349 00000 п.
0000038461 00000 п.
0000038574 00000 п.
0000038688 00000 п.
0000038806 00000 п.
0000038918 00000 п.
0000039030 00000 н.
0000039142 00000 п.
0000039260 00000 п.
0000039376 00000 п.
0000039493 00000 п.
0000039610 00000 п.
0000039725 00000 п.
0000039832 00000 н.
0000039938 00000 н.
0000040045 00000 п.
0000040151 00000 п.
0000040257 00000 п.
0000040363 00000 п.
0000040493 00000 п.
0000040672 00000 п.
0000040781 00000 п.
0000040894 00000 п.
0000041016 00000 п.
0000041138 00000 п.
0000041278 00000 п.
0000041422 00000 п.
0000041610 00000 п.
0000041771 00000 п.
0000041863 00000 п.
0000041970 00000 п.
0000042077 00000 н.
0000042184 00000 п.
0000042291 00000 п.
0000042398 00000 п.
0000042505 00000 п.
0000042613 00000 п.
0000042720 00000 н.
0000042827 00000 н.
0000042934 00000 п.
0000043041 00000 п.
0000043148 00000 п.
0000043255 00000 п.
0000043362 00000 п.
0000043470 00000 п.
0000043578 00000 п.
0000043685 00000 п.
0000043792 00000 п.
0000043899 00000 н.
0000044006 00000 п.
0000044113 00000 п.
0000044220 00000 п.
0000044328 00000 п.
0000044436 00000 п.
0000044576 00000 п.
0000044712 ​​00000 п.
0000044827 00000 н.
0000044947 00000 п.
0000045070 00000 п.
0000045226 00000 п.
0000045397 00000 п.
0000045548 00000 п.
0000045713 00000 п.
0000045839 00000 п.
0000045966 00000 п.
0000046152 00000 п.
0000046247 00000 п.
0000046368 00000 н.
0000046480 00000 п.
0000046589 00000 п.
0000046717 00000 п.
0000046824 00000 п.
0000046981 00000 п.
0000047122 00000 п.
0000047221 00000 п.
0000047315 00000 п.
0000047428 00000 п.
0000047546 00000 п.
0000047714 00000 п.
0000047866 00000 п.
0000047986 00000 п.
0000048115 00000 п.
0000048236 00000 п.
0000048391 00000 п.
0000048504 00000 п.
0000048609 00000 п.
0000048728 00000 н.
0000048858 00000 п.
0000048976 00000 п.
0000049100 00000 п.
0000049188 00000 п.
0000049297 00000 п.
0000049412 00000 п.
0000049521 00000 п.
0000049645 00000 п.
0000049775 00000 п.
0000049901 00000 н.
0000050036 00000 п.
0000050763 00000 п.
0000051391 00000 п.
0000052071 00000 п.
0000052796 00000 п.
0000053263 00000 п.
0000053842 00000 п.
0000054471 00000 п.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *