После того, как мы изучили механизм представления и обработки чисел процессором, самое время начать знакомство с инструкциями. Ну а к самым простым инструкциям в ассемблере безусловно относятся мнемоники для сложения и вычитания чисел — 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:
1 2 3 4 5 6 7 8 9 10 11 12 | jmp start x dw 56767 y dw 32000 z dd ? start: mov ax,[x] mov bx,[y] add ax,bx mov word[z],ax ;Сохранение младшей части результата xor ax,ax ;Обнуление ax adc ax,0 ;Если CF=1, он будет перенесен в регистр ax mov word[z+2],ax ;Сохранение старшей части результата |
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:
1 2 3 | mov al,7 mov ah,100 add al,ah ;al = 107; sf=0, zf=0, cf=0 (нет переполнения) |
Со школьной скамьи нас учили, что у чисел бывают отрицательные значения. Дело выглядело просто, записываешь число на бумаге, рисуешь черточку слева и все – положительное число превратилось в отрицательное. Для арифметической операции нужно от положительного числа отнять модуль отрицательного числа. К сожалению, такой подход совершенно не приемлем для машинных вычислений, потому что процессор не разделяет […]
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 используется, чтобы произвести задержку в исполнении или зарезервировать место в коде памяти.
Эта статья по большей части для совсем начинающих. Если вы хорошо разбираетесь в системах счисления, можете обратить внимание лишь на особенности синтаксиса ассемблера FASM в конце статьи. На самом деле процессор работает только с двоичными числами, состоящими из единиц и нулей В виде двоичных чисел хранятся и обрабатываются все данные и команды любой программы. Однако, двоичная запись чисел слишком громоздка и неудобна для […]
В этой части наконец-то напишем долгожданный «Hello, world!». Теперь почти всё должно быть понятно. Откроем в текстовом редакторе новый файл и сохраним его как hello.asm в директории C:\fasm. Для начала необходимо с помощью директивы db объявить строку, содержащую сообщение «Hello, word!». Лучше сделать это в конце программы, за последней командой, иначе процессор может принять строку за код […]
Практически любая программа кроме машинных команд содержит также какие-то данные. Например, числа, текстовые строчки, идентификаторы, различные ресурсы и т.д. Данные могут быть как константами, не меняющими своё значение во время выполнения программы, так и переменными, в которых хранятся всякие промежуточные результаты. Прежде всего нужно научиться объявлять данные в программе. Для этого в ассемблере существуют директивы объявления данных. Размер(в байтах) Объявление Резервирование 1 db […]