Ассемблер пример программы коды

Арифметические операции — ADD, SUB, MUL, DIV. Многие опкоды делают вычисления. Вы можете узнать многие из них по их названиям: add (addition — добавление), sub (substraction — вычитание), mul (multiply — умножение), div (divide — деление).

Опкод add имеет следующий синтаксис:

add приемник, источник

Выполняет вычисление: приемник = приемник + источник.

Имеются также другие формы:

приемник источник пример
регистр регистр add ecx, edx
регистр память add ecx, dword ptr [104h] / add ecx, [edx]
регистр значение add eax, 102
память значение add dword ptr [401231h], 80
память регистр add dword ptr [401231h], edx

Эта команда очень проста. Она добавляет значение источника к значение приемника и помещает результат в приемник. Другие математические команды:

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

sub приемник, источник (приемник = приемник — источник)
mul множимое, множитель (множимое = множимое * множитель)
div делитель (eax = eax / делитель, edx = остаток)

Поскольку регистры могут содержать только целочисленные значения (то есть числа, не, с плавающей запятой), результат деления разбит на частное и остаток. Теперь, в зависимости от размера источника, частное сохраняется в eax, а остаток в edx:

размер источника деление частное в. остаток в.
BYTE (8-bits) ax / делитель AL AH
WORD (16-bits) dx:ax* / делитель AX DX
DWORD (32-bits) edx:eax* / делитель EAX EDX

* = Например: если dx = 2030h, а ax = 0040h, dx: ax = 20300040h. Dx:ax — значение dword, где dx представляет старшее word, а ax — младшее. Edx:eax — значение quadword (64 бита), где старшее dword в edx и младшее в eax.

  1. 8-бит регистр (al, ah, cl. )
  2. 16-бит регистр (ax, dx, . )
  3. 32-бит регистр (eax, edx, ecx. )
  4. 8-бит значение из памяти (byte ptr [xxxx])
  5. 16-бит значение из памяти (word ptr [xxxx])
  6. 6a 32-бит значение памяти (dword ptr [xxxx])

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

Логические операции с битами — OR, XOR, AND, NOT. Эти команды работают с приемником и источником, исключение команда ‘NOT’. Каждый бит в приемнике сравнивается с тем же самым битом в источнике, и в зависимости от команды, 0 или 1 помещается в бит приемника:

Читайте также:
Установка программ на Xbox one

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

Сложен ли ассемблер? Команды ассемблера для микропроцессора Z80. Примеры программ в соотношении с C

Учебный курс. Урок 9. Сложение и вычитание

После того, как мы изучили механизм представления и обработки чисел процессором, самое время начать знакомство с инструкциями. Ну а к самым простым инструкциям в ассемблере безусловно относятся мнемоники для сложения и вычитания чисел — ADD и SUB.

Сложение — команда ADD

Инструкция ADD выполняет сложение двух операндов. ADD можно «скармливать» числа со знаком и без (такова специфика дополнительного кода). Обязательным правилом является равность операндов по размеру, между собой можно складывать только два 16-битных числа или два 8-битных.

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

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

  • Флаг CF становится равным единице, если складываемые операнды являются знаковыми и результат вышел за пределы приемника и случился перенос из старшего разряда. CF = 1 при сложении беззнаковых операндов указывает на переполнение и некорректный результат.
  • Флаг OF = 1 говорит, что произошло переполнение при сложении чисел со знаком.
  • Флаг SF имеет смысл только для операндов со знаком. SF = 1 если результат отрицательный, и SF = 0, если результат положительный. В случае с беззнаковыми операндами он просто получает значение старшего бита приемника.
  • Флаг ZF = 1 указывает, что результат равен нулю.
  • Флаг PF указывает на бинарную четность результата. Это означает что двоичное представление результата содержит четное количество единиц и нулей. Например: 0010111b.

Пример использования команды add:

add ax , 10 ;AX = AX + 5
add dx , cx ;DX = DX + CX
add dx , cl ;Ошибка: разный размер операндов

Вычитание — команда SUB

Инструкция SUB выполняет вычитание операндов. Как и в случае с инструкцией ADD результат операции помещается в первый операнд (приемник). Аналогично изменяются флаги процессора.

На самом деле процессор не умеет вычитать числа. Он все делает через сложение Просто перед сложением он подменяет знак второго операнда на противоположный. Так что между инструкциями SUB и ADD даже больше общего.

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

Читайте также:
Какую лучше изучить программу

Примеры использования инструкций SUB и NEG:

sub ax , dx ;AX = AX — DX
neg cx ;CX = -CX

Инструкции INC и DEC. Инкремент и декремент

Нередко в теле программы то или иное число нужно увеличить или убавить ровно на единицу. В программировании прибавление к операнду единицы называется инкрементом, а вычитание единицы от операнда — декрементом. Инструкции INC и DEC принимают единственный операнд. Выполнение этих инструкций не меняет значение флага CF, что является важной деталью.

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

