Рубрики
Учебный курс

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

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

Рубрики
Справочник по ассемблеру

ADC

СинтаксисADC приемник,источник
Машинный
код
14 ib — ADC AL,imm8
15 iw — ADC AX,imm16
15 id — ADC EAX,imm32
80 /2 ib — ADC r/m8,imm8
81 /2 iw — ADC r/m16,imm16
81 /2 id — ADC r/m32,imm32
83 /2 ib — ADC r/m16,imm8
83 /2 ib — ADC r/m32,imm8
10 /r — ADC r/m8,r8
11 /r — ADC r/m16,r16
11 /r — ADC r/m32,r32
12 /r — ADC r8,r/m8
13 /r — ADC r16,r/m16
13 /r — ADC r32,r/m32
ОписаниеСложение с учётом переноса.
ДействиеСложение двух целочисленных двоичных операндов с учётом флага переноса CF.
приёмник = приёмник + источник + CF
ФлагиOF=r SF=r ZF=r AF=r PF=r CF=r

При сложении чисел которые в результате дадут больше 16 бит происходит перенос старшего бита, из-за чего флаг CF (carry flag) меняет значение. Команда ADC учитывает значение флага CF предыдущей операции сложения и при вызове складывает операнды и добавляет значение CF (единицу или ноль) к младшему разряду результата.

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

Рубрики
Справочник по ассемблеру

ADD

СинтаксисADD приемник,источник
Машинный
код
04 ib — ADD AL,imm8
05 iw — ADD AX,imm16
05 id — ADD EAX,imm32
80 /0 ib — ADD r/m8,imm8
81 /0 iw — ADD r/m16,imm16
81 /0 id — ADD r/m32,imm32
83 /0 ib — ADD r/m16,imm8
83 /0 ib — ADD r/m32,imm8
00 /r — ADD r/m8,r8
01 /r — ADD r/m16,r16
01 /r — ADD r/m32,r32
02 /r — ADD r8,r/m8
03 /r — ADD r16,r/m16
03 /r — ADD r32,r/m32
ОписаниеСложение.
ДействиеСложение двух целочисленных двоичных операндов.
приёмник = приёмник + источник
ФлагиOF=r SF=r ZF=r AF=r PF=r CF=r

Команда add выполняет операцию сложения. Результат сложения 2-х аргументов помещается в первый аргумент (приемник). Если результат выходит за диапазон приемника, изменяются флаги CF и OF (переполнение), SF (результат со знаком минус), которые интерпретируются в зависимости от того, являются ли складываемые аргументы числами со знаком или без.

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

Рубрики
Учебный курс

Учебный курс. Урок 8. Числа со знаком и без

Со школьной скамьи нас учили, что у чисел бывают отрицательные значения. Дело выглядело просто, записываешь число на бумаге, рисуешь черточку слева и все – положительное число превратилось в отрицательное. Для арифметической операции нужно от положительного числа отнять модуль отрицательного числа. К сожалению, такой подход совершенно не приемлем для машинных вычислений, потому что процессор не разделяет […]

Рубрики
Справочник по ассемблеру

INC

СинтаксисINC операнд
Машинный
код
FE /0 — INC r/m8
FF /0 — INC r/m16
FF /0 — INC r/m32
40+rw — INC r16
40+rd — INC r32
ОписаниеИнкремент.
ДействиеУвеличение операнда на 1. Команда не воздействует на флаг CF.
ФлагиOF=r SF=r ZF=r AF=r PF=r
Рубрики
Справочник по ассемблеру

MOV

СинтаксисMOV приемник,источник
Машинный
код
88 /r — MOV r/m8,r8
89 /r — MOV r/m16,r16
89 /r — MOV r/m32,r32
8А /r — MOV r8,r/m8
8В /r — MOV r16,r/m16
8В /r — MOV r32,r/m32
8C /r — MOV r/m16,Sreg**
8E /r — MOV Sreg,r/m16
А0 — MOV AL,moffs8*
A1 — MOV AX,moffs16*
A1 — MOV EAX,moffs32*
A2 — MOV moffs8*,AL
A3 — MOV moffs16*,AX
A3 — MOV moffs32*,EAX
B0+rb — MOV r8,imm8
B8+rw — MOV r16,imm16
B8+rd — MOV r32,imm32
C6 /0 — MOV r/m8,imm8
C7 /0 — MOV r/m16,imm16
C7 /0 — MOV r/m32,imm32
ОписаниеКопирование.
ДействиеКопирование содержимого операнда источник в операнд приемник.
ФлагиOF = ? SF = ? ZF = ? AF = ? PF = ? CF = ?
Рубрики
Справочник по ассемблеру

NOP

СинтаксисNOP
Машинный
код
90
ОписаниеНет операции.
ДействиеОтсутствует. Единственный эффект от команды NOP — инкремент регистра EIP.
ФлагиРегистры и флаги не изменяются.

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

Рубрики
Учебный курс

Учебный курс. Урок 7. Системы счисления

Эта статья по большей части для совсем начинающих. Если вы хорошо разбираетесь в системах счисления, можете обратить внимание лишь на особенности синтаксиса ассемблера FASM в конце статьи. На самом деле процессор работает только с двоичными числами, состоящими из единиц и нулей В виде двоичных чисел хранятся и обрабатываются все данные и команды любой программы. Однако, двоичная запись чисел слишком громоздка и неудобна для […]

Рубрики
Учебный курс

Учебный курс. Урок 6. Hello, world!

В этой части наконец-то напишем долгожданный «Hello, world!». Теперь почти всё должно быть понятно. Откроем в текстовом редакторе новый файл и сохраним его как hello.asm в директории C:\fasm. Для начала необходимо с помощью директивы db объявить строку, содержащую сообщение «Hello, word!». Лучше сделать это в конце программы, за последней командой, иначе процессор может принять строку за код […]

Рубрики
Учебный курс

Учебный курс. Урок 5. Директивы объявления данных

Практически любая программа кроме машинных команд содержит также какие-то данные. Например, числа, текстовые строчки, идентификаторы, различные ресурсы и т.д. Данные могут быть как константами, не меняющими своё значение во время выполнения программы, так и переменными, в которых хранятся всякие промежуточные результаты. Прежде всего нужно научиться объявлять данные в программе. Для этого в ассемблере существуют директивы объявления данных. Размер(в байтах) Объявление Резервирование 1 db […]