Montagem - Sintaxe Básica
Um programa de montagem pode ser dividido em três seções -
o data seção,
o bss seção, e
o text seção.
A seção de dados
o dataseção é usada para declarar dados ou constantes inicializados. Esses dados não mudam em tempo de execução. Você pode declarar vários valores constantes, nomes de arquivo ou tamanho do buffer, etc., nesta seção.
A sintaxe para declarar a seção de dados é -
section.data
A seção bss
o bssseção é usada para declarar variáveis. A sintaxe para declarar a seção bss é -
section.bss
A seção de texto
o textseção é usada para manter o código real. Esta seção deve começar com a declaraçãoglobal _start, que informa ao kernel onde a execução do programa começa.
A sintaxe para declarar a seção de texto é -
section.text
global _start
_start:
Comentários
O comentário da linguagem assembly começa com um ponto e vírgula (;). Ele pode conter qualquer caractere imprimível, incluindo espaços em branco. Pode aparecer em uma linha por si só, como -
; This program displays a message on screen
ou, na mesma linha junto com uma instrução, como -
add eax, ebx ; adds ebx to eax
Declarações da linguagem assembly
Os programas de linguagem assembly consistem em três tipos de declarações -
- Instruções executáveis ou instruções,
- Diretivas Assembler ou pseudo-ops, e
- Macros.
o executable instructions ou simplesmente instructionsdiga ao processador o que fazer. Cada instrução consiste em umoperation code(Código de operação). Cada instrução executável gera uma instrução em linguagem de máquina.
o assembler directives ou pseudo-opsdiga ao montador sobre os vários aspectos do processo de montagem. Eles não são executáveis e não geram instruções em linguagem de máquina.
Macros são basicamente um mecanismo de substituição de texto.
Sintaxe de declarações da linguagem Assembly
As instruções da linguagem assembly são inseridas uma instrução por linha. Cada declaração segue o seguinte formato -
[label] mnemonic [operands] [;comment]
Os campos entre colchetes são opcionais. Uma instrução básica tem duas partes, a primeira é o nome da instrução (ou o mnemônico), que deve ser executada, e a segunda são os operandos ou parâmetros do comando.
A seguir estão alguns exemplos de declarações típicas de linguagem assembly -
INC COUNT ; Increment the memory variable COUNT
MOV TOTAL, 48 ; Transfer the value 48 in the
; memory variable TOTAL
ADD AH, BH ; Add the content of the
; BH register into the AH register
AND MASK1, 128 ; Perform AND operation on the
; variable MASK1 and 128
ADD MARKS, 10 ; Add 10 to the variable MARKS
MOV AL, 10 ; Transfer the value 10 to the AL register
O Programa Hello World em Assembleia
O seguinte código de linguagem assembly exibe a string 'Hello World' na tela -
section .text
global _start ;must be declared for linker (ld)
_start: ;tells linker entry point
mov edx,len ;message length
mov ecx,msg ;message to write
mov ebx,1 ;file descriptor (stdout)
mov eax,4 ;system call number (sys_write)
int 0x80 ;call kernel
mov eax,1 ;system call number (sys_exit)
int 0x80 ;call kernel
section .data
msg db 'Hello, world!', 0xa ;string to be printed
len equ $ - msg ;length of the string
Quando o código acima é compilado e executado, ele produz o seguinte resultado -
Hello, world!
Compilando e vinculando um programa de montagem em NASM
Certifique-se de ter definido o caminho de nasm e ldbinários em sua variável de ambiente PATH. Agora, execute as seguintes etapas para compilar e vincular o programa acima -
Digite o código acima usando um editor de texto e salve-o como hello.asm.
Certifique-se de que você está no mesmo diretório onde salvou hello.asm.
Para montar o programa, digite nasm -f elf hello.asm
Se houver algum erro, você será informado sobre isso neste estágio. Caso contrário, um arquivo objeto do seu programa denominadohello.o Será criado.
Para vincular o arquivo objeto e criar um arquivo executável chamado hello, digite ld -m elf_i386 -s -o hello hello.o
Execute o programa digitando ./hello
Se você fez tudo corretamente, será exibido 'Olá, mundo!' na tela.