Для сложения применяется инструкция add, которая принимает два операнда, складывает их и помещаем результат во второй операнд. Для разных типов данных есть свои варианты инструкции add
addq: для сложения 64-разрядных чисел
addl: для сложения 32-разрядных чисел
addw: для сложения 16-разрядных чисел
addb: для сложения 8-разрядных чисел
Сложим два числа:
.globl _start .text _start: movq $11, %rcx # RCX = 11 movq $22, %rdi # RDI = 11 addq %rcx, %rdi # RDI = RCX + RDI = 11 + 22 = 33 movq $60, %rax # RAX = 60 syscall
Здесь инструкция addq %rcx, %rdi
складывает значения регистров RCX и RDI и помещает результат в регистр RDI.
Для вычитания применяется инструкция sub, которая принимает два операнда, вычитает из второго операнда первый операнд и помещаем результат во второй операнд. Для разных типов данных есть свои варианты инструкции sub
subq: для вычитания 64-разрядных чисел
subl: для вычитания 32-разрядных чисел
subw: для вычитания 16-разрядных чисел
subb: для вычитания 8-разрядных чисел
Вычбтем одно число из другого:
.globl _start .text _start: movq $11, %rcx # RCX = 11 movq $55, %rdi # RDI = 55 subq %rcx, %rdi # RDI = RDI - RCX= 55 - 11 = 44 movq $60, %rax # RAX = 60 syscall
Здесь инструкция subq %rcx, %rdi
вычитает из регистра RDI число из регистра RCX и помещает результат в регистр RDI.
Поскольку увеличение на 1 и уменьшение на 1 являются распространенными операция, то для них предусмотрены отдельные инструкции - inc (для увеличения на 1) и dec (уменьшение на 1). Для чисел разных разрядностей определены свои виды инструкций, которые добавляют определенный суффикс - q (64-разрядные чиспа), l (32-разрядные), w (16-разрядные), b (8-разрядные). Эти инструкции принимают только один операнд, значение которого уменьшается/увеличивается:
.globl _start .text _start: movq $4, %rdi incq %rdi # RDI = RDI + 1= 4 + 1 = 5 movq $60, %rax # RAX = 60 syscall