Operações Aritméticas Básicas em Assembly NASM: add, sub, inc e dec
A base de qualquer programa computacional é a capacidade de realizar cálculos. Em Assembly, as operações aritméticas são realizadas por um conjunto de instruções diretas e eficientes. Vamos explorar as quatro mais essenciais: adição, subtração, incremento e decremento.
Adição com add
Para a adição, a instrução utilizada é a add. Ela funciona de maneira análoga ao operador += em linguagens como C++ ou Java, somando dois valores e armazenando o resultado no primeiro operando.
Sua sintaxe é:
add destination, source
Esta instrução executa a operação: destination = destination + source. Assim como na instrução mov, os operandos podem ser uma combinação de registradores, valores imediatos (constantes) ou endereços de memória, desde que sigam as regras de compatibilidade de tamanho.
Vejamos um exemplo simples somando dois números:
mov rdi, 22
mov rsi, 11
add rdi, rsi ; rdi = rdi + rsi = 22 + 11 = 33Neste código, add rdi, rsi soma o valor contido em rsi (11) ao valor de rdi (22). O resultado, 33, é então armazenado de volta no registrador de destino, rdi.
Subtração com sub
Para a subtração, a instrução correspondente é a sub. De forma similar ao operador -=, ela subtrai o segundo operando do primeiro e armazena o resultado também no primeiro operando.
Sua sintaxe é:
sub destination, source
A operação realizada é: destination = destination - source.
Vamos subtrair um número do outro:
mov rdi, 23
mov rsi, 11
sub rdi, rsi ; rdi = rdi - rsi = 23 - 11 = 12Aqui, a instrução sub rdi, rsi subtrai o valor de rsi (11) do valor de rdi (23), e o resultado, 12, é armazenado de volta em rdi.
Incremento com inc e Decremento com dec
Aumentar (i++) ou diminuir (i--) um valor em 1 são, possivelmente, as operações mais frequentes em programação, essenciais para contadores e laços de repetição. Por serem tão comuns, a arquitetura x86-64 oferece instruções dedicadas e altamente otimizadas para elas: inc (incremento) e dec (decremento).
Utilizar inc e dec é mais eficiente do que add reg, 1 ou sub reg, 1, pois elas geram um código de máquina menor e podem ser executadas mais rapidamente pelo processador. Elas aceitam apenas um operando: o valor a ser modificado.
Para realizar um incremento (somar 1):
mov rdi, 23
inc rdi ; rdi agora é 24Para realizar um decremento (subtrair 1):
mov rdi, 23
dec rdi ; rdi agora é 22Resumo
- A instrução
addsoma dois operandos e armazena o resultado no primeiro. - A instrução
subsubtrai o segundo operando do primeiro e armazena o resultado no primeiro. - A instrução
incé uma forma otimizada de aumentar o valor de um operando em 1. - A instrução
decé uma forma otimizada de diminuir o valor de um operando em 1.