Aprender / Lição 11

Seu primeiro pequeno programa

Lição 11 de 12Iniciante12 min
Laboratório · 11 / 12

Pequeno desafio

Seu robô-guia

Começando do zero, calcule 5 + 3 − 2 em RAX e deixe uma cópia do resultado em RBX.

Blocos

Seu programa

0 instruções

Seu primeiro passo começa aqui

    Resultado

    PROCESSADORx86-64
    RAX64 bits—
    RBX64 bits—
    RCX64 bits—

    Aguardando suas instruções

    ZF · indicador de zero—

    Simulador didático · blocos equivalem a instruções Intel/NASM. Não executa Assembly nativo.

    Entender melhor

    Você combinou quatro instruções diferentes. RBX guarda uma cópia que não depende de mudanças futuras em RAX.

    Este laboratório modela MOV, ADD, SUB, CMP, saltos de igualdade e pilha. Os registradores começam sem valor; a aritmética usa 64 bits sem sinal. Só ZF é representada, e cada execução recomeça do início. Repetições param após 200 passos. Não simula memória, outras flags, chamadas ao Linux ou um processador completo.

    Consultar a lição completa
    Entender melhor · Seu primeiro pequeno programa
    O que você vai aprender

    Ler um programa completo que calcula um valor e termina no Linux.

    Juntando as peças

    Vamos calcular 5 + 3 − 2 e usar o resultado, 6, como código de saída. Um código de saída é um número devolvido ao sistema operacional quando o programa termina. Ele não é texto mostrado na tela.

    Este é um programa x86-64 para Linux, escrito na sintaxe Intel do NASM. Não precisa executá-lo para fazer o exercício. A plataforma não monta nem executa Assembly.

    O sistema operacional entra em cena

    A diretiva SECTION .text indica a seção de código. GLOBAL _start torna o rótulo _start visível ao vinculador. Um rótulo dá nome a uma posição do programa; _start é a entrada usada neste exemplo.

    SYSCALL solicita um serviço ao Linux. Na interface de chamadas de sistema Linux x86-64, RAX contém o número do serviço; 60 corresponde a exit. RDI leva o primeiro argumento, neste caso o código de saída. Esse uso não é universal em outros sistemas.

    Um exemplo, passo a passo

    Exemplo comentadox86-64 · Intel / NASM · Linux
    ; x86-64 · Intel / NASM · Linux
    section .text
    global _start
    
    _start:
        mov rax, 5    ; começa com 5
        add rax, 3    ; soma: 8
        sub rax, 2    ; resultado: 6
        mov rdi, rax  ; salva 6 como código de saída
        mov rax, 60   ; serviço exit do Linux x86-64
        syscall       ; pede ao sistema para encerrar

    Entendendo cada passo

    1. As três operações deixam RAX com 6.
    2. MOV RDI, RAX copia 6 antes de RAX receber o número 60.
    3. SYSCALL usa RAX = 60 e RDI = 6 para encerrar. O programa não imprime 6.
    4. Para experimentar fora do site, em Linux x86-64 com NASM e GNU ld: nasm -f elf64 exemplo.asm -o exemplo.o; ld exemplo.o -o exemplo; ./exemplo; echo $?. Os comandos são referência de uso, não um registro de execução.
    Para guardar

    Uma conta e uma chamada ao sistema são coisas diferentes. Salve o resultado antes de reutilizar o registrador.

    Revisão complementar

    Previsão de resultado

    Qual código de saída este programa solicita ao Linux?

    Escolha uma resposta

    Marcação opcional, salva apenas neste navegador. Clique novamente para desfazer.