Предлагаю закрепить полученные знания, создав маленькую программу. Нам нужно написать код, который вернет результат вычисления формулы: x = a — (b — c + 1) + (-d). Каждая переменная представляет целое 8-битное число со знаком. Переменные объявим и присвоим им значения в конце кода программы. Пример такой программы:

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

Циклы в ассемблере.

В любом языке программирования, как и в языке Assembler, циклом называется повторяющееся выполнение последовательности команд. Рассмотрим сегодня как организовывать циклы в Assemblere.

Команда LOOP

Для организации цикла предназначена команда LOOP. У этой команды один операнд — имя метки, на которую осуществляется переход. В качестве счётчика цикла используется регистр CX. Команда LOOP выполняет декремент CX, а затем проверяет его значение. Если содержимое CX не равно нулю, то осуществляется переход на метку, иначе управление переходит к следующей после LOOP команде.

Содержимое CX интерпретируется командой как положительное число. В CX нужно помещать число, равное требуемому количеству повторений цикла. Метка должна находиться в диапазоне -127…+128 байт от команды LOOP (иначе будет ошибка). Метка представляет собой символическое имя, вместо которого компилятор подставляет адрес.

Имена переменных, объявленных с помощью директив объявления данных, тоже являются метками. Но с ними компилятор дополнительно связывает размер переменной. Метка объявляется очень просто: достаточно в начале строки написать имя и поставить двоеточие. Например:

m1: mov ax,4C00h int 21h

Теперь вместо имени m1 компилятор везде будет подставлять адрес команды mov ax,4C00h. Имя метки может состоять из латинских букв, цифр и символов подчёркивания, но должно начинаться с буквы. Имя метки должно быть уникальным. В качестве имени метки нельзя использовать директивы и ключевые слова компилятора, названия команд и регистров.

Пример цикла

В качестве примера напишем простую программу, которая будет печатать все буквы английского алфавита. ASCII-коды этих символов расположены последовательно, поэтому можно выводить их в цикле. Для вывода символа на экран используется функция DOS 02h (выводимый байт должен находиться в регистре DL).

Читайте также:
Что такое программа au pair

use16 ;Генерировать 16-битный код org 100h ;Программа начинается с адреса 100h mov ah,02h ;Для вызова функции DOS 02h — вывод символа mov dl,’A’ ;Первый выводимый символ mov cx,26 ;Счётчик повторений цикла metka: int 21h ;Обращение к функции DOS inc dl ;Следующий символ loop metka ;Команда цикла mov ah,09h ;Функция DOS 09h — вывод строки mov dx,press ;В DX адрес строки int 21h ;Обращение к функции DOS mov ah,08h ;Функция DOS 08h — ввод символа без эха int 21h ;Обращение к функции DOS mov ax,4C00h ; int 21h ;/ Завершение программы ;——————————————————- press: db 13,10,’Press any key. $’

Команды «int 21h» и «inc dl» будут выполняться в цикле 26 раз. Для того, чтобы программа не закрылась сразу, используется функция DOS 08h — ввод символа с клавиатуры без эха, то есть вводимый символ не отображается.

Вложенные циклы

Вложенный цикл — это цикл внутри другого цикла. Чтобы сделать вложенный цикл необходимо сохранить значение CX перед началом вложенного цикла и восстановить после его завершения (перед командой LOOP внешнего цикла). Сохранить значение можно в другой регистр, во временную переменную или в стек. Следующая программа выводит все доступные ASCII-символы в виде таблицы 16×16. Значение счётчика внешнего цикла сохраняется в регистре BX.

use16 ;Генерировать 16-битный код org 100h ;Программа начинается с адреса 100h mov ah,02h ;Для вызова функции DOS 02h — вывод символа sub dl,dl ;Первый выводимый символ mov cx,16 ;Счётчик внешнего цикла (по строкам) lp1: mov bx,cx ;Сохраняем счётчик в BX mov cx,16 ;Счётчик внутреннего цикла (по столбцам) lp2: int 21h ;Обращение к функции DOS inc dl ;Следующий символ loop lp2 ;Команда внутреннего цикла mov dh,dl ;Сохраняем значение DL в DH mov dl,13 ; int 21h ; mov dl,10 ; / Переход на следующую строку int 21h ;/ mov dl,dh ;Восстанавливаем значение DL mov cx,bx ;Восстанавливаем значение счётчика loop lp1 ;Команда внешнего цикла mov ah,09h ;Функция DOS 09h — вывод строки mov dx,press ;В DX адрес строки int 21h ;Обращение к функции DOS mov ah,08h ;Функция DOS 08h — ввод символа без эха int 21h ;Обращение к функции DOS mov ax,4C00h ; int 21h ;/ Завершение программы ;——————————————————- press db 13,10,’Press any key. $’

Источник: it-black.ru

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