Сложение и вычитание

Последнее обновление: 23.09.2023

Сложение

Для сложения применяется инструкция 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

Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850