SlideShare uma empresa Scribd logo
1 de 205
Baixar para ler offline
Paradigmas de Programação
Ronaldo Ramos
Instituto Federal do Ceará
23 de julho de 2023
Programa do Curso
Noções Sobre Paradigmas de Programação
1 Paradigmas e Níveis de Abstração
2 Paradigma 1 - Imperativo
3 Paradigma 2 - Declarativo
4 Paradigma 3 - Misto
5 Baseada em Linguagem Natural (Quem viver Verá!!!)
Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 2 / 204
Programa do Curso
Paradigma Imperativo
1 Abstração Simples - Linear
2 Programação Estruturada
3 Programação Orientada a Objetos
4 Programação Por Aspectos
Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 3 / 204
Programa do Curso
Paradigma Declarativo
1 Programação em Lógica
2 Programação Funcional
Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 4 / 204
Importância da Linguagem
"Os limites da minha língua são os limites do meu mundo.”
Ludwig Wittgenstein
Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 5 / 204
Linguagens de Programação a Serem Usadas
Assembly, Basic, Pascal, Ruby, Prolog, Haskel, Lisp, Python, etc etc
Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 6 / 204
Paradigmas
que é um paradigma?
Um paradigma é um princípio ou elemento que funciona como um
pressuposto formando um modelo ou perspectiva para resolver problemas
ou abordar uma determinada área do conhecimento. Na ciência da
computação, os paradigmas de programação definem a forma como os
programas são estruturados, organizados e construídos.
Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 7 / 204
Máquina de Turing
https://turingmachine.io/
Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 8 / 204
Paradigma Imperativo
(Diga-me como fazer...)
Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 9 / 204
Linguagem de Máquina
Formato do Arquivo.
Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 10 / 204
Dados e Instruções
Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 11 / 204
Primeira Abstração Mnemônicos e Montador/Tradutor
Mnemônicos e operadores aritméticos são usados para construir textos
equivalentes ao código de máquina porém bem mais fácil de entender.
Surge a linguagem Assembly ou linguagem de montagem. Usada para
’montar’ programas.
Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 12 / 204
Elementos Para Programação em Assembly
1 Arquitetura do Processador. registradores de propósito geral,
registradores de status, registradores de ponteiro de instrução, etc.),
tamanhos de palavra (por exemplo, 8 bits, 16 bits, 32 bits, 64 bits) e
conjunto de instruções específicas.
2 Memória: Organização da memória (páginas e segmentos), como a
distinção entre memória de código (onde as instruções são
armazenadas) e memória de dados (onde os dados são armazenados).
Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 13 / 204
Elementos Para Programação em Assembly
1 Pilha: Pilha de execução (stack) e como ela é usada para armazenar
dados e endereços de retorno durante a execução de sub-rotinas
(funções).Registradores de ponteiros de pilha (stack pointers).
2 Interrupções e Modos de Execução: Interrupções e modos de
execução disponíveis no processador(modo usuário, modo kernel,
etc.).
Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 14 / 204
Elementos Para Programação em Assembly
1 Entrada e Saída
2 Regras de Codificação
Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 15 / 204
Porque Usar Assembly?
1 Otimização de Desempenho
2 Acesso a Todos os Recursos do Hardware
3 Programação de Sistemas Embarcados
4 Comunicação Direta com o Hardware
5 Minimização do Tamanho do Programa Executável
6 Depuração em Baixo Nível
7 Estudo e Teste das Funcionalidades da Arquitetura do Hardware
8 Integração de Códigos em Baixo Nível
Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 16 / 204
Uma Breve Introdução ao Assembly
Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 17 / 204
O que vamos precisar
1 Um compilador ou montador (assembler)
2 Um link editor ou editor de ligação
3 Um editor de texto
Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 18 / 204
Assemblers (Montadores/Compiladores)
1 NASM (Netwide Assembler): O NASM é um assembler de propósito
geral que suporta várias arquiteturas, incluindo x86 e x86-64. É
amplamente utilizado em sistemas Linux e Windows.
2 MASM (Microsoft Macro Assembler): Desenvolvido pela Microsoft, é
amplamente utilizado para desenvolvimento de software para sistemas
Windows. Suporta arquiteturas x86 e x64.
3 FASM (Flat Assembler): O FASM é um assembler de código aberto
que suporta várias arquiteturas, incluindo x86 e x86-64. Ele é
conhecido por seu tamanho pequeno e desempenho rápido.
4 TASM (Turbo Assembler): Desenvolvido pela Borland, era muito
popular no passado para desenvolvimento de software para MS-DOS e
Windows. Ainda é usado em alguns cenários legados.
Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 19 / 204
Assemblers - continuação
1 GAS (GNU Assembler): O GAS é o assembler padrão da GNU
Compiler Collection (GCC) e é usado principalmente em projetos de
código aberto e sistemas Unix-like, como o Linux.
2 Keil A51 e A251: Compiladores assemblers específicos da Keil para
arquiteturas 8051 e 8052, amplamente utilizados para
desenvolvimento de sistemas embarcados.
3 ASM51: Assembler específico da Intel para a arquitetura 8051.
4 ARM Assemblers: Há vários compiladores assemblers específicos para
as diversas arquiteturas da família ARM, como ARMASM (para
ARM32), AARCH64 (para ARM64) e outros.
5 AVR Assemblers: Compiladores assemblers específicos para a
arquitetura AVR utilizada em microcontroladores, como o avr-as da
GNU Binutils.
Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 20 / 204
Editores de Ligação (linkers)
1 GNU Linker (ld): O GNU Linker é o linker padrão usado na maioria
dos sistemas operacionais baseados em Unix, como Linux. É uma
parte importante das ferramentas GNU Binutils.
2 Microsoft Linker (link): O Microsoft Linker é o linker padrão para
sistemas Windows e faz parte do Microsoft Visual Studio e Microsoft
Developer Tools.
3 Apple ld: Esse linker é usado em sistemas macOS e iOS para fazer a
ligação de programas objetos.
4 Gold Linker: O Gold é um linker de alto desempenho desenvolvido
como uma alternativa mais rápida ao GNU Linker (ld) para sistemas
Linux.
Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 21 / 204
Editores de Ligação (linkers) - Continuação
1 LLD (LLVM Linker): O LLD é o linker do projeto LLVM e é usado
para sistemas que utilizam o LLVM como infraestrutura de
compilação, como algumas distribuições Linux.
2 BFD (Binary File Descriptor) Linker: O BFD é uma biblioteca de
manipulação de formatos de arquivo binário que inclui funcionalidades
de ligação.
3 SunOS/Solaris Linker: Usado em sistemas Solaris e outros sistemas
baseados em SunOS.
4 OpenVMS Linker: Usado no sistema operacional OpenVMS.
Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 22 / 204
Estrutura de Um Programa em Assembly
Um programa é dividido em seções tais como:
1 Seção de Dados (Data Section): Nesta seção, são definidas as
variáveis e constantes utilizadas no programa. As declarações de
dados podem incluir reservas de memória para armazenar valores ou
informações, bem como definições de constantes.
2 Seção de BSS (Block Started by Symbol): Nesta seção, são
declaradas variáveis que ocuparão espaço na memória, mas não são
inicializadas com um valor específico. Elas serão inicializadas com
zero quando o programa começar a ser executado.
3 Seção de Texto (Text Section ou Code Section): Essa é a parte
principal do programa, onde o código assembly é colocado. Aqui
estão as instruções que serão executadas pelo processador. É onde a
lógica do programa é implementada.
Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 23 / 204
Seções de Um programa Assembly - Continuação
1 Seção de Inicialização (Initialization Section): Algumas arquiteturas
de processadores possuem uma seção especial de inicialização onde é
colocado o código responsável por configurar o ambiente antes de
iniciar a execução do programa principal.
2 Seção de Importação e Exportação (Import and Export Section): Essa
seção é usada em sistemas operacionais que suportam bibliotecas
compartilhadas (shared libraries) ou DLLs (Dynamic Link Libraries).
Ela contém informações sobre as funções que o programa usa de
outras bibliotecas (importação) e funções que o programa
disponibiliza para serem usadas por outros programas (exportação).
3 Seção de Tabelas (Tables Section): Em alguns programas,
especialmente em sistemas embarcados, são utilizadas seções de
tabelas para armazenar dados como vetores, matrizes, e outras
estruturas de dados pré-definidas.
Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 24 / 204
Convenções de Sintaxes
1 Sintaxe Intel (ou x86): A sintaxe Intel é comumente usada em
processadores da arquitetura x86, como os fabricados pela Intel e
AMD. Nessa sintaxe, as operações são frequentemente escritas com o
nome do mnemônico seguido pelos operandos, separados por vírgulas.
Por exemplo: MOV AX, 42 ou ADD BX, AX.
2 Sintaxe AT&T (ou GNU): A sintaxe AT&T é comumente usada no
GNU Assembler (GAS) e em algumas ferramentas relacionadas ao
projeto GNU. Nessa sintaxe, os operandos são precedidos por sinais
de cifrão ($) para imediatos e por porcentagens (%) para endereços
de memória. Por exemplo: MOV $42, %AX ou ADD %AX, %BX.
3 Sintaxes ARM, MIPS, SPARC, etc.
Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 25 / 204
Declarações em Assembly
1 Instruções ou instruções executáveis,
2 Diretivas de montadora ou pseudo-ops, e
3 Macros.
Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 26 / 204
Sintaxe Básica (x86)
1 [label] mnemônico [operandos] [ ;comentários]
Exemplos:
1 INC COUNT ; Incrementar a variável de memória
COUNT.
2 MOV TOTAL , 48 ; Transferir o valor 48 para a
variável de memória TOTAL
3 ADD AH , BH ; Adicionar o conteúdo do registrador
BH ao registrador AH
4 AND MASK1 , 128 ; Realizar uma operação AND (E
lógico) entre a variável MASK1 e 128.
5 ADD MARKS , 10 ; Adicionar 10 à variável MARKS.
6 MOV AL , 10 ; Transferir o valor 10 para o
registrador AL.
Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 27 / 204
Tipos de Declarações
1 Comentários - Ignorados pelo Montador
2 Elementos de Formatação (Diretivas, Sinais de Pontuação, etc). -
Usados para formatação geral do executável
3 Mnemônicos de Operações - Transformados em Códigos de
Operações (opcodes) da máquina alvo (ex. x86).
Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 28 / 204
’Iniciando 001_start.asm’
1 ; nosso primeiro programa em assembly
2 ; adicionar comentários
3 global _start ; define o ponto de início de execução
do programa
4 _start:
5 mov eax ,1 ; coloca o 1 no reg. eax (proposito
geral)
6 ; neste caso o eax fornce o código
que identifica uma system call
7 ; nesta caso a system call sera
EXIT(X) onde o X será o valor no
registrador ebx
8 mov ebx ,42 ; coloca o valor 42 no registrador de
propósito geral ebx , e
9 int 0x80 ; chama uma iterrupção do kernel
Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 29 / 204
Para Compilar
nasm -f elf 001_start.asm -o start.o
Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 30 / 204
Para Fazer a Ligação
ld -m elf_i386 -s -o start start.o
Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 31 / 204
Verificando o Código de Saída
echo $?
Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 32 / 204
Olhando para o Executável ’desassemblado’
objdump -d ./start
./start: file format elf32-i386
Disassembly of section .text:
08049000 .text:
8049000: b8 01 00 00 00 mov $0x1,%eax
8049005: bb 2a 00 00 00 mov $0x2a,%ebx
804900a: cd 80 int $0x80
Obs.
No caso acima temos apenas um segmento (.text). Para visualizar o
arquivo usar comando hexeditor ./start
O assembly do lado direito está na sintaxe AT&T
Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 33 / 204
O que é ELF (Executable and Linkable Format)
É um formato de arquivo binário amplamente utilizado em sistemas
operacionais Unix e Unix-like para representar executáveis, bibliotecas
compartilhadas e arquivos de objeto resultantes de compilação ou
montagem de código-fonte. O formato ELF é uma especificação
padronizada que define a estrutura interna dos arquivos executáveis e
objetos, permitindo que diferentes componentes de um programa (código,
dados, símbolos, seções, etc.) sejam organizados e interligados de maneira
consistente. Ele foi originalmente desenvolvido para a plataforma Unix
System V, mas foi adotado amplamente em outros sistemas Unix e em
sistemas operacionais semelhantes, como o Linux.
Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 34 / 204
Opções do Linker
opção -m (formatos)
1 elf_i386: Especifica que o formato do arquivo de saída será o ELF
(Executable and Linkable Format) para a arquitetura x86 (32 bits).
2 elf_x86_64: Especifica que o formato do arquivo de saída será o ELF
para a arquitetura x86-64 (64 bits).
3 som: Especifica que o formato do arquivo de saída será o formato
SOM (System Object Module), que é um formato mais antigo usado
em algumas arquiteturas e sistemas operacionais.
4 etc
Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 35 / 204
Opções do Linker
-s (limpeza)
1 usada para instruir o linker a remover informações de símbolos não
necessárias do arquivo executável final
Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 36 / 204
Segundo Programa 002_exit.asm
1 ; nosso segundo programa em assembly
2 global _start
3 _start:
4 mov eax ,1 ; coloca o valor 1 no registrador eax
(proposito geral)
5 mov ebx ,42 ; coloca o valor 42 no registrador de
ropoosito geral ebx , e
6 add ebx ,10 ; soma o valor 10 ao 42 que está no
ebx e coloca no próprio ebx
7 int 0x80 ; chama uma iterrupção para que o
kernel execute uma system call
Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 37 / 204
Segmentação da Memória
Todo programa segue um ’modelo de memória’ que é efetivamente
implantada na memória física do computador. Este modelo associa seções
do programa aos segmentos:
1 Segmento de dados - É representado por .data e pelo .bss. A seção
.data é declara a região de memória para os dados. Esta seção
permanece estática durante todo o programa.
2 Segmento de código - É representado por .text. Isso define uma área
na memória para os códigos de instrução. Esta também é uma área
fixa.
3 Stack - Este segmento contém valores de dados passados para
funções e procedimentos dentro do programa.
Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 38 / 204
Registradores /Registros
1 Registros gerais
2 Registros de controle
3 Registros do segmento
Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 39 / 204
Registradores Gerais
1 Registradores de Dados
2 Registradores de Ponteiros
3 Registradores de Índices
Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 40 / 204
Registradores de Dados
1 Como registros completos de dados de 32 bits: EAX, EBX, ECX,
EDX.
2 Metades dos registros de 32 bits podem ser usadas como quatro
registros de dados de 16 bits: AX, BX, CX e DX.
3 Metades inferiores e superiores dos quatro registros acima
mencionados de 16 bits podem ser usados como oito registros de
dados de 8 bits: AH, AL, BH, BL, CH, CL, DH e DL.
Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 41 / 204
Registradores
Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 42 / 204
Operações Aritméticas com Registradores
1 AX é o acumulador primário; é usado em entrada/saída e na maioria
das instruções aritméticas. Por exemplo, na operação de
multiplicação, um operando é armazenado em EAX ou AX ou AL de
acordo com o tamanho do operando.
2 O BX é conhecido como registro base, pois pode ser usado em
endereçamento indexado.
3 CX é conhecido como o registro de contagem, como o ECX, CX
registra armazenar a contagem de loop em operações iterativas.
4 DX é conhecido como o registro de dados. Também é usado em
operações de entrada/saída. Também é usado com registro AX junto
com DX para operações de multiplicação e divisão envolvendo
grandes valores
Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 43 / 204
Ponteiros
1 Indicador de instrução (IP) - O registro IP de 16 bits armazena o
endereço de deslocamento da próxima instrução a ser executada. O
IP em associação com o registro CS (como CS:IP) fornece o endereço
completo da instrução atual no segmento de código.
2 Stack Pointer (SP) - O registro de SP de 16 bits fornece o valor de
deslocamento dentro da pilha do programa. SP em associação com o
registro SS (SS:SP) refere-se a ser posição atual de dados ou
endereço dentro da pilha de programas.
3 Ponteiro base (BP) - O registro de BP de 16 bits ajuda
principalmente na referência às variáveis de parâmetros passadas para
uma subrotina. O endereço no registro SS é combinado com o
deslocamento em BP para obter a localização do parâmetro. A BP
também pode ser combinada com DI e SI como registro base para
endereçamento especial
Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 44 / 204
Ponteiros
Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 45 / 204
Registradores de Índices
Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 46 / 204
Registradores de Controle
O registrador do ponteiro de instrução de 32 bits e o registrador de flags
de 32 bits combinados são considerados como os registros de controle.
Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 47 / 204
Flags (Sinalizadores)
1 Flag de estouro (OF) - Indica o estouro de um bit de alta ordem (bit
mais à esquerda) de dados após uma operação aritmética.
2 Flag de direção (DF) - Determina a direção esquerda ou direita para
mover ou comparar dados de sequência. Quando o valor do DF é 0, a
operação de sequência toma a direção da esquerda para a direita e
quando o valor é definido para 1, a operação de sequência toma
direção da direita para a esquerda.
3 Flag de interrupção (IF) - Ele determina se as interrupções externas,
como a entrada do teclado, etc., devem ser ignoradas ou processadas.
Desativa a interrupção externa quando o valor é 0 e permite
interrupções quando definido para 1.
4 Trap Flag (TF) - Permite configurar o funcionamento do processador
no modo de etapa única. O programa DEBUG que usamos define a
bandeira da armadilha, para que pudéssemos passar pela execução
uma instrução de cada vez.
Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 48 / 204
Flags - Continuação
1 Sinalização (SF) - Mostra o sinal do resultado de uma operação
aritmética. Este flag é definido de acordo com o sinal de um item de
dados após a operação aritmética. O sinal é indicado pela alta ordem
da parte mais esquerda. Um resultado positivo limpa o valor de SF
para 0 e o resultado negativo o coloca em 1.
2 Flag Zero (ZF) - Indica o resultado de uma operação aritmética ou de
comparação. Um resultado não zero libera a bandeira zero para 0, e
um resultado zero o coloca em 1.
3 Flag auxiliar de transporte (AF) - Contém o transporte do bit 3 ao bit
4 após uma operação aritmética; usado para aritmética especializada.
O AF é definido quando uma operação aritmética de 1 byte causa um
transporte do bit 3 para o bit 4.
Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 49 / 204
Flags - Continuação
1 Flag de Paridade (PF) - Indica o número total de 1 bits no resultado
obtido a partir de uma operação aritmética. Um número par de 1 bits
limpa a bandeira de paridade para 0 e um número ímpar de 1 bits
define a bandeira de paridade para 1.
2 Carry Flag (CF) - Contém o transporte de 0 ou 1 de um bit de alta
ordem (mais à esquerda) após uma operação aritmética. Ele também
armazena o conteúdo de última parte de uma operação de turno ou
rotação.
Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 50 / 204
Flags
Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 51 / 204
Registradores de Segmento
1 Segmento de código - Contém todas as instruções a serem
executadas. Um registro do segmento de código de 16 bits ou registro
CS armazena o endereço inicial do segmento de código.
2 Segmento de Dados - Contém dados, constantes e áreas de trabalho.
Um registro do segmento de dados de 16 bits ou o registro DS
armazena o endereço inicial do segmento de dados.
3 Segmento de pilha - Contém dados e endereços de devolução de
procedimentos ou subrotinas. É implementado como uma estrutura
de dados ’stack’. O registro do Segmento stack ou o registro SS
armazena o endereço inicial da pilha.
Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 52 / 204
Extras
Além dos registros de DS, CS e SS, existem outros registros extras do
segmento - ES (segmento extra), FS e GS, que fornecem segmentos
adicionais para armazenamento de dados.
Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 53 / 204
Hora do Hello World, ou melhor, queima***
003_queima.asm
1 section .text
2 global _start ; deve ser declarado para o linker
(ld)
3 _start: ; ponto de entrada para o linker
4 mov edx ,len ; comprimento da mensagem em edx
5 mov ecx ,msg ; mensagem a ser escrita
6 mov ebx ,1 ; descritor de arquivo (stdout)
7 mov eax ,4 ; chamada do sistema (sys_write)
8 int 0x80 ; chama o kernel
9
10 mov eax ,1 ; chamada do sistema (sys_exit)
11 int 0x80 ; chama o kernel
12
13 section .data
14 msg db ’Queima *** do IFCe!’, 0xa ; string
15 len equ $ - msg ; comprimento da string
Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 54 / 204
Registradores de 64 Bits
De uso geral:
1 RAX, RBX, RCX, RDX: Registradores de uso geral de 64 bits que são
usados para armazenar dados e realizar operações aritméticas.
2 RSI, RDI, RBP, RSP: Mais registradores de uso geral que também são
usados para manipulação de dados e endereçamento.
3 R8 - R15: Registradores adicionais de uso geral disponíveis em
arquiteturas de 64 bits. Eles são frequentemente usados para
armazenar valores temporários e parâmetros de função.
Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 55 / 204
Registradores de 64 Bits
Registradores de Ponto Flutuante
1 XMM0 - XMM15: Registradores de ponto flutuante de 128 bits. Eles
são usados para realizar operações de ponto flutuante em dados
individuais ou em vetores de dados.
Registradores de Vetor(SIM - Single Instruction Multiple Data)
1 YMM0 - YMM15: Registradores de vetor de 256 bits. Eles são
usados para executar instruções SIMD em dados vetoriais,
especialmente em operações de ponto flutuante de precisão única.
2 ZMM0 - ZMM31: Registradores de vetor de 512 bits. Eles são
encontrados em algumas arquiteturas avançadas de 64 bits e são
usados para realizar operações SIMD em dados vetoriais,
especialmente em operações de ponto flutuante de precisão dupla.
Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 56 / 204
Registradores de 64 Bits
Registradores de Controle
1 RFLAGS: Registrador de 64 bits que armazena diversas informações
de status e controle, como flags de condição e de controle de
interrupções.
2 RIP: Registrador de 64 bits que contém o endereço da próxima
instrução a ser executada (instruction pointer).
Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 57 / 204
Chamadas do Sistema (Linux) - Trap
1 Ponha o número da chamada ao Sistema no registrador EAX
2 Ponha os argumentos para a chamada no registrador EBX, ECX, etc
3 Chame a interrupção (80h).
4 O resultado estará no registrador EAX
Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 58 / 204
Exemplo de Chamada ao Sistema
1 mov eax ,1 ; número da chamada ao sistema(sys_exit)
2 int 0x80 ; chama o kernel
Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 59 / 204
Chamadas ao Sistema Linux
Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 60 / 204
Lista Completa de Linux System Calls
http://web.archive.org/web/20160303181025/http:
//docs.cs.up.ac.za/programming/asm/derick_tut/syscalls.html
Também podemos encontrar a lista no arquivo ’unistd.h’
Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 61 / 204
Imprimindo Mensagens - 004_ninestar
1 section .text
2 global _start
3 _start:
4 mov edx ,len ; comprimento da mensagem
5 mov ecx ,msg ; mensagem para escrever
6 mov ebx ,1 ; descritor do arquivo (stdout)
7 mov eax ,4 ; número da chamada ao sistema
(sys_write)
8 int 0x80 ; chama o kernel
9
10 mov edx ,9
11 mov ecx ,s2
12 mov ebx ,1
13 mov eax ,4
14 int 0x80
Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 62 / 204
Imprimindo Mensagens
1
2 mov edx ,l2
3 mov ecx ,msg2
4 mov ebx ,1
5 mov eax ,4
6 int 0x80
7
8 mov eax ,1 ; (sys_exit)
9 int 0x80 ; chama o kernel
10
11 section .data
12 msg db ’Imprimindo 9 asteriscos ’,0xa ; messagem
13 len equ $-msg ; Comprimento da mensagem
14 s2 times 9 db ’*’
15 msg2 db 0xa ; mudança de linha
16 l2 equ $ - msg2
Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 63 / 204
Operandos
A maioria das instruções de linguagem de montagem exigem operandos
para serem processadas. Um endereço de operando fornece a localização
onde os dados a serem processados são armazenados. Algumas instruções
não requerem operandos, enquanto algumas outras instruções podem
exigir um, dois ou três operandos
Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 64 / 204
Visualizando o Código Objeto
objdump -D 004_ninestar
Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 65 / 204
Endereçamento
1 Quando uma instrução requer dois operandos. O primeiro
normalmente representa o destino o qual poderá conter dados ou
localização de memória e o segundo operador é a fonte.
2 A fonte conterá dados a serem entregues (endereçamento imediato)
ou o endereço (no registrador ou na memória) dos dados. Geralmente
as fontes permanecem inalteradas após a operação.
Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 66 / 204
Modos de Endereçamento
1 Endereçamento de Registrados
2 Endereçamento Imediato
3 Endereçamento de Memória
Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 67 / 204
Endereçamento de Registrador
Neste modo o registrador contém o operando. Dependendo da instrução o
operador pode ser o primeiro, o segundo ou ambos os operandos. Exs:
MOV DX, TAX_RATE ; O registrador no primeiro operando
MOV COUNT, CX ; Registrador no Segundo operando
MOV EAX, EBX ; Ambos os operandos são registradores
Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 68 / 204
Endereçamento Imediato
O operando consiste em um valor constante ou uma expressão
BYTE_VALUE DB 150 ; Definido tipo chamado de BYTE_VALUE
WORD_VALUE DW 300 ; Definido tipo chamado de WORD_VALUE
ADD BYTE_VALUE, 65 ; Operando imediato 65
MOV AX, 45H ; Constante imediata 45H is transferida para AX
Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 69 / 204
Endereçamento Direto na Memória
Neste caso faz-se necessário o uso do segmento de dados. Esse uso é
lento. Para saber a localização exata do dado na memória precisamos do
endereço inicial do segmento o qual normalmente se encontra no
registrador DS e um valor de offset. Este offset é chamado de endereço
efetivo.
Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 70 / 204
Endereçamento Direto na Memória
O valor do offset é especificado diretamente como parte da instrução
normalmente indicado no nome da variável. O assembler calcula o valor do
offset e mantém uma tabela de símbolos que guarda os valores de offset de
todas as variáveis usadas no programa.
Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 71 / 204
Endereçamento Direto da Memória
Um dos operandos se refere a uma localização de memória e o outro
referencia o registrador.
ADD BYTE_VALUE, DL ; Põe o registrador em uma posição de memória
MOV BX, WORD_VALUE ; O registrador recebe o valor da memória
Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 72 / 204
Endereçamento Offset Direto
Este modo de endereçamento usa operadores aritméticos para modificar
um endereço.
Sejam os dados:
BYTE_TABLE DB 14, 15, 22, 45 ; Tabelas de bytes
WORD_TABLE DW 134, 345, 564, 123 ; Tabelas de words
As operações abaixo carregam dados da tabela nos registradores:
MOV CL, BYTE_TABLE[2] ; Pega o 3o elemento da tabela
BYTE_TABLE
MOV CL, BYTE_TABLE + 2 ; Pega o 3o elemento da tabela
BYTE_TABLE
MOV CX, WORD_TABLE[3] ; Pega o 4o elemento da tabela
WORD_TABLE
MOV CX, WORD_TABLE + 3 ; Pega o 4o elemento da tabela
WORD_TABLE
Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 73 / 204
Endereçamento indireto da Memória
Este modo utiliza a capacidade do endereçamento segment:offset.
Geralmente os registradores de base (EBX, EBP ou BX,BP) e os
registradores de índice (DI,SI) codificados entre colchetes são usados para
estes propósitos.
Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 74 / 204
Endereçamento Indireto da Memória
Este tipo de endereçamento é geralmente usado para variáveis contendo
vários elementos como matrizes que são armazenadas, digamos, no
registrador EBX.
A seguir vemos como acessar diferentes elementos das variáveis.
1 MY_TABLE TIMES 10 DW 0 ; Aloca 10 palavras
(word)(2 bytes) inicializadas com 0
2 MOV EBX , [MY_TABLE] ; Endereço efetivo de
MY_TABLE in EBX
3 MOV [EBX], 110 ; MY_TABLE [0] = 110
4 ADD EBX , 2 ; EBX = EBX +2
5 MOV [EBX], 123 ; MY_TABLE [1] = 123
Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 75 / 204
A Instrução MOV
1 MOV destino ,fonte
2 MOV register , register
3 MOV register , immediate
4 MOV memory , immediate
5 MOV register , memory
6 MOV memory , register
Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 76 / 204
Especificadores de Tipos
Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 77 / 204
Variáveis
Alocação de memória para variáveis inicializadas
nome_variável diretiva_definição valor_inicial
Exs.
1 choice DB ’y’
2 number DW 12345
3 neg_number DW -12345
4 big_number DQ 123456789
5 real_number1 DD 1.234
6 real_number2 DQ 123 .456
Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 78 / 204
Diretivas
Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 79 / 204
Entrada e Saída - 005_entsaida
1 ; segmento de dados
2 section .data
3 ; mensagem solicitando a entrada de um número
4 userMsg db ’Digite um numero: ’
5 ; comprimento da mensagem
6 lenUserMsg equ $-userMsg
7 dispMsg db ’Voce digitou: ’
8 lenDispMsg equ $-dispMsg
9
10 ;Dados não inicializados
11 section .bss
12 num resb 5
13
14 ; segmento de código
15 section .text
16 global _start
Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 80 / 204
Entrada e Saída - 005_entsaida
1 _start:
2 ; Mensagem para o usuário (prompt)
3 ; Observe a sequência dos registradores A - Numero
SYSCALL , B - Descritor ,
4 ; C - mensagem , D - Comprimento
5 mov eax , 4
6 mov ebx , 1
7 mov ecx , userMsg
8 mov edx , lenUserMsg
9 int 80h
10
11 ; Lê e armazena a entrada fornecida pelo usuário
12 mov eax , 3
13 mov ebx , 2
14 mov ecx , num
15 ;5 bytes (numerico , 1 para o sinal (-/+))
16 mov edx , 5
17 int 80h
Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 81 / 204
Entrada e Saída - 005_entsaida
1 ; Saída da mensagem ’voce digitou ’
2 mov eax , 4
3 mov ebx , 1
4 mov ecx , dispMsg
5 mov edx , lenDispMsg
6 int 80h
7 ; saída do número digitado
8 mov eax , 4
9 mov ebx , 1
10 mov ecx , num
11 mov edx , 5
12 int 80h
13 ; saída final
14 mov eax , 1
15 mov ebx , 0
16 int 80h
Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 82 / 204
Entrada e Saída - 006_mov
Chamadas a subrotinas são feitas com o comando call e saltos com o jmp.
Ver a listagem abaixo
1 section .data
2 nome db ’Mano Josuelito ’,0xa
3 lenUserMsg equ $-nome
4 newLineMsg db 0xa
5 newLineLen equ $-newLineMsg
6 section .text
7 global _start
8 _start:
9 ;Escrevendo o nome Manoel Josuelito
10 ;Comprimento da mensagem
11 mov edx ,lenUserMsg
12 ;Mensagem a ser escrita
13 mov ecx , nome
14 ;Descritor do arquivo (stdout)
15 mov ebx ,1
Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 83 / 204
Entrada e Saída - 006_mov
1 ;Chamada de Sistema
2 mov eax ,4
3 ;Chama o kernel
4 int 0x80
5 ;Muda o nome para ’Mary ’
6 mov [nome],dword ’Mary ’ ;dword
7 ;Escrevendo o nome
8 ;Comprimento
9 mov edx ,lenUserMsg
10 ;Mensagem a escrever
11 mov ecx ,nome
12 ;Descritor do Arquivo
13 mov ebx ,1
14 ;Chamada do sistema
15 mov eax ,4
16 ;Chama o kernel
17 int 0x80
Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 84 / 204
Entrada e Saída - 006_mov
1 ;chama subrotina
2 call _novaLinha
3 ;salta para saida
4 jmp _saida
5
6 _novaLinha:
7 mov edx ,newLineLen
8 mov ecx ,newLineMsg
9 mov ebx ,1
10 mov eax ,4
11 int 0x80
12 ret
13 _saida:
14 ; Chamada sys_exit
15 mov eax ,1
16 ;chama o kernel
17 int 0x80
Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 85 / 204
Dados
1 Bytes de characteres são armazenados com seus valores ascii em
hexadecimal
2 Valores decimais são automaticamente convertidos para o seu
equivalente de 16 bits e armazenados como números hexadecimal
3 Processadores usam ordenamento de bytes little-endian
4 Números negativos são convertidos para sua representação em
complemento de 2
5 Números em ponto flutuante são representados usando 32 (short) e
64 bits (long)
Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 86 / 204
Exemplo de Diretiva
1 section .text
2 global _start
3 _start:
4 ; comprimento da mensagem
5 mov edx ,1
6 ; Mensagem para escrever
7 mov ecx ,choice
8 ; Descritor de arquivo (stdout)
9 mov ebx ,1
10 ; Número da chamada ao sistema
11 mov eax ,4
12 int 0x80
13 ; sys_exit
14 mov eax ,1
15 int 0x80
16 section .data
17 choice DB ’y’
Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 87 / 204
Alocação de Dados não Inicializados
Diretivas de reserva são usadas para reservar espaço para dados não
inicializados.
Os tipos de diretivas são:
Diretiva Objetivo
RESB Reserve a Byte
RESW Reserve a Word
RESD Reserve a Doubleword
RESQ Reserve a Quadword
REST Reserve a Ten Bytes
Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 88 / 204
Definições e Inicializações
Podemos ter múltiplas definições e inicializações como:
choice DB ’Y’ ;ASCII of y = 79H
number1 DW 12345 ;12345D = 3039H
number2 DD 12345679 ;123456789D = 75BCD15H
A diretiva TIMES permite múltiplas inicializações para o mesmo valor. Por
exemplo uma matriz mat de tamanho 9 pode ser definida e inicializada
com zeros como segue:
mat TIMES 9 DW 0
Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 89 / 204
Pequeno Detalhe do Times 008_times
Times pode ser usado para multiplicar bytes
1 section .text
2 global _start
3 _start:
4 ;comprimento da mensagem
5 mov edx ,9
6 ;Mensagem para escrever
7 mov ecx , stars
8 ; fd
9 mov ebx ,1
10 ; sys_write
11 mov eax ,4
12 int 0x80
Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 90 / 204
Pequeno Detalhe do Times 008_times
1 _saida:
2 mov edx ,newLineLen
3 mov ecx ,newLineMsg
4 mov ebx ,1
5 mov eax ,4
6 int 0x80
7 ; sys_exit
8 mov eax ,1
9 int 0x80
10 section .data
11 ; usando times
12 stars times 9 db ’*’
13 newLineMsg db 0xa
14 newLineLen equ $-newLineMsg
Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 91 / 204
Constantes - Diretivas
1 EQU
2 %assign
3 %define
Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 92 / 204
EQU
EQU é usada para definir constantes.
CONSTANT_NAME EQU expression.
Ex.
TOTAL_STUDENTS equ 50
Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 93 / 204
%assign
A diretiva %assign pode ser usada para definir constantes numéricas como
a diretiva EQU. Esta diretiva permite a redefinição. Esta diretiva é
semelhante a #define do c
Ex.
%define PTR [EBP+4]
Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 94 / 204
009_equ.asm
1 %assign SYS_EXIT 1
2 %define SYS_WRITE 4
3 ;SYS_EXIT equ 1
4 ;SYS_WRITE equ 4
5 STDIN equ 0
6 STDOUT equ 1
7 section .text
8 global _start
9 _start:
10 mov eax , SYS_WRITE
11 mov ebx , STDOUT
12 mov ecx , msg1
13 mov edx , len1
14 int 0x80
Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 95 / 204
009_equ.asm
1 mov eax , SYS_WRITE
2 mov ebx , STDOUT
3 mov ecx , msg2
4 mov edx , len2
5 int 0x80
6 mov eax , SYS_WRITE
7 mov ebx , STDOUT
8 mov ecx , msg3
9 mov edx , len3
10 int 0x80
11 mov eax ,SYS_EXIT
12 int 0x80
Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 96 / 204
009_equ.asm
1 section .data
2 msg1 db ’Alo programadores!’,0xA ,0xD
3 len1 equ $ - msg1
4
5 msg2 db ’Benvindos ao mundo da ,’, 0xA ,0xD
6 len2 equ $ - msg2
7
8 msg3 db ’Programação Assembly Linux! ’,0xA ,0xD
9 len3 equ $- msg3
Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 97 / 204
Aritmética em Assembly
A instrução INC é usada para incrementar um operador de um.
Funciona com somente um operando que pode ser um registrador ou estar
na memória.
Sintaxe:
INC destination
Exs:
1 INC EBX ; Incrementa registrador de 32-bit
2 INC DL ; Incrementa registrador de 8-bit register
3 INC [count] ; Incrementa a variável count
Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 98 / 204
Aritmética em Assembly
Da forma semelhante ao operador INC, o operador DEC é utilizado para
decrementar valores.
Ex.
1 segment .data
2 count dw 0
3 value db 15
4
5 segment .text
6 inc [count]
7 dec [value]
8 mov ebx , count
9 inc word [ebx]
10 mov esi , value
11 dec byte [esi]
Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 99 / 204
Adição e Subtração
Operadores ADD e SUB
ADD/SUB destination, source
Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 100 / 204
010_addsub.asm
1 SYS_EXIT equ 1
2 SYS_READ equ 3
3 SYS_WRITE equ 4
4 STDIN equ 0
5 STDOUT equ 1
6 segment .data
7 msg1 db "Entre com um digito", 0xA ,0xD
8 len1 equ $- msg1
9 msg2 db "Entre com um segundo digito", 0xA ,0xD
10 len2 equ $- msg2
11 msg3 db "A soma eh: "
12 len3 equ $ - msg3
13 newLineMsg db 0xa
14 newLineLen equ $-newLineMsg
Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 101 / 204
010_addsub.asm
1 segment .bss
2 num1 resb 2
3 num2 resb 2
4 res resb 1
5 section .text
6 global _start
7 _start:
8 mov eax , SYS_WRITE
9 mov ebx , STDOUT
10 mov ecx , msg1
11 mov edx , len1
12 int 0x80
Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 102 / 204
010_addsub.asm
1 mov eax , SYS_READ
2 mov ebx , STDIN
3 mov ecx , num1
4 mov edx , 2
5 int 0x80
6 mov eax , SYS_WRITE
7 mov ebx , STDOUT
8 mov ecx , msg2
9 mov edx , len2
10 int 0x80
11 mov eax , SYS_READ
12 mov ebx , STDIN
13 mov ecx , num2
14 mov edx , 2
15 int 0x80
Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 103 / 204
010_addsub.asm
1 mov eax , SYS_WRITE
2 mov ebx , STDOUT
3 mov ecx , msg3
4 mov edx , len3
5 int 0x80
6 ; movendo o primeiro número para o registrador eax
e o segundo para ebx
7 ; e subtraindo o ascii 0 para converter em número
decimal
8 mov eax , [num1]
9 sub eax , ’0’
10 mov ebx , [num2]
11 sub ebx , ’0’
12 ; soma eax e ebx
13 add eax , ebx
Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 104 / 204
010_addsub.asm
1 ; adiciona 0 para converter a soma de decimal para
ASCII
2 add eax , ’0’
3 ; armazenando a soma no local de memoria
referenciado por res
4 mov [res], eax
5 ; imprime a soma
6 mov eax , SYS_WRITE
7 mov ebx , STDOUT
8 mov ecx , res
9 mov edx , 1
10 int 0x80
11 exit:
12 mov edx ,newLineLen
13 mov ecx ,newLineMsg
14 mov ebx ,STDOUT
15 mov eax ,SYS_WRITE
16 int 0x80
Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 105 / 204
Multiplicação (Não tão simples)
MUL/IMUL operando
MUL = Números sem sinal
IMUL = Com sinal
Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 106 / 204
Multiplicando dois Bytes
Um operando (multiplicando) está no registrador AL e o outro
(multiplicador) é um byte na memória ou em outro registrador. O produto
vai para AX. Os 8 bits de mais alta ordem (à esquerda) são armazenados
em AH e os 8 bits de mais baixa ordem vão para AL
Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 107 / 204
Multiplicando dois Words
O Multiplicando deve estar no registro AX e o multiplicador é um word na
memória ou em outro registrador. Por exemplo MUL DX multiplica DX
por AX. O resultado é um doubleword o qual necessitará de dois
registradores. A parte de mais alta ordem do resultado vai para DX e a
parte de mais baixa ordem vai para AX
Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 108 / 204
Multiplicando dois doublewords
Quando dois doublewords são multiplicados, o multiplicando deve estar em
EAX e o multiplicador será um doubleword na memória ou em outro
registrador. O produto ira para EDX:EAX (32 bits em cada)
Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 109 / 204
Multiplicando (011_mult)
1 section .text
2 global _start
3 _start:
4 mov al ,’9’ ; al = 3
5 sub al ,’0’ ; al = numero
6 mov bl , ’2’ ; bl = ’2’
7 sub bl , ’0’ ; bl = 2
8 mul bl ; AH:AL = bl * al => 0:6
9 add al , ’0’ ; al = 6
10
11 mov [res], al ; al (6) é colocado na referência
de res
12 mov ecx ,msg ; mensagem preparada para ser
enviada
13 mov edx , len ; comprimento daq mensagem setada
14 mov ebx ,1 ;(stdout)
15 mov eax ,4 ; (sys_write)
16 int 0x80
Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 110 / 204
Multiplicando (011_mult)
1 mov ecx ,res ; resultado é copiado para o ecx
2 mov edx , 1 ; comprimento (1 byte)
3 mov ebx ,1 ;(stdout)
4 mov eax ,4 ; (sys_write)
5 int 0x80 ;
6
7 mov edx ,newLineLen
8 mov ecx ,newLineMsg
9 mov ebx ,1
10 mov eax ,4
11 int 0x80
12
13 xor ebx , ebx
14 mov eax ,1 ; (sys_exit)
15 int 0x80 ;
Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 111 / 204
Multiplicando (011_mult)
1 ; segmento de dados
2 section .data
3 msg db "O resultado eh:", 0xA ,0xD
4 len equ $- msg
5 newLineMsg db 0xa
6 newLineLen equ $-newLineMsg
7
8 ; dados não inicializados
9 segment .bss
10 res resb 1
Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 112 / 204
Dividindo
A divisão gera dois elementos : o quociente e o resto. Pode ocorrer
overflow que gera uma interrupção.
1 DIV : Divisão sem sinal
2 IDIV : com sinal
Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 113 / 204
Dividindo por Byte
Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 114 / 204
Dividindo por Word
Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 115 / 204
Dividindo por Doubleword
Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 116 / 204
Dividindo (012_div)
1 section .text
2 global _start
3 _start:
4 mov ax ,’8’
5 sub ax ,’0’ ; eax conterá o número 8
6 mov bl , ’2’
7 sub bl , ’0’ ; bl conterá o número 2
8 div bl ; ax é dividido por bl
9 add ax , ’0’ ; convertido em número
10 mov [res], ax ; ax vai para res
11 mov ecx ,msg ; prepara msg
12 mov edx , len
13 mov ebx ,1
14 mov eax ,4 ; (sys_write)
15 int 0x80
Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 117 / 204
Dividindo (012_div)
1 mov ecx ,res ; res vai para ecx
2 mov edx , 1
3 mov ebx ,1 ;(stdout)
4 mov eax ,4 ;(sys_write)
5 int 0x80
6 mov eax ,1 ;(sys_exit)
7 int 0x80
8
9 section .data
10 msg db "O resultado é:", 0xA ,0xD
11 len equ $- msg
12 segment .bss
13 res resb 1
Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 118 / 204
Instruções Lógicas
Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 119 / 204
And
A instrução AND é usada para dar suporte a expressões realizando a
operação AND bit a bit. A operação retorna 1 se os bits que se casam na
mesma posição são 1, senão retornam zero.
Também usada para limpeza de bits.
Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 120 / 204
Dividindo (013_and)
1 section .text
2 global _start ;declaração do ponto de
entrada main
3 _start: ;declaraão para o linker
do ponto de entrada
4 mov ax , 7h ;ponto 8h no registro ax
5 and ax , 1 ;operação and com 1
6 jz evnn ; salta para o endereço
referenciado por evnn caso a ax seja zero
(número par)
7 mov eax , 4 ;(sys_write)
8 mov ebx , 1 ;(stdout)
9 mov ecx , odd_msg ;message to write
10 mov edx , len2 ;length of message
11 int 0x80 ;call kernel
12 jmp outprog
Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 121 / 204
Dividindo (013_and)
1 evnn:
2 mov ah , 09h
3 mov eax , 4 ;(sys_write)
4 mov ebx , 1 ;(stdout)
5 mov ecx , even_msg ;mensagem
6 mov edx , len1 ;comprimento da mensagem
7 int 0x80
8 outprog:
9 mov edx ,newLineLen
10 mov ecx ,newLineMsg
11 mov ebx ,1
12 mov eax ,4
13 int 0x80
14 mov eax ,1 ;(sys_exit)
15 int 0x80
Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 122 / 204
Dividindo (013_and)
1 section .data
2 even_msg db ’Número Par!’ ;mensagem par
3 len1 equ $ - even_msg
4
5 odd_msg db ’Número ímpar!’ ;mensagem ímpar
6 len2 equ $ - odd_msg
7
8 newLineMsg db 0xa
9 newLineLen equ $-newLineMsg
Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 123 / 204
Or
Implementa o OU bit a bit
Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 124 / 204
Or (014_or)
1 section .text
2 global _start
3 _start:
4 mov al , 5 ;pondo 5 no al
5 mov bl , 3 ;pondo 3 in the bl
6 or al , bl ;or al e bl , resultado = 7
7 add al , byte ’0’ ;convertendo decimal para ascii
8 mov [result],al
9 mov eax , 4
10 mov ebx , 1
11 mov ecx , result
12 mov edx , 1
13 int 0x80
Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 125 / 204
Or (014_or)
1
2 outprog:
3 mov eax ,1 ; (sys_exit)
4 int 0x80
5 section .bss
6 result resb 1
Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 126 / 204
Xor
Ou exclusivo Bit a Bit
Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 127 / 204
Instrução Test
A instrução TEST funciona da mesma forma que a operação AND, mas
diferentemente dessa, ela não muda o primeiro operando.
Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 128 / 204
Instrução Not
Operação NOT bit a bit
Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 129 / 204
Comparações
A instrução CMP compara dois operandos. É geralmente usado em
execução condicional. Esta instrução basicamente subtrai um operando do
outro para comparar se os operandos são iguais ou não. Não modifica os
operandos. É usado juntamente com a instrução de salto condicional para
a tomada de decisões.
Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 130 / 204
CMP
CMP destino, fonte
CMP compara dois campos de dados numéricos. O operando de destino
pode estar no registro ou na memória. O operando de origem pode ser
uma constante (imediata), registrador ou memória
Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 131 / 204
CMP + JLE
1 CMP DX ,00 ; Compare o valor DX com zero
2 JE L7 ; Se sim , então pule para rótulo L7
3 L1:
4 INC EDX
5 CMP EDX , 10; Compara se o contador chegou a 10
6 JLE L1; Se for menor ou igual a 10, então salta
para L1:
7 L7:
8 ...
Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 132 / 204
Desvios
1 Condicionais
2 Incondicionais
Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 133 / 204
Desvios Incondicionais
Como mencionado anteriormente, isso é realizado pela instrução JMP.
(goto)
Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 134 / 204
Desvios Condicionais
Se alguma condição especificada estiver satisfeita, no salto condicional, o
fluxo de controle será transferido para uma instrução de destino. Existem
inúmeras instruções de salto condicional, dependendo da condição e dos
dados.
Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 135 / 204
Tipos de JUMPS
Jumps usado com comparações aritméticas de dados com sinal
Instrução Descrição Flag Testado
JE/JZ Jump Equal or Jump Zero ZF
JNE/JNZ Jump not Equal or Jump Not Zero ZF
JG/JNLE Jump Greater or Jump Not Less/Equal OF, SF, ZF
JGE/JNL Jump Greater/Equal or Jump Not Less OF, SF
JL/JNGE Jump Less or Jump Not Greater/Equal OF, SF
JLE/JNG Jump Less/Equal or Jump Not Greater OF, SF, ZF
Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 136 / 204
Tipos de JUMPS
Jumps usado com comparações aritméticas de dados sem sinal
Instrução Descrição Flag Testado
JE/JZ Jump Equal or Jump Zero ZF
JNE/JNZ Jump not Equal or Jump Not Zero ZF
JA/JNBE Jump Above or Jump Not Below/Equal CF, ZF
JAE/JNB Jump Above/Equal or Jump Not Below CF
JB/JNAE Jump Below or Jump Not Above/Equal CF
JBE/JNA Jump Below/Equal or Jump Not Above AF, CF
Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 137 / 204
Testando os Registros de Flag
Instrução Descrição Flag Testado
JXCZ Jump if CX is Zero none
JC Jump If Carry CF
JNC Jump If No Carry CF
JO Jump If Overflow OF
JNO Jump If No Overflow OF
JP/JPE Jump Parity or Jump Parity Even PF
JNP/JPO Jump No Parity or Jump Parity Odd PF
JS Jump Sign (negative value) SF
JNS Jump No Sign (positive value) SF
Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 138 / 204
Jumps (015_jumps)
1 section .text
2 global _start
3 _start:
4 mov ecx , [num1]
5 cmp ecx , [num2]
6 jg check_third_num
7 mov ecx , [num2]
8 check_third_num :
9 cmp ecx , [num3]
10 jg _exit
11 mov ecx , [num3]
12 _exit:
13 mov [largest], ecx
14 mov ecx ,msg
15 mov edx , len
16 mov ebx ,1 ;file descriptor (stdout)
17 mov eax ,4 ;system call number (sys_write)
18 int 0x80 ;call kernel
Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 139 / 204
Jumps (015_jumps)
1 mov ecx ,largest
2 mov edx , 2
3 mov ebx ,1
4 mov eax ,4 ;sys_write
5 int 0x80
6 mov eax , 1
7 int 80h
8 section .data
9 msg db "O maior digito eh: ", 0xA ,0xD
10 len equ $- msg
11 num1 dd ’47’
12 num2 dd ’22’
13 num3 dd ’31’
14
15 segment .bss
16 largest resb 2
Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 140 / 204
Loops Simples
1 MOV CL , 10
2 L1:
3 <LOOP -BODY >
4 DEC CL
5 JNZ L1
Observe o controle que o jnz faz do loop após o valor de cl ser
decrementado.
Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 141 / 204
Loop Automático
1 mov ECX ,10
2 l1:
3 <corpo do loop >
4 loop l1
O registrador ecx é usado para o controle do loop. No caso o loop será
executado 10 vezes.
Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 142 / 204
Jumps (016_loops)
1 section .text
2 global _start
3 _start:
4 mov ecx ,10
5 mov eax , ’1’
6 l1:
7 mov [num], eax
8 mov eax , 4
9 mov ebx , 1
10 push ecx
11 mov ecx , num
12 mov edx , 1
13 int 0x80
Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 143 / 204
Jumps (016_loops)
1 mov eax , [num]
2 sub eax , ’0’
3 inc eax
4 add eax , ’0’
5 pop ecx
6 loop l1
7 mov eax ,1 ;(sys_exit)
8 int 0x80
9 section .bss
10 num resb 1
Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 144 / 204
Números
Para trabalharmos com números na memória temos convertido
oscaracteres ASCII no seu correspondente binário e vice versa através de
soma ou subtração. O números na entrada ou saída serão strings ASCII e
precisarão ser convertidos.
Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 145 / 204
Representação ASCII de Números
Neste caso os números são representados em strings de códigos ASCII.
Ex.
1234 = 31 32 33 34H
Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 146 / 204
Conversão de Números para ASCII
Para esta conversão temos as seguintes instruções:
AAA - ASCII Adjust After Addition
AAS - ASCII Adjust After Subtraction
AAM - ASCII Adjust After Multiplication
AAD - ASCII Adjust Before Division
Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 147 / 204
Jumps (017_ajustaascii)
1 section .text
2 global _start
3 _start:
4 sub ah , ah
5 mov al , ’9’
6 sub al , ’3’
7 aas
8 or al , 30h
9 mov [res], ax
10 mov edx ,len ;comprimento da mensagem
11 mov ecx ,msg ;messagem a escrever
12 mov ebx ,1 ; (stdout)
13 mov eax ,4 ; (sys_write)
14 int 0x80 ; kernel
Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 148 / 204
Jumps (017_ajustaascii)
1 mov edx ,1 ; comprimento
2 mov ecx ,res ; mensagem
3 mov ebx ,1 ; (stdout)
4 mov eax ,4 ;(sys_write)
5 int 0x80 ; kernel
6 mov eax ,1 ; (sys_exit)
7 int 0x80 ; kernel
8 section .data
9 msg db ’O Resultado é:’,0xa
10 len equ $ - msg
11 section .bss
12 res resb 1
Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 149 / 204
Representação BCD
Existem dois tipos de representação BCD:
1 Representação BCD não compactada
2 Representação BCD compactada
Na representação BCD não compactada, cada byte armazena o
equivalente binário de um dígito decimal. Por exemplo, o número 1234 é
armazenado como - 01 02 03 04H
Na representação compactada cada byte pode represetar dois dígitos sendo
cada dígito representado por 4 bits. Assim 1234 pode ser representado
como -12 34h
Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 150 / 204
BCD Não Compactado
As instruções para tratar estes números são:
AAM - ASCII Adjust After Multiplication
AAD - ASCII Adjust Before Division
De fato as 4 instruções acima (slide anterior) podem ser usadas neste tipo
de dado.
Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 151 / 204
BCD Compactado
As instruções para tratar estes números são:
DAA - Decimal Ajust After Addition
DAS - Decimal Ajust After Subtraction
Não há suporte para multiplicação e divisão na representação BCD
compactada.
Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 152 / 204
BCD (018_ajusta_bcd)
1 section .text
2 global _start
3 _start:
4 mov esi , 4 ;posiçao do dígito mais à direita
5 mov ecx , 5 ;número de dígitos
6 clc ;Limpa o flag de carry
7 add_loop:
8 mov al , [num1 + esi] ; Adiciona o segundo
operando a AL , considerando o flag de carry
9 adc al , [num2 + esi] ; idem
10 aaa ; Ascii adjust after addition
11 pushf ;empurrar o valor do registro de flags do
processador na pilha
12 or al , 30h ;converte para o ascii correto
13 popf ;recupera os flags
Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 153 / 204
BCD (018_ajusta_bcd)
1 mov [sum + esi], al ; vai guardando os digitos em
sum
2 dec esi
3 loop add_loop
4 mov edx ,len ; comprimento da mensagem
5 mov ecx ,msg ; mensagem
6 mov ebx ,1 ; (stdout)
7 mov eax ,4 ; (sys_write)
8 int 0x80 ; kernel
9 mov edx ,5 ; comrimento da mensagem
10 mov ecx ,sum ; mensagem
11 mov ebx ,1 ; (stdout)
12 mov eax ,4 ; (sys_write)
13 int 0x80 ; kernel
14 mov eax ,1 ;(sys_exit)
15 int 0x80 ; kernel
Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 154 / 204
BCD (018_ajusta_bcd)
1 section .data
2 msg db ’A Soma é:’,0xa
3 len equ $ - msg
4 num1 db ’12345 ’
5 num2 db ’23456 ’
6 sum db ’ ’
Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 155 / 204
Strings
Já usamos strings de comprimento variável em nossos exemplos anteriores.
As strings de comprimento variável podem ter quantos caracteres
necessários. Geralmente, especificamos o comprimento da sequência por
qualquer uma das duas maneiras:
1 Armazenamento explícito do comprimento da string
2 Usando um caractere sentinela
Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 156 / 204
Caso 1 - Comprimento Definido
msg db ’Hello, world!’,0xa
len equ $ - msg
msg db ’Hello, world!’,0xa
len equ 13
Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 157 / 204
Caso 2 - Uso de Caractere Sentinela
messagem DB ’O escambau do judas!’, 0
Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 158 / 204
Comandos para Manipulação de Strings
1 MOVS. Esta instrução move 1 byte Word ou Doubleword de dados
do local de memória para outro.
2 LODS. Esta instrução carrega da memória. Se o operando é de um
byte, ele é carregado no registro al, se o operando é uma palavra, ele
é carregado no registro AX e uma palavra dupla é carregada no
registro EAX.
3 STOS. Esta instrução armazena dados do registro (AL, AX ou EAX)
para a memória.
4 CMPS. Esta instrução compara dois itens de dados na memória. Os
dados podem ser de tamanho byte, palavra ou palavra dupla.
5 SCAS. Esta instrução compara o conteúdo de um registro (AL, AX
ou EAX) com o conteúdo de um item na memória.
Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 159 / 204
Versões das Operações com Strings
Instrução Base Operandos em Byte Word DWord
MOVS ES:DI, DS:SI MOVSB MOVSW MOVSD
LODS AX, DS:SI LODSB LODSW LODSD
STOS ES:DI, AX STOSB STOSW STOSD
CMPS DS:SI, ES: DI CMPSB CMPSW CMPSD
SCAS ES:DI, AX SCASB SCASW SCASD
Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 160 / 204
Prefixo de Repetição
O prefixo REP, quando definido antes de uma instrução de string, por
exemplo - REP MOVSB, causa repetição da instrução com base em um
contador colocado no registro CX. O REP executa a instrução, diminui o
CX em 1 e verifica se o CX é zero. Ele repete o processamento de
instruções até que o CX seja zero.
Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 161 / 204
REP
O FLAG de Direção determina o sentido da operação.
Use CLD (Clear Direction Flag, DF = 0) para fazer a operação da
esquerda para a direita.
Use SDT (Set Direction Flag, DF = 1) para tornar a operação da direita
para a esquerda.
Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 162 / 204
Variações do REP
1 REP É a repetição incondicional. Repete a operação até que o CX
seja zero.
2 REPE ou REPZ: É uma repetição condicional. Ele repete a operação
enquanto a bandeira zero indica igual/zero. Para quando o ZF indica
não igual/zero ou quando o CX é zero.
3 REPNE ou REPNZ: Também é uma repetição condicional. Ele
repete a operação enquanto a bandeira zero indica não igual/zero.
Para quando o ZF indica igual/zero ou quando o CX é decrementado
a zero
Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 163 / 204
Diretivas Para Definição de Arrays
Definindo variáveis Normais
MESES DW 12
MESES DW 0CH
MESES DW 0110B
Definindo Arrays de Uma Dimensão
NUMEROS DW 34, 45, 56, 67, 75, 89
Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 164 / 204
Outra Forma de Definir Arrays
MTX DW 0
DW 0
DW 0
DW 0
DW 0
DW 0
DW 0
Ou
MTX DW 0, 0 , 0 , 0 , 0 , 0 , 0 , 0
MTX TIMES 8 DW 0
Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 165 / 204
Matrizes (019_arrays)
1 section .text
2 global _start
3 _start:
4 mov eax ,3 ;numero de bytes a serem somados
5 mov ebx ,0 ;EBX guarda a soma
6 mov ecx ,x ;ECX aponta para o elemento atual a
ser somado
7 top:
8 add ebx , [ecx]
9 add ecx ,1 ;move ponteiro para o próximo
elemento
10 dec eax ;decrementa o contador
11 jnz top ;se o contador não é zero continua
12 done:
13 add ebx , ’0’
14 mov [sum], ebx ;finaliza guardando o resutado em
sum
Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 166 / 204
Matrizes (019_arrays)
1 display:
2 mov edx ,1 ;comprimento da mensagem
3 mov ecx , sum ;messagem a escrever
4 mov ebx , 1 ; (stdout)
5 mov eax , 4 ; (sys_write)
6 int 0x80
7 mov eax , 4
8 mov ebx ,1
9 mov ecx ,newLineMsg
10 mov edx ,newLineLen
11 int 0x80
12 mov eax , 1 ;(sys_exit)
13 int 0x80
Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 167 / 204
Matrizes (019_arrays)
1 section .data
2 newLineMsg db 0xa
3 newLineLen equ $-newLineMsg
4 global x
5 x:
6 db 2
7 db 4
8 db 3
9 sum:
10 db 0
Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 168 / 204
Procedimentos
Sintaxe geral para procedimentos:
proc_name:
procedure body
...
ret
CALL proc_name
Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 169 / 204
Procedimentos (020_procs)
1 section .text
2 global _start
3 _start:
4 mov ecx ,’4’
5 sub ecx , ’0’
6 mov edx , ’5’
7 sub edx , ’0’
8 call sum ;chama o procedimento soma
9 mov [res], eax
10 mov ecx , msg
11 mov edx , len
12 mov ebx ,1 ;(stdout)
13 mov eax ,4 ;(sys_write)
14 int 0x80
Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 170 / 204
Procedimentos (020_procs)
1 mov ecx , res
2 mov edx , 1
3 mov ebx , 1 ;(stdout)
4 mov eax , 4 ;(sys_write)
5 int 0x80 ;
6 mov eax ,4
7 mov ebx ,1
8 mov ecx ,newLineMsg
9 mov edx ,newLineLen
10 int 0x80
11 mov eax ,1 ;(sys_exit)
12 int 0x80
13 sum:
14 mov eax , ecx
15 add eax , edx
16 add eax , ’0’
17 ret
Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 171 / 204
Procedimentos (020_procs)
1 section .data
2 msg db "A soma eh: "
3 len equ $- msg
4 newLineMsg db 0xa
5 newLineLen equ $-newLineMsg
6
7 segment .bss
8 res resb 1
Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 172 / 204
Pilha
Uma pilha é uma estrutura de dados semelhante a uma matriz na memória
na qual os dados podem ser armazenados e removidos de um local
chamado "topo"da pilha. Os dados que precisam ser armazenados são
’empurrados’ para dentro da pilha e os dados a serem recuperados são
’retirados’ da pilha. Trata-se de uma estrutura de dados LIFO, ou seja, os
dados armazenados primeiro são recuperados por último.
Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 173 / 204
Operações sobre as Pilhas
1 PUSH operando
2 POP endereço/registrador
Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 174 / 204
Implementação
A implementação da pilha é realizada no espaço de memória reservado
para este fim. Os registros SS e ESP (ou SP) são utilizados para a
implementação da pilha. A parte superior da pilha, que aponta para o
último item de dados inserido na pilha é apontada pelo registro SS:ESP,
onde o registro SS aponta para o início do segmento de pilha e o SP (ou
ESP) dá o deslocamento para o segmento de pilha.
Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 175 / 204
Características do SS
1 Apenas palavras ou palavras duplas poderiam ser salvas na pilha, não
um byte.
2 A pilha cresce na direção inversa, ou seja, em direção ao endereço de
memória inferior
3 A parte superior da pilha aponta para o último item inserido na pilha;
ele aponta para o byte inferior da última palavra inserida.
Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 176 / 204
Procedimentos (021_stack)
1 section .text
2 global _start
3 _start:
4 call display
5 mov eax ,1 ;(sys_exit)
6 int 0x80
7 display:
8 mov rcx , 256 ; uso em 64 bits
9 next:
10 push rcx
11 mov eax , 4
12 mov ebx , 1
13 mov rcx , achar
14 mov edx , 1
15 int 80h
Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 177 / 204
Procedimentos (021_stack)
1 pop rcx
2 mov edx , [achar]
3 cmp byte [achar], 0dh
4 inc byte [achar]
5 loop next
6 ret
7 section .data
8 achar db ’0’
Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 178 / 204
Recursividade 022_fatorial
Usando a recursividade em Assembly
1 section .text
2 global _start
3 _start:
4 mov bx , 3 ;calcular o fatorial de 3
5 call proc_fact
6 add ax , 30h
7 mov [fact], ax
8 mov edx ,len ;comprimento da mensagem
9 mov ecx ,msg ;mensagem a escrever
10 mov ebx ,1 ;(stdout)
11 mov eax ,4 ;(sys_write)
12 int 0x80
Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 179 / 204
Recursividade 022_fatorial
1 mov edx ,1 ;comprimento da mensagem
2 mov ecx ,fact ;mensagem para escrever
3 mov ebx ,1 ;(stdout)
4 mov eax ,4 ; (sys_write)
5 int 0x80
6 mov eax ,1 ; (sys_exit)
7 int 0x80
8 proc_fact:
9 cmp bl , 1
10 jg calcula
11 mov ax , 1
12 ret
13 calcula:
14 dec bl
15 call proc_fact
16 inc bl
17 mul bl ;ax = al * bl
18 ret
Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 180 / 204
Recursividade 022_fatorial
1 section .data
2 msg db ’Factorial 3 is:’,0xa
3 len equ $ - msg
4
5 section .bss
6 fact resb 1
Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 181 / 204
Macros
1 Escrever uma macro é outra forma de garantir a programação
modular na linguagem de montagem.
2 Uma macro é uma sequência de instruções, atribuídas por um nome e
podem ser usadas em qualquer lugar do programa.
3 No NASM, as macros são definidas com as diretivas %macro e
%endmacro.
4 A macro começa com a diretiva %macro e termina com a diretiva
%endmacro.
Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 182 / 204
Sintaxe para Construção de Macros
%macro nome_macro número_de_parâmetros
<macro body>
%endmacro...
Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 183 / 204
Macros 023_macro
1 ; Uma macro com dois parâmmetros
2 ; implementa a system call write
3 %macro write_string 2
4 mov eax , 4
5 mov ebx , 1
6 mov ecx , %1
7 mov edx , %2
8 int 80h
9 %endmacro
10 section .text
11 global _start
12 _start:
13 write_string msg1 , len1
14 write_string msg2 , len2
15 write_string msg3 , len3
16 mov eax ,1 ; (sys_exit)
17 int 0x80
Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 184 / 204
Macros 023_macro
1
2 section .data
3 msg1 db ’Alo programadoress... !’,0xA ,0xD
4 len1 equ $ - msg1
5 msg2 db ’Bem vindo ao mundo da ,’, 0xA ,0xD
6 len2 equ $- msg2
7 msg3 db ’Programação assembly para linux ’,0xA ,0xD
8 len3 equ $- msg3
Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 185 / 204
Gerenciamento de Arquivos
O sistema considera qualquer dados de entrada ou saída como fluxo de
bytes. Existem três fluxos de arquivo padrão:
1 Entrada padrão (stdin),
2 Saída padrão (stdout)
3 Erro padrão (stderr).
Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 186 / 204
Descritor de Arquivo
Um descritor de arquivo é um inteiro de 16 bits atribuído a um arquivo
como um id de arquivo. Quando um novo arquivo é criado ou um arquivo
existente é aberto, o descritor de arquivos é usado para acessar o arquivo.
Descritores de arquivos padrões stdin, stdout e stderr são 0, 1 e 2,
respectivamente.
Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 187 / 204
Ponteiro de Arquivos
Um ponteiro de arquivo especifica o local para uma operação subsequente
de leitura/gravação no arquivo em termos de bytes. Cada arquivo é
considerado como uma sequência de bytes. Cada arquivo aberto está
associado a um ponteiro de arquivo que especifica um deslocamento em
bytes, em relação ao início do arquivo. Quando um arquivo é aberto, o
ponteiro do arquivo é definido como zero.
Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 188 / 204
Chamadas ao Sistema para Gerenciamento de Arquivos
%EAX NOME %EBX %ECX %EDX
2 sys_fork struct pt_regs - -
3 sys_read unsigned int char * size_t
4 sys_write unsigned int const char * size_t
5 sys_open const char * int int
6 sys_close unsigned int - -
8 sys_creat const char * int -
19 sys_lseek unsigned int off_t unsigned int
Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 189 / 204
Como Fazer Chamadas ao Sistema
1 Coloque o número de chamada do sistema no registro EAX.
2 Armazene os argumentos para a chamada do sistema nos registros
EBX, ECX, etc..
3 Ligue para a interrupção relevante (80h).
4 O resultado geralmente é devolvido no registro EAX.
Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 190 / 204
Como Criar um Arquivo
1 Coloque a chamada do sistema sys_creat() número 8, no registro
EAX.
2 Coloque o nome do arquivo no registro EBX.
3 Coloque as permissões de arquivo no registro ECX.
4 A chamada do sistema retorna o descritor de arquivo do arquivo
criado no registro EAX, em caso de erro, o código de erro está no
registro EAX.
Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 191 / 204
Abrindo Um Arquivo Existente
1 Coloque o sistema de chamada sys_open() número 5, no registro
EAX.
2 Coloque o nome do arquivo no registro EBX.
3 Coloque o modo de acesso ao arquivo no registro ECX.
4 Coloque as permissões de arquivo no registro EDX.
5 A chamada do sistema retorna o descritor de arquivo do arquivo
criado no registro EAX, em caso de erro, o código de erro está no
registro EAX.
6 Entre os modos de acesso ao arquivo, os mais utilizados são: somente
leitura (0), somente gravação (1) e leitura-gravação (2).
Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 192 / 204
Lendo Um Arquivo
1 Coloque o sistema de chamada sys_read() número 3, no registro EAX.
2 Coloque o descritor de arquivos no registro EBX.
3 Coloque o ponteiro no buffer de entrada no registro ECX.
4 Coloque o tamanho do buffer, ou seja, o número de bytes para ler, no
registro EDX.
5 A chamada do sistema retorna o número de bytes lidos no registro
EAX, em caso de erro, o código de erro está no registro EAX.
Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 193 / 204
Escrevendo em Um Arquivo
1 Coloque a chamada do sistema sys_write() número 4, no registro
EAX.
2 Coloque o descritor de arquivos no registro EBX.
3 Coloque o ponteiro no buffer de saída no registro ECX.
4 Coloque o tamanho do buffer, ou seja, o número de bytes para
escrever, no registro EDX.
5 A chamada do sistema retorna o número real de bytes escritos no
registro EAX, em caso de erro, o código de erro está no registro EAX.
Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 194 / 204
Fechando o Arquivo
1 Coloque a chamada do sistema sys_close() número 6, no registro
EAX.
2 Coloque o descritor de arquivos no registro EBX.
3 A chamada do sistema retorna, em caso de erro, o código de erro no
registro EAX.
Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 195 / 204
Atualizando o Arquivo
1 Coloque o sistema de chamada sys_lseek () número 19, no registro
EAX.
2 Coloque o descritor de arquivos no registro EBX.
3 Coloque o valor de deslocamento no registro ECX.
4 Coloque a posição de referência para o deslocamento no registro EDX.
Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 196 / 204
Posições de Referência
1 Início do arquivo - valor 0
2 Posição atual - valor 1
3 Fim do arquivo - valor 2
Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 197 / 204
Macros 024_arquivos
1 section .text
2 global _start
3 _start:
4 ;create the file
5 mov eax , 8
6 mov ebx , file_name
7 mov edx , lenmsgfilename
8 mov ecx , 0777 ;ler , escrever e esecutar
por todos
9 int 0x80
10 mov [fd_out], eax
11 ;escrever no arquivo
12 mov edx ,lenmsg ;número de bytes
13 mov ecx , msg ;mensagem para escrever
14 mov ebx , [fd_out] ;descritor do arquivo
15 mov eax ,4 ; (sys_write)
16 int 0x80
Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 198 / 204
Macros 024_arquivos
1 ; fecha o arquivo
2 mov eax , 6
3 mov ebx , [fd_out]
4 ; escreve a mensagem indicando o fim do arquivos
5 mov eax , 4
6 mov ebx , 1
7 mov ecx , msg_done
8 mov edx , len_done
9 int 0x80
10
11 ;abre o arquivo para leitura
12 mov eax , 5
13 mov ebx , file_name
14 mov ecx , 0 ;para acesso somente de
leitura
15 mov edx , 0777 ;ler escrever e executar
por todos
16 int 0x80
Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 199 / 204
Macros 024_arquivos
1 mov [fd_in], eax
2
3 ;ler do arquivo
4 mov eax , 3
5 mov ebx , [fd_in]
6 mov ecx , info
7 mov edx , 26
8 int 0x80
9
10 ; fechar o arquivo
11 mov eax , 6
12 mov ebx , [fd_in]
13 int 0x80
14
15 ; imprimir informações
16 mov eax , 4
17 mov ebx , 1
18 mov ecx , info
Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 200 / 204
Macros 024_arquivos
1
2 section .data
3 file_name db ’myfile.txt ’,0
4 lenmsgfilename equ $-file_name
5 msg db ’Bem vindo ao assembly ’,0xa
6 lenmsg equ $-msg
7
8 msg_done db ’Escrito no arquivo ’, 0xa
9 len_done equ $-msg_done
10
11 section .bss
12 fd_out resb 1
13 fd_in resb 1
14 info resb 26
Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 201 / 204
Gerenciamento de Memória
A chamada do sistema sys_brk() é fornecida pelo kernel para alocar
memória sem a necessidade de movê-la mais tarde. Esta chamada
aloca memória logo atrás da imagem do aplicativo na memória. Esta
função do sistema permite definir o endereço mais alto disponível na
seção de dados.
Esta chamada do sistema requer um parâmetro, que é o endereço de
memória mais alto necessário para ser definido. Esse valor é
armazenado no registro EBX.
Em caso de erro, sys_brk() retorna -1 ou retorna o próprio código de
erro negativo. O exemplo a seguir demonstra a alocação dinâmica da
memória
Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 202 / 204
Memória 025_memoria
1 section .text
2 global _start
3 _start:
4 mov eax , 45 ;sys_brk
5 xor ebx , ebx
6 int 80h
7 add eax , 16384 ;número de bytes a ser reservado
8 mov ebx , eax
9 mov eax , 45 ;sys_brk
10 int 80h
11 cmp eax , 0
12 jl exit ;exit , caso erro
13 mov edi , eax ;EDI = endereço disponível mais
alto
14 sub edi , 4 ;apontando para a última DWORD
15 mov ecx , 4096 ;número de DWORDs allocadas
16 xor eax , eax ;limpa eax
17 std ;backward - retorna
Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 203 / 204
Memória 025_memoria
1
2 rep stosd ;repete para toda a área
alocada
3 cld ;coloca o DF flag para o estado nomal
4 mov eax , 4
5 mov ebx , 1
6 mov ecx , msg
7 mov edx , len
8 int 80h ;imprime uma mensagem
9 exit:
10 mov eax , 1
11 xor ebx , ebx
12 int 80h
13 section .data
14 msg db "Aloca 16k de memória!", 10
15 len equ $ - msg
Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 204 / 204
Fim da Primeira Parte
Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 205 / 204

Mais conteúdo relacionado

Mais procurados

How it's made: C++ compilers (GCC)
How it's made: C++ compilers (GCC)How it's made: C++ compilers (GCC)
How it's made: C++ compilers (GCC)Sławomir Zborowski
 
U-Boot Porting on New Hardware
U-Boot Porting on New HardwareU-Boot Porting on New Hardware
U-Boot Porting on New HardwareRuggedBoardGroup
 
Part-2: Mastering microcontroller with embedded driver development
Part-2: Mastering microcontroller with embedded driver developmentPart-2: Mastering microcontroller with embedded driver development
Part-2: Mastering microcontroller with embedded driver developmentFastBit Embedded Brain Academy
 
U Boot or Universal Bootloader
U Boot or Universal BootloaderU Boot or Universal Bootloader
U Boot or Universal BootloaderSatpal Parmar
 
U-Boot presentation 2013
U-Boot presentation  2013U-Boot presentation  2013
U-Boot presentation 2013Wave Digitech
 
U boot porting guide for SoC
U boot porting guide for SoCU boot porting guide for SoC
U boot porting guide for SoCMacpaul Lin
 
Linux System Programming - File I/O
Linux System Programming - File I/O Linux System Programming - File I/O
Linux System Programming - File I/O YourHelper1
 
Introduction to arm architecture
Introduction to arm architectureIntroduction to arm architecture
Introduction to arm architectureZakaria Gomaa
 
Arm device tree and linux device drivers
Arm device tree and linux device driversArm device tree and linux device drivers
Arm device tree and linux device driversHoucheng Lin
 
linux file sysytem& input and output
linux file sysytem& input and outputlinux file sysytem& input and output
linux file sysytem& input and outputMythiliA5
 
Introduction to eBPF and XDP
Introduction to eBPF and XDPIntroduction to eBPF and XDP
Introduction to eBPF and XDPlcplcp1
 
ebpf and IO Visor: The What, how, and what next!
ebpf and IO Visor: The What, how, and what next!ebpf and IO Visor: The What, how, and what next!
ebpf and IO Visor: The What, how, and what next!Affan Syed
 

Mais procurados (20)

How it's made: C++ compilers (GCC)
How it's made: C++ compilers (GCC)How it's made: C++ compilers (GCC)
How it's made: C++ compilers (GCC)
 
U-Boot Porting on New Hardware
U-Boot Porting on New HardwareU-Boot Porting on New Hardware
U-Boot Porting on New Hardware
 
Linux Internals - Part III
Linux Internals - Part IIILinux Internals - Part III
Linux Internals - Part III
 
Arm architecture
Arm architectureArm architecture
Arm architecture
 
Part-2: Mastering microcontroller with embedded driver development
Part-2: Mastering microcontroller with embedded driver developmentPart-2: Mastering microcontroller with embedded driver development
Part-2: Mastering microcontroller with embedded driver development
 
U Boot or Universal Bootloader
U Boot or Universal BootloaderU Boot or Universal Bootloader
U Boot or Universal Bootloader
 
U-Boot presentation 2013
U-Boot presentation  2013U-Boot presentation  2013
U-Boot presentation 2013
 
U boot porting guide for SoC
U boot porting guide for SoCU boot porting guide for SoC
U boot porting guide for SoC
 
Linux System Programming - File I/O
Linux System Programming - File I/O Linux System Programming - File I/O
Linux System Programming - File I/O
 
Introduction to arm architecture
Introduction to arm architectureIntroduction to arm architecture
Introduction to arm architecture
 
Arm device tree and linux device drivers
Arm device tree and linux device driversArm device tree and linux device drivers
Arm device tree and linux device drivers
 
linux file sysytem& input and output
linux file sysytem& input and outputlinux file sysytem& input and output
linux file sysytem& input and output
 
Linux Internals - Part II
Linux Internals - Part IILinux Internals - Part II
Linux Internals - Part II
 
Bootloaders
BootloadersBootloaders
Bootloaders
 
Introduction to eBPF and XDP
Introduction to eBPF and XDPIntroduction to eBPF and XDP
Introduction to eBPF and XDP
 
Java basics
Java basicsJava basics
Java basics
 
SPI Drivers
SPI DriversSPI Drivers
SPI Drivers
 
Inside the jvm
Inside the jvmInside the jvm
Inside the jvm
 
ebpf and IO Visor: The What, how, and what next!
ebpf and IO Visor: The What, how, and what next!ebpf and IO Visor: The What, how, and what next!
ebpf and IO Visor: The What, how, and what next!
 
Interrupts
InterruptsInterrupts
Interrupts
 

Semelhante a paradigmas_de_programacao.pdf

paradigmas_de_programacao_1_X.pdf
paradigmas_de_programacao_1_X.pdfparadigmas_de_programacao_1_X.pdf
paradigmas_de_programacao_1_X.pdfronaldo ramos
 
Aula-1 Introdução - Aula 1 - Abstrações e tecnologias computacionais.pdf
Aula-1 Introdução - Aula 1 - Abstrações e tecnologias computacionais.pdfAula-1 Introdução - Aula 1 - Abstrações e tecnologias computacionais.pdf
Aula-1 Introdução - Aula 1 - Abstrações e tecnologias computacionais.pdfAlphonsinoSantaRosa
 
Técnicas_Implementação
Técnicas_ImplementaçãoTécnicas_Implementação
Técnicas_ImplementaçãoWagner Zaparoli
 
Linguágens de programação
Linguágens de programaçãoLinguágens de programação
Linguágens de programaçãoAlbertoVach
 
Algoritmia para o site do 10gi marcelo e ricardo
Algoritmia para o site do 10gi marcelo e ricardoAlgoritmia para o site do 10gi marcelo e ricardo
Algoritmia para o site do 10gi marcelo e ricardozedaesquina98
 
Android Core Aula 1 - Histórico, Arquitetura e Compilação da plataforma
Android Core Aula 1 - Histórico, Arquitetura e Compilação da plataformaAndroid Core Aula 1 - Histórico, Arquitetura e Compilação da plataforma
Android Core Aula 1 - Histórico, Arquitetura e Compilação da plataformaFelipe Silveira
 
Gerenciador do atmega16
Gerenciador do atmega16Gerenciador do atmega16
Gerenciador do atmega16Gabriel Lima
 
Evolução do .NET Framework e do Visual Basic
Evolução do .NET Framework e do Visual BasicEvolução do .NET Framework e do Visual Basic
Evolução do .NET Framework e do Visual BasicRicardo Guerra Freitas
 
Módulo 5 Arquitetura de Computadores
Módulo 5 Arquitetura de ComputadoresMódulo 5 Arquitetura de Computadores
Módulo 5 Arquitetura de ComputadoresLuis Ferreira
 
middlewareReflexivo.ppt
middlewareReflexivo.pptmiddlewareReflexivo.ppt
middlewareReflexivo.pptPatrícia Melo
 
Noções Básicas do Software dos Computadores Digitais
Noções Básicas do Software dos Computadores DigitaisNoções Básicas do Software dos Computadores Digitais
Noções Básicas do Software dos Computadores DigitaisHenry Raúl González Brito
 
Desenvolva Sistemas Embutidos com Software Livre - Carlos A. M. dos Santos e ...
Desenvolva Sistemas Embutidos com Software Livre - Carlos A. M. dos Santos e ...Desenvolva Sistemas Embutidos com Software Livre - Carlos A. M. dos Santos e ...
Desenvolva Sistemas Embutidos com Software Livre - Carlos A. M. dos Santos e ...Tchelinux
 

Semelhante a paradigmas_de_programacao.pdf (20)

paradigmas_de_programacao_1_X.pdf
paradigmas_de_programacao_1_X.pdfparadigmas_de_programacao_1_X.pdf
paradigmas_de_programacao_1_X.pdf
 
Aula-1 Introdução - Aula 1 - Abstrações e tecnologias computacionais.pdf
Aula-1 Introdução - Aula 1 - Abstrações e tecnologias computacionais.pdfAula-1 Introdução - Aula 1 - Abstrações e tecnologias computacionais.pdf
Aula-1 Introdução - Aula 1 - Abstrações e tecnologias computacionais.pdf
 
Relatório pedrocastro 2012_2013_v1
Relatório pedrocastro 2012_2013_v1Relatório pedrocastro 2012_2013_v1
Relatório pedrocastro 2012_2013_v1
 
Técnicas_Implementação
Técnicas_ImplementaçãoTécnicas_Implementação
Técnicas_Implementação
 
Linguágens de programação
Linguágens de programaçãoLinguágens de programação
Linguágens de programação
 
Linguagem da programação
Linguagem da programaçãoLinguagem da programação
Linguagem da programação
 
Linguagem da programação
Linguagem da programaçãoLinguagem da programação
Linguagem da programação
 
Algoritmia para o site do 10gi marcelo e ricardo
Algoritmia para o site do 10gi marcelo e ricardoAlgoritmia para o site do 10gi marcelo e ricardo
Algoritmia para o site do 10gi marcelo e ricardo
 
Android Core Aula 1 - Histórico, Arquitetura e Compilação da plataforma
Android Core Aula 1 - Histórico, Arquitetura e Compilação da plataformaAndroid Core Aula 1 - Histórico, Arquitetura e Compilação da plataforma
Android Core Aula 1 - Histórico, Arquitetura e Compilação da plataforma
 
Gerenciador do atmega16
Gerenciador do atmega16Gerenciador do atmega16
Gerenciador do atmega16
 
Apostila de dev
Apostila de devApostila de dev
Apostila de dev
 
Evolução do .NET Framework e do Visual Basic
Evolução do .NET Framework e do Visual BasicEvolução do .NET Framework e do Visual Basic
Evolução do .NET Framework e do Visual Basic
 
Módulo 5 Arquitetura de Computadores
Módulo 5 Arquitetura de ComputadoresMódulo 5 Arquitetura de Computadores
Módulo 5 Arquitetura de Computadores
 
middlewareReflexivo.ppt
middlewareReflexivo.pptmiddlewareReflexivo.ppt
middlewareReflexivo.ppt
 
Noções Básicas do Software dos Computadores Digitais
Noções Básicas do Software dos Computadores DigitaisNoções Básicas do Software dos Computadores Digitais
Noções Básicas do Software dos Computadores Digitais
 
Desenvolva Sistemas Embutidos com Software Livre - Carlos A. M. dos Santos e ...
Desenvolva Sistemas Embutidos com Software Livre - Carlos A. M. dos Santos e ...Desenvolva Sistemas Embutidos com Software Livre - Carlos A. M. dos Santos e ...
Desenvolva Sistemas Embutidos com Software Livre - Carlos A. M. dos Santos e ...
 
Apostila de dev
Apostila de devApostila de dev
Apostila de dev
 
apostila de dev.pdf
apostila de dev.pdfapostila de dev.pdf
apostila de dev.pdf
 
Apostila de dev
Apostila de devApostila de dev
Apostila de dev
 
Apostila de dev
Apostila de devApostila de dev
Apostila de dev
 

Mais de ronaldo ramos

Mais de ronaldo ramos (20)

03_lisp.pdf
03_lisp.pdf03_lisp.pdf
03_lisp.pdf
 
02_lisp.pdf
02_lisp.pdf02_lisp.pdf
02_lisp.pdf
 
01_lisp.pdf
01_lisp.pdf01_lisp.pdf
01_lisp.pdf
 
python_funcional.pdf
python_funcional.pdfpython_funcional.pdf
python_funcional.pdf
 
_001_introducao.pdf
_001_introducao.pdf_001_introducao.pdf
_001_introducao.pdf
 
paradigmas_de_programacao_2_X.pdf
paradigmas_de_programacao_2_X.pdfparadigmas_de_programacao_2_X.pdf
paradigmas_de_programacao_2_X.pdf
 
paradigmas_de_programacao.pdf
paradigmas_de_programacao.pdfparadigmas_de_programacao.pdf
paradigmas_de_programacao.pdf
 
paradigmas_de_programacao_3_X.pdf
paradigmas_de_programacao_3_X.pdfparadigmas_de_programacao_3_X.pdf
paradigmas_de_programacao_3_X.pdf
 
python_funcional.pdf
python_funcional.pdfpython_funcional.pdf
python_funcional.pdf
 
40-aula40.pdf
40-aula40.pdf40-aula40.pdf
40-aula40.pdf
 
43-aula43.pdf
43-aula43.pdf43-aula43.pdf
43-aula43.pdf
 
48-aula48-modelosTemporais.pdf
48-aula48-modelosTemporais.pdf48-aula48-modelosTemporais.pdf
48-aula48-modelosTemporais.pdf
 
47-aula47-fuzzy-aplicacao.pdf
47-aula47-fuzzy-aplicacao.pdf47-aula47-fuzzy-aplicacao.pdf
47-aula47-fuzzy-aplicacao.pdf
 
46-aula46-fuzzy.pdf
46-aula46-fuzzy.pdf46-aula46-fuzzy.pdf
46-aula46-fuzzy.pdf
 
42-aula42.pdf
42-aula42.pdf42-aula42.pdf
42-aula42.pdf
 
39-aula39.pdf
39-aula39.pdf39-aula39.pdf
39-aula39.pdf
 
38-aula38.pdf
38-aula38.pdf38-aula38.pdf
38-aula38.pdf
 
36-aula36.pdf
36-aula36.pdf36-aula36.pdf
36-aula36.pdf
 
35-aula35.pdf
35-aula35.pdf35-aula35.pdf
35-aula35.pdf
 
34-aula34.pdf
34-aula34.pdf34-aula34.pdf
34-aula34.pdf
 

paradigmas_de_programacao.pdf

  • 1. Paradigmas de Programação Ronaldo Ramos Instituto Federal do Ceará 23 de julho de 2023
  • 2. Programa do Curso Noções Sobre Paradigmas de Programação 1 Paradigmas e Níveis de Abstração 2 Paradigma 1 - Imperativo 3 Paradigma 2 - Declarativo 4 Paradigma 3 - Misto 5 Baseada em Linguagem Natural (Quem viver Verá!!!) Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 2 / 204
  • 3. Programa do Curso Paradigma Imperativo 1 Abstração Simples - Linear 2 Programação Estruturada 3 Programação Orientada a Objetos 4 Programação Por Aspectos Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 3 / 204
  • 4. Programa do Curso Paradigma Declarativo 1 Programação em Lógica 2 Programação Funcional Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 4 / 204
  • 5. Importância da Linguagem "Os limites da minha língua são os limites do meu mundo.” Ludwig Wittgenstein Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 5 / 204
  • 6. Linguagens de Programação a Serem Usadas Assembly, Basic, Pascal, Ruby, Prolog, Haskel, Lisp, Python, etc etc Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 6 / 204
  • 7. Paradigmas que é um paradigma? Um paradigma é um princípio ou elemento que funciona como um pressuposto formando um modelo ou perspectiva para resolver problemas ou abordar uma determinada área do conhecimento. Na ciência da computação, os paradigmas de programação definem a forma como os programas são estruturados, organizados e construídos. Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 7 / 204
  • 8. Máquina de Turing https://turingmachine.io/ Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 8 / 204
  • 9. Paradigma Imperativo (Diga-me como fazer...) Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 9 / 204
  • 10. Linguagem de Máquina Formato do Arquivo. Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 10 / 204
  • 11. Dados e Instruções Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 11 / 204
  • 12. Primeira Abstração Mnemônicos e Montador/Tradutor Mnemônicos e operadores aritméticos são usados para construir textos equivalentes ao código de máquina porém bem mais fácil de entender. Surge a linguagem Assembly ou linguagem de montagem. Usada para ’montar’ programas. Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 12 / 204
  • 13. Elementos Para Programação em Assembly 1 Arquitetura do Processador. registradores de propósito geral, registradores de status, registradores de ponteiro de instrução, etc.), tamanhos de palavra (por exemplo, 8 bits, 16 bits, 32 bits, 64 bits) e conjunto de instruções específicas. 2 Memória: Organização da memória (páginas e segmentos), como a distinção entre memória de código (onde as instruções são armazenadas) e memória de dados (onde os dados são armazenados). Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 13 / 204
  • 14. Elementos Para Programação em Assembly 1 Pilha: Pilha de execução (stack) e como ela é usada para armazenar dados e endereços de retorno durante a execução de sub-rotinas (funções).Registradores de ponteiros de pilha (stack pointers). 2 Interrupções e Modos de Execução: Interrupções e modos de execução disponíveis no processador(modo usuário, modo kernel, etc.). Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 14 / 204
  • 15. Elementos Para Programação em Assembly 1 Entrada e Saída 2 Regras de Codificação Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 15 / 204
  • 16. Porque Usar Assembly? 1 Otimização de Desempenho 2 Acesso a Todos os Recursos do Hardware 3 Programação de Sistemas Embarcados 4 Comunicação Direta com o Hardware 5 Minimização do Tamanho do Programa Executável 6 Depuração em Baixo Nível 7 Estudo e Teste das Funcionalidades da Arquitetura do Hardware 8 Integração de Códigos em Baixo Nível Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 16 / 204
  • 17. Uma Breve Introdução ao Assembly Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 17 / 204
  • 18. O que vamos precisar 1 Um compilador ou montador (assembler) 2 Um link editor ou editor de ligação 3 Um editor de texto Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 18 / 204
  • 19. Assemblers (Montadores/Compiladores) 1 NASM (Netwide Assembler): O NASM é um assembler de propósito geral que suporta várias arquiteturas, incluindo x86 e x86-64. É amplamente utilizado em sistemas Linux e Windows. 2 MASM (Microsoft Macro Assembler): Desenvolvido pela Microsoft, é amplamente utilizado para desenvolvimento de software para sistemas Windows. Suporta arquiteturas x86 e x64. 3 FASM (Flat Assembler): O FASM é um assembler de código aberto que suporta várias arquiteturas, incluindo x86 e x86-64. Ele é conhecido por seu tamanho pequeno e desempenho rápido. 4 TASM (Turbo Assembler): Desenvolvido pela Borland, era muito popular no passado para desenvolvimento de software para MS-DOS e Windows. Ainda é usado em alguns cenários legados. Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 19 / 204
  • 20. Assemblers - continuação 1 GAS (GNU Assembler): O GAS é o assembler padrão da GNU Compiler Collection (GCC) e é usado principalmente em projetos de código aberto e sistemas Unix-like, como o Linux. 2 Keil A51 e A251: Compiladores assemblers específicos da Keil para arquiteturas 8051 e 8052, amplamente utilizados para desenvolvimento de sistemas embarcados. 3 ASM51: Assembler específico da Intel para a arquitetura 8051. 4 ARM Assemblers: Há vários compiladores assemblers específicos para as diversas arquiteturas da família ARM, como ARMASM (para ARM32), AARCH64 (para ARM64) e outros. 5 AVR Assemblers: Compiladores assemblers específicos para a arquitetura AVR utilizada em microcontroladores, como o avr-as da GNU Binutils. Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 20 / 204
  • 21. Editores de Ligação (linkers) 1 GNU Linker (ld): O GNU Linker é o linker padrão usado na maioria dos sistemas operacionais baseados em Unix, como Linux. É uma parte importante das ferramentas GNU Binutils. 2 Microsoft Linker (link): O Microsoft Linker é o linker padrão para sistemas Windows e faz parte do Microsoft Visual Studio e Microsoft Developer Tools. 3 Apple ld: Esse linker é usado em sistemas macOS e iOS para fazer a ligação de programas objetos. 4 Gold Linker: O Gold é um linker de alto desempenho desenvolvido como uma alternativa mais rápida ao GNU Linker (ld) para sistemas Linux. Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 21 / 204
  • 22. Editores de Ligação (linkers) - Continuação 1 LLD (LLVM Linker): O LLD é o linker do projeto LLVM e é usado para sistemas que utilizam o LLVM como infraestrutura de compilação, como algumas distribuições Linux. 2 BFD (Binary File Descriptor) Linker: O BFD é uma biblioteca de manipulação de formatos de arquivo binário que inclui funcionalidades de ligação. 3 SunOS/Solaris Linker: Usado em sistemas Solaris e outros sistemas baseados em SunOS. 4 OpenVMS Linker: Usado no sistema operacional OpenVMS. Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 22 / 204
  • 23. Estrutura de Um Programa em Assembly Um programa é dividido em seções tais como: 1 Seção de Dados (Data Section): Nesta seção, são definidas as variáveis e constantes utilizadas no programa. As declarações de dados podem incluir reservas de memória para armazenar valores ou informações, bem como definições de constantes. 2 Seção de BSS (Block Started by Symbol): Nesta seção, são declaradas variáveis que ocuparão espaço na memória, mas não são inicializadas com um valor específico. Elas serão inicializadas com zero quando o programa começar a ser executado. 3 Seção de Texto (Text Section ou Code Section): Essa é a parte principal do programa, onde o código assembly é colocado. Aqui estão as instruções que serão executadas pelo processador. É onde a lógica do programa é implementada. Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 23 / 204
  • 24. Seções de Um programa Assembly - Continuação 1 Seção de Inicialização (Initialization Section): Algumas arquiteturas de processadores possuem uma seção especial de inicialização onde é colocado o código responsável por configurar o ambiente antes de iniciar a execução do programa principal. 2 Seção de Importação e Exportação (Import and Export Section): Essa seção é usada em sistemas operacionais que suportam bibliotecas compartilhadas (shared libraries) ou DLLs (Dynamic Link Libraries). Ela contém informações sobre as funções que o programa usa de outras bibliotecas (importação) e funções que o programa disponibiliza para serem usadas por outros programas (exportação). 3 Seção de Tabelas (Tables Section): Em alguns programas, especialmente em sistemas embarcados, são utilizadas seções de tabelas para armazenar dados como vetores, matrizes, e outras estruturas de dados pré-definidas. Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 24 / 204
  • 25. Convenções de Sintaxes 1 Sintaxe Intel (ou x86): A sintaxe Intel é comumente usada em processadores da arquitetura x86, como os fabricados pela Intel e AMD. Nessa sintaxe, as operações são frequentemente escritas com o nome do mnemônico seguido pelos operandos, separados por vírgulas. Por exemplo: MOV AX, 42 ou ADD BX, AX. 2 Sintaxe AT&T (ou GNU): A sintaxe AT&T é comumente usada no GNU Assembler (GAS) e em algumas ferramentas relacionadas ao projeto GNU. Nessa sintaxe, os operandos são precedidos por sinais de cifrão ($) para imediatos e por porcentagens (%) para endereços de memória. Por exemplo: MOV $42, %AX ou ADD %AX, %BX. 3 Sintaxes ARM, MIPS, SPARC, etc. Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 25 / 204
  • 26. Declarações em Assembly 1 Instruções ou instruções executáveis, 2 Diretivas de montadora ou pseudo-ops, e 3 Macros. Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 26 / 204
  • 27. Sintaxe Básica (x86) 1 [label] mnemônico [operandos] [ ;comentários] Exemplos: 1 INC COUNT ; Incrementar a variável de memória COUNT. 2 MOV TOTAL , 48 ; Transferir o valor 48 para a variável de memória TOTAL 3 ADD AH , BH ; Adicionar o conteúdo do registrador BH ao registrador AH 4 AND MASK1 , 128 ; Realizar uma operação AND (E lógico) entre a variável MASK1 e 128. 5 ADD MARKS , 10 ; Adicionar 10 à variável MARKS. 6 MOV AL , 10 ; Transferir o valor 10 para o registrador AL. Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 27 / 204
  • 28. Tipos de Declarações 1 Comentários - Ignorados pelo Montador 2 Elementos de Formatação (Diretivas, Sinais de Pontuação, etc). - Usados para formatação geral do executável 3 Mnemônicos de Operações - Transformados em Códigos de Operações (opcodes) da máquina alvo (ex. x86). Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 28 / 204
  • 29. ’Iniciando 001_start.asm’ 1 ; nosso primeiro programa em assembly 2 ; adicionar comentários 3 global _start ; define o ponto de início de execução do programa 4 _start: 5 mov eax ,1 ; coloca o 1 no reg. eax (proposito geral) 6 ; neste caso o eax fornce o código que identifica uma system call 7 ; nesta caso a system call sera EXIT(X) onde o X será o valor no registrador ebx 8 mov ebx ,42 ; coloca o valor 42 no registrador de propósito geral ebx , e 9 int 0x80 ; chama uma iterrupção do kernel Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 29 / 204
  • 30. Para Compilar nasm -f elf 001_start.asm -o start.o Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 30 / 204
  • 31. Para Fazer a Ligação ld -m elf_i386 -s -o start start.o Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 31 / 204
  • 32. Verificando o Código de Saída echo $? Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 32 / 204
  • 33. Olhando para o Executável ’desassemblado’ objdump -d ./start ./start: file format elf32-i386 Disassembly of section .text: 08049000 .text: 8049000: b8 01 00 00 00 mov $0x1,%eax 8049005: bb 2a 00 00 00 mov $0x2a,%ebx 804900a: cd 80 int $0x80 Obs. No caso acima temos apenas um segmento (.text). Para visualizar o arquivo usar comando hexeditor ./start O assembly do lado direito está na sintaxe AT&T Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 33 / 204
  • 34. O que é ELF (Executable and Linkable Format) É um formato de arquivo binário amplamente utilizado em sistemas operacionais Unix e Unix-like para representar executáveis, bibliotecas compartilhadas e arquivos de objeto resultantes de compilação ou montagem de código-fonte. O formato ELF é uma especificação padronizada que define a estrutura interna dos arquivos executáveis e objetos, permitindo que diferentes componentes de um programa (código, dados, símbolos, seções, etc.) sejam organizados e interligados de maneira consistente. Ele foi originalmente desenvolvido para a plataforma Unix System V, mas foi adotado amplamente em outros sistemas Unix e em sistemas operacionais semelhantes, como o Linux. Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 34 / 204
  • 35. Opções do Linker opção -m (formatos) 1 elf_i386: Especifica que o formato do arquivo de saída será o ELF (Executable and Linkable Format) para a arquitetura x86 (32 bits). 2 elf_x86_64: Especifica que o formato do arquivo de saída será o ELF para a arquitetura x86-64 (64 bits). 3 som: Especifica que o formato do arquivo de saída será o formato SOM (System Object Module), que é um formato mais antigo usado em algumas arquiteturas e sistemas operacionais. 4 etc Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 35 / 204
  • 36. Opções do Linker -s (limpeza) 1 usada para instruir o linker a remover informações de símbolos não necessárias do arquivo executável final Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 36 / 204
  • 37. Segundo Programa 002_exit.asm 1 ; nosso segundo programa em assembly 2 global _start 3 _start: 4 mov eax ,1 ; coloca o valor 1 no registrador eax (proposito geral) 5 mov ebx ,42 ; coloca o valor 42 no registrador de ropoosito geral ebx , e 6 add ebx ,10 ; soma o valor 10 ao 42 que está no ebx e coloca no próprio ebx 7 int 0x80 ; chama uma iterrupção para que o kernel execute uma system call Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 37 / 204
  • 38. Segmentação da Memória Todo programa segue um ’modelo de memória’ que é efetivamente implantada na memória física do computador. Este modelo associa seções do programa aos segmentos: 1 Segmento de dados - É representado por .data e pelo .bss. A seção .data é declara a região de memória para os dados. Esta seção permanece estática durante todo o programa. 2 Segmento de código - É representado por .text. Isso define uma área na memória para os códigos de instrução. Esta também é uma área fixa. 3 Stack - Este segmento contém valores de dados passados para funções e procedimentos dentro do programa. Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 38 / 204
  • 39. Registradores /Registros 1 Registros gerais 2 Registros de controle 3 Registros do segmento Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 39 / 204
  • 40. Registradores Gerais 1 Registradores de Dados 2 Registradores de Ponteiros 3 Registradores de Índices Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 40 / 204
  • 41. Registradores de Dados 1 Como registros completos de dados de 32 bits: EAX, EBX, ECX, EDX. 2 Metades dos registros de 32 bits podem ser usadas como quatro registros de dados de 16 bits: AX, BX, CX e DX. 3 Metades inferiores e superiores dos quatro registros acima mencionados de 16 bits podem ser usados como oito registros de dados de 8 bits: AH, AL, BH, BL, CH, CL, DH e DL. Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 41 / 204
  • 42. Registradores Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 42 / 204
  • 43. Operações Aritméticas com Registradores 1 AX é o acumulador primário; é usado em entrada/saída e na maioria das instruções aritméticas. Por exemplo, na operação de multiplicação, um operando é armazenado em EAX ou AX ou AL de acordo com o tamanho do operando. 2 O BX é conhecido como registro base, pois pode ser usado em endereçamento indexado. 3 CX é conhecido como o registro de contagem, como o ECX, CX registra armazenar a contagem de loop em operações iterativas. 4 DX é conhecido como o registro de dados. Também é usado em operações de entrada/saída. Também é usado com registro AX junto com DX para operações de multiplicação e divisão envolvendo grandes valores Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 43 / 204
  • 44. Ponteiros 1 Indicador de instrução (IP) - O registro IP de 16 bits armazena o endereço de deslocamento da próxima instrução a ser executada. O IP em associação com o registro CS (como CS:IP) fornece o endereço completo da instrução atual no segmento de código. 2 Stack Pointer (SP) - O registro de SP de 16 bits fornece o valor de deslocamento dentro da pilha do programa. SP em associação com o registro SS (SS:SP) refere-se a ser posição atual de dados ou endereço dentro da pilha de programas. 3 Ponteiro base (BP) - O registro de BP de 16 bits ajuda principalmente na referência às variáveis de parâmetros passadas para uma subrotina. O endereço no registro SS é combinado com o deslocamento em BP para obter a localização do parâmetro. A BP também pode ser combinada com DI e SI como registro base para endereçamento especial Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 44 / 204
  • 45. Ponteiros Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 45 / 204
  • 46. Registradores de Índices Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 46 / 204
  • 47. Registradores de Controle O registrador do ponteiro de instrução de 32 bits e o registrador de flags de 32 bits combinados são considerados como os registros de controle. Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 47 / 204
  • 48. Flags (Sinalizadores) 1 Flag de estouro (OF) - Indica o estouro de um bit de alta ordem (bit mais à esquerda) de dados após uma operação aritmética. 2 Flag de direção (DF) - Determina a direção esquerda ou direita para mover ou comparar dados de sequência. Quando o valor do DF é 0, a operação de sequência toma a direção da esquerda para a direita e quando o valor é definido para 1, a operação de sequência toma direção da direita para a esquerda. 3 Flag de interrupção (IF) - Ele determina se as interrupções externas, como a entrada do teclado, etc., devem ser ignoradas ou processadas. Desativa a interrupção externa quando o valor é 0 e permite interrupções quando definido para 1. 4 Trap Flag (TF) - Permite configurar o funcionamento do processador no modo de etapa única. O programa DEBUG que usamos define a bandeira da armadilha, para que pudéssemos passar pela execução uma instrução de cada vez. Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 48 / 204
  • 49. Flags - Continuação 1 Sinalização (SF) - Mostra o sinal do resultado de uma operação aritmética. Este flag é definido de acordo com o sinal de um item de dados após a operação aritmética. O sinal é indicado pela alta ordem da parte mais esquerda. Um resultado positivo limpa o valor de SF para 0 e o resultado negativo o coloca em 1. 2 Flag Zero (ZF) - Indica o resultado de uma operação aritmética ou de comparação. Um resultado não zero libera a bandeira zero para 0, e um resultado zero o coloca em 1. 3 Flag auxiliar de transporte (AF) - Contém o transporte do bit 3 ao bit 4 após uma operação aritmética; usado para aritmética especializada. O AF é definido quando uma operação aritmética de 1 byte causa um transporte do bit 3 para o bit 4. Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 49 / 204
  • 50. Flags - Continuação 1 Flag de Paridade (PF) - Indica o número total de 1 bits no resultado obtido a partir de uma operação aritmética. Um número par de 1 bits limpa a bandeira de paridade para 0 e um número ímpar de 1 bits define a bandeira de paridade para 1. 2 Carry Flag (CF) - Contém o transporte de 0 ou 1 de um bit de alta ordem (mais à esquerda) após uma operação aritmética. Ele também armazena o conteúdo de última parte de uma operação de turno ou rotação. Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 50 / 204
  • 51. Flags Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 51 / 204
  • 52. Registradores de Segmento 1 Segmento de código - Contém todas as instruções a serem executadas. Um registro do segmento de código de 16 bits ou registro CS armazena o endereço inicial do segmento de código. 2 Segmento de Dados - Contém dados, constantes e áreas de trabalho. Um registro do segmento de dados de 16 bits ou o registro DS armazena o endereço inicial do segmento de dados. 3 Segmento de pilha - Contém dados e endereços de devolução de procedimentos ou subrotinas. É implementado como uma estrutura de dados ’stack’. O registro do Segmento stack ou o registro SS armazena o endereço inicial da pilha. Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 52 / 204
  • 53. Extras Além dos registros de DS, CS e SS, existem outros registros extras do segmento - ES (segmento extra), FS e GS, que fornecem segmentos adicionais para armazenamento de dados. Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 53 / 204
  • 54. Hora do Hello World, ou melhor, queima*** 003_queima.asm 1 section .text 2 global _start ; deve ser declarado para o linker (ld) 3 _start: ; ponto de entrada para o linker 4 mov edx ,len ; comprimento da mensagem em edx 5 mov ecx ,msg ; mensagem a ser escrita 6 mov ebx ,1 ; descritor de arquivo (stdout) 7 mov eax ,4 ; chamada do sistema (sys_write) 8 int 0x80 ; chama o kernel 9 10 mov eax ,1 ; chamada do sistema (sys_exit) 11 int 0x80 ; chama o kernel 12 13 section .data 14 msg db ’Queima *** do IFCe!’, 0xa ; string 15 len equ $ - msg ; comprimento da string Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 54 / 204
  • 55. Registradores de 64 Bits De uso geral: 1 RAX, RBX, RCX, RDX: Registradores de uso geral de 64 bits que são usados para armazenar dados e realizar operações aritméticas. 2 RSI, RDI, RBP, RSP: Mais registradores de uso geral que também são usados para manipulação de dados e endereçamento. 3 R8 - R15: Registradores adicionais de uso geral disponíveis em arquiteturas de 64 bits. Eles são frequentemente usados para armazenar valores temporários e parâmetros de função. Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 55 / 204
  • 56. Registradores de 64 Bits Registradores de Ponto Flutuante 1 XMM0 - XMM15: Registradores de ponto flutuante de 128 bits. Eles são usados para realizar operações de ponto flutuante em dados individuais ou em vetores de dados. Registradores de Vetor(SIM - Single Instruction Multiple Data) 1 YMM0 - YMM15: Registradores de vetor de 256 bits. Eles são usados para executar instruções SIMD em dados vetoriais, especialmente em operações de ponto flutuante de precisão única. 2 ZMM0 - ZMM31: Registradores de vetor de 512 bits. Eles são encontrados em algumas arquiteturas avançadas de 64 bits e são usados para realizar operações SIMD em dados vetoriais, especialmente em operações de ponto flutuante de precisão dupla. Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 56 / 204
  • 57. Registradores de 64 Bits Registradores de Controle 1 RFLAGS: Registrador de 64 bits que armazena diversas informações de status e controle, como flags de condição e de controle de interrupções. 2 RIP: Registrador de 64 bits que contém o endereço da próxima instrução a ser executada (instruction pointer). Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 57 / 204
  • 58. Chamadas do Sistema (Linux) - Trap 1 Ponha o número da chamada ao Sistema no registrador EAX 2 Ponha os argumentos para a chamada no registrador EBX, ECX, etc 3 Chame a interrupção (80h). 4 O resultado estará no registrador EAX Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 58 / 204
  • 59. Exemplo de Chamada ao Sistema 1 mov eax ,1 ; número da chamada ao sistema(sys_exit) 2 int 0x80 ; chama o kernel Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 59 / 204
  • 60. Chamadas ao Sistema Linux Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 60 / 204
  • 61. Lista Completa de Linux System Calls http://web.archive.org/web/20160303181025/http: //docs.cs.up.ac.za/programming/asm/derick_tut/syscalls.html Também podemos encontrar a lista no arquivo ’unistd.h’ Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 61 / 204
  • 62. Imprimindo Mensagens - 004_ninestar 1 section .text 2 global _start 3 _start: 4 mov edx ,len ; comprimento da mensagem 5 mov ecx ,msg ; mensagem para escrever 6 mov ebx ,1 ; descritor do arquivo (stdout) 7 mov eax ,4 ; número da chamada ao sistema (sys_write) 8 int 0x80 ; chama o kernel 9 10 mov edx ,9 11 mov ecx ,s2 12 mov ebx ,1 13 mov eax ,4 14 int 0x80 Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 62 / 204
  • 63. Imprimindo Mensagens 1 2 mov edx ,l2 3 mov ecx ,msg2 4 mov ebx ,1 5 mov eax ,4 6 int 0x80 7 8 mov eax ,1 ; (sys_exit) 9 int 0x80 ; chama o kernel 10 11 section .data 12 msg db ’Imprimindo 9 asteriscos ’,0xa ; messagem 13 len equ $-msg ; Comprimento da mensagem 14 s2 times 9 db ’*’ 15 msg2 db 0xa ; mudança de linha 16 l2 equ $ - msg2 Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 63 / 204
  • 64. Operandos A maioria das instruções de linguagem de montagem exigem operandos para serem processadas. Um endereço de operando fornece a localização onde os dados a serem processados são armazenados. Algumas instruções não requerem operandos, enquanto algumas outras instruções podem exigir um, dois ou três operandos Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 64 / 204
  • 65. Visualizando o Código Objeto objdump -D 004_ninestar Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 65 / 204
  • 66. Endereçamento 1 Quando uma instrução requer dois operandos. O primeiro normalmente representa o destino o qual poderá conter dados ou localização de memória e o segundo operador é a fonte. 2 A fonte conterá dados a serem entregues (endereçamento imediato) ou o endereço (no registrador ou na memória) dos dados. Geralmente as fontes permanecem inalteradas após a operação. Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 66 / 204
  • 67. Modos de Endereçamento 1 Endereçamento de Registrados 2 Endereçamento Imediato 3 Endereçamento de Memória Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 67 / 204
  • 68. Endereçamento de Registrador Neste modo o registrador contém o operando. Dependendo da instrução o operador pode ser o primeiro, o segundo ou ambos os operandos. Exs: MOV DX, TAX_RATE ; O registrador no primeiro operando MOV COUNT, CX ; Registrador no Segundo operando MOV EAX, EBX ; Ambos os operandos são registradores Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 68 / 204
  • 69. Endereçamento Imediato O operando consiste em um valor constante ou uma expressão BYTE_VALUE DB 150 ; Definido tipo chamado de BYTE_VALUE WORD_VALUE DW 300 ; Definido tipo chamado de WORD_VALUE ADD BYTE_VALUE, 65 ; Operando imediato 65 MOV AX, 45H ; Constante imediata 45H is transferida para AX Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 69 / 204
  • 70. Endereçamento Direto na Memória Neste caso faz-se necessário o uso do segmento de dados. Esse uso é lento. Para saber a localização exata do dado na memória precisamos do endereço inicial do segmento o qual normalmente se encontra no registrador DS e um valor de offset. Este offset é chamado de endereço efetivo. Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 70 / 204
  • 71. Endereçamento Direto na Memória O valor do offset é especificado diretamente como parte da instrução normalmente indicado no nome da variável. O assembler calcula o valor do offset e mantém uma tabela de símbolos que guarda os valores de offset de todas as variáveis usadas no programa. Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 71 / 204
  • 72. Endereçamento Direto da Memória Um dos operandos se refere a uma localização de memória e o outro referencia o registrador. ADD BYTE_VALUE, DL ; Põe o registrador em uma posição de memória MOV BX, WORD_VALUE ; O registrador recebe o valor da memória Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 72 / 204
  • 73. Endereçamento Offset Direto Este modo de endereçamento usa operadores aritméticos para modificar um endereço. Sejam os dados: BYTE_TABLE DB 14, 15, 22, 45 ; Tabelas de bytes WORD_TABLE DW 134, 345, 564, 123 ; Tabelas de words As operações abaixo carregam dados da tabela nos registradores: MOV CL, BYTE_TABLE[2] ; Pega o 3o elemento da tabela BYTE_TABLE MOV CL, BYTE_TABLE + 2 ; Pega o 3o elemento da tabela BYTE_TABLE MOV CX, WORD_TABLE[3] ; Pega o 4o elemento da tabela WORD_TABLE MOV CX, WORD_TABLE + 3 ; Pega o 4o elemento da tabela WORD_TABLE Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 73 / 204
  • 74. Endereçamento indireto da Memória Este modo utiliza a capacidade do endereçamento segment:offset. Geralmente os registradores de base (EBX, EBP ou BX,BP) e os registradores de índice (DI,SI) codificados entre colchetes são usados para estes propósitos. Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 74 / 204
  • 75. Endereçamento Indireto da Memória Este tipo de endereçamento é geralmente usado para variáveis contendo vários elementos como matrizes que são armazenadas, digamos, no registrador EBX. A seguir vemos como acessar diferentes elementos das variáveis. 1 MY_TABLE TIMES 10 DW 0 ; Aloca 10 palavras (word)(2 bytes) inicializadas com 0 2 MOV EBX , [MY_TABLE] ; Endereço efetivo de MY_TABLE in EBX 3 MOV [EBX], 110 ; MY_TABLE [0] = 110 4 ADD EBX , 2 ; EBX = EBX +2 5 MOV [EBX], 123 ; MY_TABLE [1] = 123 Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 75 / 204
  • 76. A Instrução MOV 1 MOV destino ,fonte 2 MOV register , register 3 MOV register , immediate 4 MOV memory , immediate 5 MOV register , memory 6 MOV memory , register Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 76 / 204
  • 77. Especificadores de Tipos Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 77 / 204
  • 78. Variáveis Alocação de memória para variáveis inicializadas nome_variável diretiva_definição valor_inicial Exs. 1 choice DB ’y’ 2 number DW 12345 3 neg_number DW -12345 4 big_number DQ 123456789 5 real_number1 DD 1.234 6 real_number2 DQ 123 .456 Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 78 / 204
  • 79. Diretivas Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 79 / 204
  • 80. Entrada e Saída - 005_entsaida 1 ; segmento de dados 2 section .data 3 ; mensagem solicitando a entrada de um número 4 userMsg db ’Digite um numero: ’ 5 ; comprimento da mensagem 6 lenUserMsg equ $-userMsg 7 dispMsg db ’Voce digitou: ’ 8 lenDispMsg equ $-dispMsg 9 10 ;Dados não inicializados 11 section .bss 12 num resb 5 13 14 ; segmento de código 15 section .text 16 global _start Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 80 / 204
  • 81. Entrada e Saída - 005_entsaida 1 _start: 2 ; Mensagem para o usuário (prompt) 3 ; Observe a sequência dos registradores A - Numero SYSCALL , B - Descritor , 4 ; C - mensagem , D - Comprimento 5 mov eax , 4 6 mov ebx , 1 7 mov ecx , userMsg 8 mov edx , lenUserMsg 9 int 80h 10 11 ; Lê e armazena a entrada fornecida pelo usuário 12 mov eax , 3 13 mov ebx , 2 14 mov ecx , num 15 ;5 bytes (numerico , 1 para o sinal (-/+)) 16 mov edx , 5 17 int 80h Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 81 / 204
  • 82. Entrada e Saída - 005_entsaida 1 ; Saída da mensagem ’voce digitou ’ 2 mov eax , 4 3 mov ebx , 1 4 mov ecx , dispMsg 5 mov edx , lenDispMsg 6 int 80h 7 ; saída do número digitado 8 mov eax , 4 9 mov ebx , 1 10 mov ecx , num 11 mov edx , 5 12 int 80h 13 ; saída final 14 mov eax , 1 15 mov ebx , 0 16 int 80h Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 82 / 204
  • 83. Entrada e Saída - 006_mov Chamadas a subrotinas são feitas com o comando call e saltos com o jmp. Ver a listagem abaixo 1 section .data 2 nome db ’Mano Josuelito ’,0xa 3 lenUserMsg equ $-nome 4 newLineMsg db 0xa 5 newLineLen equ $-newLineMsg 6 section .text 7 global _start 8 _start: 9 ;Escrevendo o nome Manoel Josuelito 10 ;Comprimento da mensagem 11 mov edx ,lenUserMsg 12 ;Mensagem a ser escrita 13 mov ecx , nome 14 ;Descritor do arquivo (stdout) 15 mov ebx ,1 Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 83 / 204
  • 84. Entrada e Saída - 006_mov 1 ;Chamada de Sistema 2 mov eax ,4 3 ;Chama o kernel 4 int 0x80 5 ;Muda o nome para ’Mary ’ 6 mov [nome],dword ’Mary ’ ;dword 7 ;Escrevendo o nome 8 ;Comprimento 9 mov edx ,lenUserMsg 10 ;Mensagem a escrever 11 mov ecx ,nome 12 ;Descritor do Arquivo 13 mov ebx ,1 14 ;Chamada do sistema 15 mov eax ,4 16 ;Chama o kernel 17 int 0x80 Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 84 / 204
  • 85. Entrada e Saída - 006_mov 1 ;chama subrotina 2 call _novaLinha 3 ;salta para saida 4 jmp _saida 5 6 _novaLinha: 7 mov edx ,newLineLen 8 mov ecx ,newLineMsg 9 mov ebx ,1 10 mov eax ,4 11 int 0x80 12 ret 13 _saida: 14 ; Chamada sys_exit 15 mov eax ,1 16 ;chama o kernel 17 int 0x80 Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 85 / 204
  • 86. Dados 1 Bytes de characteres são armazenados com seus valores ascii em hexadecimal 2 Valores decimais são automaticamente convertidos para o seu equivalente de 16 bits e armazenados como números hexadecimal 3 Processadores usam ordenamento de bytes little-endian 4 Números negativos são convertidos para sua representação em complemento de 2 5 Números em ponto flutuante são representados usando 32 (short) e 64 bits (long) Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 86 / 204
  • 87. Exemplo de Diretiva 1 section .text 2 global _start 3 _start: 4 ; comprimento da mensagem 5 mov edx ,1 6 ; Mensagem para escrever 7 mov ecx ,choice 8 ; Descritor de arquivo (stdout) 9 mov ebx ,1 10 ; Número da chamada ao sistema 11 mov eax ,4 12 int 0x80 13 ; sys_exit 14 mov eax ,1 15 int 0x80 16 section .data 17 choice DB ’y’ Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 87 / 204
  • 88. Alocação de Dados não Inicializados Diretivas de reserva são usadas para reservar espaço para dados não inicializados. Os tipos de diretivas são: Diretiva Objetivo RESB Reserve a Byte RESW Reserve a Word RESD Reserve a Doubleword RESQ Reserve a Quadword REST Reserve a Ten Bytes Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 88 / 204
  • 89. Definições e Inicializações Podemos ter múltiplas definições e inicializações como: choice DB ’Y’ ;ASCII of y = 79H number1 DW 12345 ;12345D = 3039H number2 DD 12345679 ;123456789D = 75BCD15H A diretiva TIMES permite múltiplas inicializações para o mesmo valor. Por exemplo uma matriz mat de tamanho 9 pode ser definida e inicializada com zeros como segue: mat TIMES 9 DW 0 Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 89 / 204
  • 90. Pequeno Detalhe do Times 008_times Times pode ser usado para multiplicar bytes 1 section .text 2 global _start 3 _start: 4 ;comprimento da mensagem 5 mov edx ,9 6 ;Mensagem para escrever 7 mov ecx , stars 8 ; fd 9 mov ebx ,1 10 ; sys_write 11 mov eax ,4 12 int 0x80 Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 90 / 204
  • 91. Pequeno Detalhe do Times 008_times 1 _saida: 2 mov edx ,newLineLen 3 mov ecx ,newLineMsg 4 mov ebx ,1 5 mov eax ,4 6 int 0x80 7 ; sys_exit 8 mov eax ,1 9 int 0x80 10 section .data 11 ; usando times 12 stars times 9 db ’*’ 13 newLineMsg db 0xa 14 newLineLen equ $-newLineMsg Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 91 / 204
  • 92. Constantes - Diretivas 1 EQU 2 %assign 3 %define Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 92 / 204
  • 93. EQU EQU é usada para definir constantes. CONSTANT_NAME EQU expression. Ex. TOTAL_STUDENTS equ 50 Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 93 / 204
  • 94. %assign A diretiva %assign pode ser usada para definir constantes numéricas como a diretiva EQU. Esta diretiva permite a redefinição. Esta diretiva é semelhante a #define do c Ex. %define PTR [EBP+4] Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 94 / 204
  • 95. 009_equ.asm 1 %assign SYS_EXIT 1 2 %define SYS_WRITE 4 3 ;SYS_EXIT equ 1 4 ;SYS_WRITE equ 4 5 STDIN equ 0 6 STDOUT equ 1 7 section .text 8 global _start 9 _start: 10 mov eax , SYS_WRITE 11 mov ebx , STDOUT 12 mov ecx , msg1 13 mov edx , len1 14 int 0x80 Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 95 / 204
  • 96. 009_equ.asm 1 mov eax , SYS_WRITE 2 mov ebx , STDOUT 3 mov ecx , msg2 4 mov edx , len2 5 int 0x80 6 mov eax , SYS_WRITE 7 mov ebx , STDOUT 8 mov ecx , msg3 9 mov edx , len3 10 int 0x80 11 mov eax ,SYS_EXIT 12 int 0x80 Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 96 / 204
  • 97. 009_equ.asm 1 section .data 2 msg1 db ’Alo programadores!’,0xA ,0xD 3 len1 equ $ - msg1 4 5 msg2 db ’Benvindos ao mundo da ,’, 0xA ,0xD 6 len2 equ $ - msg2 7 8 msg3 db ’Programação Assembly Linux! ’,0xA ,0xD 9 len3 equ $- msg3 Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 97 / 204
  • 98. Aritmética em Assembly A instrução INC é usada para incrementar um operador de um. Funciona com somente um operando que pode ser um registrador ou estar na memória. Sintaxe: INC destination Exs: 1 INC EBX ; Incrementa registrador de 32-bit 2 INC DL ; Incrementa registrador de 8-bit register 3 INC [count] ; Incrementa a variável count Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 98 / 204
  • 99. Aritmética em Assembly Da forma semelhante ao operador INC, o operador DEC é utilizado para decrementar valores. Ex. 1 segment .data 2 count dw 0 3 value db 15 4 5 segment .text 6 inc [count] 7 dec [value] 8 mov ebx , count 9 inc word [ebx] 10 mov esi , value 11 dec byte [esi] Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 99 / 204
  • 100. Adição e Subtração Operadores ADD e SUB ADD/SUB destination, source Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 100 / 204
  • 101. 010_addsub.asm 1 SYS_EXIT equ 1 2 SYS_READ equ 3 3 SYS_WRITE equ 4 4 STDIN equ 0 5 STDOUT equ 1 6 segment .data 7 msg1 db "Entre com um digito", 0xA ,0xD 8 len1 equ $- msg1 9 msg2 db "Entre com um segundo digito", 0xA ,0xD 10 len2 equ $- msg2 11 msg3 db "A soma eh: " 12 len3 equ $ - msg3 13 newLineMsg db 0xa 14 newLineLen equ $-newLineMsg Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 101 / 204
  • 102. 010_addsub.asm 1 segment .bss 2 num1 resb 2 3 num2 resb 2 4 res resb 1 5 section .text 6 global _start 7 _start: 8 mov eax , SYS_WRITE 9 mov ebx , STDOUT 10 mov ecx , msg1 11 mov edx , len1 12 int 0x80 Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 102 / 204
  • 103. 010_addsub.asm 1 mov eax , SYS_READ 2 mov ebx , STDIN 3 mov ecx , num1 4 mov edx , 2 5 int 0x80 6 mov eax , SYS_WRITE 7 mov ebx , STDOUT 8 mov ecx , msg2 9 mov edx , len2 10 int 0x80 11 mov eax , SYS_READ 12 mov ebx , STDIN 13 mov ecx , num2 14 mov edx , 2 15 int 0x80 Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 103 / 204
  • 104. 010_addsub.asm 1 mov eax , SYS_WRITE 2 mov ebx , STDOUT 3 mov ecx , msg3 4 mov edx , len3 5 int 0x80 6 ; movendo o primeiro número para o registrador eax e o segundo para ebx 7 ; e subtraindo o ascii 0 para converter em número decimal 8 mov eax , [num1] 9 sub eax , ’0’ 10 mov ebx , [num2] 11 sub ebx , ’0’ 12 ; soma eax e ebx 13 add eax , ebx Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 104 / 204
  • 105. 010_addsub.asm 1 ; adiciona 0 para converter a soma de decimal para ASCII 2 add eax , ’0’ 3 ; armazenando a soma no local de memoria referenciado por res 4 mov [res], eax 5 ; imprime a soma 6 mov eax , SYS_WRITE 7 mov ebx , STDOUT 8 mov ecx , res 9 mov edx , 1 10 int 0x80 11 exit: 12 mov edx ,newLineLen 13 mov ecx ,newLineMsg 14 mov ebx ,STDOUT 15 mov eax ,SYS_WRITE 16 int 0x80 Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 105 / 204
  • 106. Multiplicação (Não tão simples) MUL/IMUL operando MUL = Números sem sinal IMUL = Com sinal Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 106 / 204
  • 107. Multiplicando dois Bytes Um operando (multiplicando) está no registrador AL e o outro (multiplicador) é um byte na memória ou em outro registrador. O produto vai para AX. Os 8 bits de mais alta ordem (à esquerda) são armazenados em AH e os 8 bits de mais baixa ordem vão para AL Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 107 / 204
  • 108. Multiplicando dois Words O Multiplicando deve estar no registro AX e o multiplicador é um word na memória ou em outro registrador. Por exemplo MUL DX multiplica DX por AX. O resultado é um doubleword o qual necessitará de dois registradores. A parte de mais alta ordem do resultado vai para DX e a parte de mais baixa ordem vai para AX Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 108 / 204
  • 109. Multiplicando dois doublewords Quando dois doublewords são multiplicados, o multiplicando deve estar em EAX e o multiplicador será um doubleword na memória ou em outro registrador. O produto ira para EDX:EAX (32 bits em cada) Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 109 / 204
  • 110. Multiplicando (011_mult) 1 section .text 2 global _start 3 _start: 4 mov al ,’9’ ; al = 3 5 sub al ,’0’ ; al = numero 6 mov bl , ’2’ ; bl = ’2’ 7 sub bl , ’0’ ; bl = 2 8 mul bl ; AH:AL = bl * al => 0:6 9 add al , ’0’ ; al = 6 10 11 mov [res], al ; al (6) é colocado na referência de res 12 mov ecx ,msg ; mensagem preparada para ser enviada 13 mov edx , len ; comprimento daq mensagem setada 14 mov ebx ,1 ;(stdout) 15 mov eax ,4 ; (sys_write) 16 int 0x80 Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 110 / 204
  • 111. Multiplicando (011_mult) 1 mov ecx ,res ; resultado é copiado para o ecx 2 mov edx , 1 ; comprimento (1 byte) 3 mov ebx ,1 ;(stdout) 4 mov eax ,4 ; (sys_write) 5 int 0x80 ; 6 7 mov edx ,newLineLen 8 mov ecx ,newLineMsg 9 mov ebx ,1 10 mov eax ,4 11 int 0x80 12 13 xor ebx , ebx 14 mov eax ,1 ; (sys_exit) 15 int 0x80 ; Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 111 / 204
  • 112. Multiplicando (011_mult) 1 ; segmento de dados 2 section .data 3 msg db "O resultado eh:", 0xA ,0xD 4 len equ $- msg 5 newLineMsg db 0xa 6 newLineLen equ $-newLineMsg 7 8 ; dados não inicializados 9 segment .bss 10 res resb 1 Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 112 / 204
  • 113. Dividindo A divisão gera dois elementos : o quociente e o resto. Pode ocorrer overflow que gera uma interrupção. 1 DIV : Divisão sem sinal 2 IDIV : com sinal Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 113 / 204
  • 114. Dividindo por Byte Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 114 / 204
  • 115. Dividindo por Word Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 115 / 204
  • 116. Dividindo por Doubleword Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 116 / 204
  • 117. Dividindo (012_div) 1 section .text 2 global _start 3 _start: 4 mov ax ,’8’ 5 sub ax ,’0’ ; eax conterá o número 8 6 mov bl , ’2’ 7 sub bl , ’0’ ; bl conterá o número 2 8 div bl ; ax é dividido por bl 9 add ax , ’0’ ; convertido em número 10 mov [res], ax ; ax vai para res 11 mov ecx ,msg ; prepara msg 12 mov edx , len 13 mov ebx ,1 14 mov eax ,4 ; (sys_write) 15 int 0x80 Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 117 / 204
  • 118. Dividindo (012_div) 1 mov ecx ,res ; res vai para ecx 2 mov edx , 1 3 mov ebx ,1 ;(stdout) 4 mov eax ,4 ;(sys_write) 5 int 0x80 6 mov eax ,1 ;(sys_exit) 7 int 0x80 8 9 section .data 10 msg db "O resultado é:", 0xA ,0xD 11 len equ $- msg 12 segment .bss 13 res resb 1 Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 118 / 204
  • 119. Instruções Lógicas Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 119 / 204
  • 120. And A instrução AND é usada para dar suporte a expressões realizando a operação AND bit a bit. A operação retorna 1 se os bits que se casam na mesma posição são 1, senão retornam zero. Também usada para limpeza de bits. Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 120 / 204
  • 121. Dividindo (013_and) 1 section .text 2 global _start ;declaração do ponto de entrada main 3 _start: ;declaraão para o linker do ponto de entrada 4 mov ax , 7h ;ponto 8h no registro ax 5 and ax , 1 ;operação and com 1 6 jz evnn ; salta para o endereço referenciado por evnn caso a ax seja zero (número par) 7 mov eax , 4 ;(sys_write) 8 mov ebx , 1 ;(stdout) 9 mov ecx , odd_msg ;message to write 10 mov edx , len2 ;length of message 11 int 0x80 ;call kernel 12 jmp outprog Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 121 / 204
  • 122. Dividindo (013_and) 1 evnn: 2 mov ah , 09h 3 mov eax , 4 ;(sys_write) 4 mov ebx , 1 ;(stdout) 5 mov ecx , even_msg ;mensagem 6 mov edx , len1 ;comprimento da mensagem 7 int 0x80 8 outprog: 9 mov edx ,newLineLen 10 mov ecx ,newLineMsg 11 mov ebx ,1 12 mov eax ,4 13 int 0x80 14 mov eax ,1 ;(sys_exit) 15 int 0x80 Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 122 / 204
  • 123. Dividindo (013_and) 1 section .data 2 even_msg db ’Número Par!’ ;mensagem par 3 len1 equ $ - even_msg 4 5 odd_msg db ’Número ímpar!’ ;mensagem ímpar 6 len2 equ $ - odd_msg 7 8 newLineMsg db 0xa 9 newLineLen equ $-newLineMsg Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 123 / 204
  • 124. Or Implementa o OU bit a bit Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 124 / 204
  • 125. Or (014_or) 1 section .text 2 global _start 3 _start: 4 mov al , 5 ;pondo 5 no al 5 mov bl , 3 ;pondo 3 in the bl 6 or al , bl ;or al e bl , resultado = 7 7 add al , byte ’0’ ;convertendo decimal para ascii 8 mov [result],al 9 mov eax , 4 10 mov ebx , 1 11 mov ecx , result 12 mov edx , 1 13 int 0x80 Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 125 / 204
  • 126. Or (014_or) 1 2 outprog: 3 mov eax ,1 ; (sys_exit) 4 int 0x80 5 section .bss 6 result resb 1 Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 126 / 204
  • 127. Xor Ou exclusivo Bit a Bit Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 127 / 204
  • 128. Instrução Test A instrução TEST funciona da mesma forma que a operação AND, mas diferentemente dessa, ela não muda o primeiro operando. Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 128 / 204
  • 129. Instrução Not Operação NOT bit a bit Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 129 / 204
  • 130. Comparações A instrução CMP compara dois operandos. É geralmente usado em execução condicional. Esta instrução basicamente subtrai um operando do outro para comparar se os operandos são iguais ou não. Não modifica os operandos. É usado juntamente com a instrução de salto condicional para a tomada de decisões. Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 130 / 204
  • 131. CMP CMP destino, fonte CMP compara dois campos de dados numéricos. O operando de destino pode estar no registro ou na memória. O operando de origem pode ser uma constante (imediata), registrador ou memória Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 131 / 204
  • 132. CMP + JLE 1 CMP DX ,00 ; Compare o valor DX com zero 2 JE L7 ; Se sim , então pule para rótulo L7 3 L1: 4 INC EDX 5 CMP EDX , 10; Compara se o contador chegou a 10 6 JLE L1; Se for menor ou igual a 10, então salta para L1: 7 L7: 8 ... Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 132 / 204
  • 133. Desvios 1 Condicionais 2 Incondicionais Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 133 / 204
  • 134. Desvios Incondicionais Como mencionado anteriormente, isso é realizado pela instrução JMP. (goto) Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 134 / 204
  • 135. Desvios Condicionais Se alguma condição especificada estiver satisfeita, no salto condicional, o fluxo de controle será transferido para uma instrução de destino. Existem inúmeras instruções de salto condicional, dependendo da condição e dos dados. Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 135 / 204
  • 136. Tipos de JUMPS Jumps usado com comparações aritméticas de dados com sinal Instrução Descrição Flag Testado JE/JZ Jump Equal or Jump Zero ZF JNE/JNZ Jump not Equal or Jump Not Zero ZF JG/JNLE Jump Greater or Jump Not Less/Equal OF, SF, ZF JGE/JNL Jump Greater/Equal or Jump Not Less OF, SF JL/JNGE Jump Less or Jump Not Greater/Equal OF, SF JLE/JNG Jump Less/Equal or Jump Not Greater OF, SF, ZF Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 136 / 204
  • 137. Tipos de JUMPS Jumps usado com comparações aritméticas de dados sem sinal Instrução Descrição Flag Testado JE/JZ Jump Equal or Jump Zero ZF JNE/JNZ Jump not Equal or Jump Not Zero ZF JA/JNBE Jump Above or Jump Not Below/Equal CF, ZF JAE/JNB Jump Above/Equal or Jump Not Below CF JB/JNAE Jump Below or Jump Not Above/Equal CF JBE/JNA Jump Below/Equal or Jump Not Above AF, CF Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 137 / 204
  • 138. Testando os Registros de Flag Instrução Descrição Flag Testado JXCZ Jump if CX is Zero none JC Jump If Carry CF JNC Jump If No Carry CF JO Jump If Overflow OF JNO Jump If No Overflow OF JP/JPE Jump Parity or Jump Parity Even PF JNP/JPO Jump No Parity or Jump Parity Odd PF JS Jump Sign (negative value) SF JNS Jump No Sign (positive value) SF Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 138 / 204
  • 139. Jumps (015_jumps) 1 section .text 2 global _start 3 _start: 4 mov ecx , [num1] 5 cmp ecx , [num2] 6 jg check_third_num 7 mov ecx , [num2] 8 check_third_num : 9 cmp ecx , [num3] 10 jg _exit 11 mov ecx , [num3] 12 _exit: 13 mov [largest], ecx 14 mov ecx ,msg 15 mov edx , len 16 mov ebx ,1 ;file descriptor (stdout) 17 mov eax ,4 ;system call number (sys_write) 18 int 0x80 ;call kernel Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 139 / 204
  • 140. Jumps (015_jumps) 1 mov ecx ,largest 2 mov edx , 2 3 mov ebx ,1 4 mov eax ,4 ;sys_write 5 int 0x80 6 mov eax , 1 7 int 80h 8 section .data 9 msg db "O maior digito eh: ", 0xA ,0xD 10 len equ $- msg 11 num1 dd ’47’ 12 num2 dd ’22’ 13 num3 dd ’31’ 14 15 segment .bss 16 largest resb 2 Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 140 / 204
  • 141. Loops Simples 1 MOV CL , 10 2 L1: 3 <LOOP -BODY > 4 DEC CL 5 JNZ L1 Observe o controle que o jnz faz do loop após o valor de cl ser decrementado. Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 141 / 204
  • 142. Loop Automático 1 mov ECX ,10 2 l1: 3 <corpo do loop > 4 loop l1 O registrador ecx é usado para o controle do loop. No caso o loop será executado 10 vezes. Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 142 / 204
  • 143. Jumps (016_loops) 1 section .text 2 global _start 3 _start: 4 mov ecx ,10 5 mov eax , ’1’ 6 l1: 7 mov [num], eax 8 mov eax , 4 9 mov ebx , 1 10 push ecx 11 mov ecx , num 12 mov edx , 1 13 int 0x80 Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 143 / 204
  • 144. Jumps (016_loops) 1 mov eax , [num] 2 sub eax , ’0’ 3 inc eax 4 add eax , ’0’ 5 pop ecx 6 loop l1 7 mov eax ,1 ;(sys_exit) 8 int 0x80 9 section .bss 10 num resb 1 Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 144 / 204
  • 145. Números Para trabalharmos com números na memória temos convertido oscaracteres ASCII no seu correspondente binário e vice versa através de soma ou subtração. O números na entrada ou saída serão strings ASCII e precisarão ser convertidos. Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 145 / 204
  • 146. Representação ASCII de Números Neste caso os números são representados em strings de códigos ASCII. Ex. 1234 = 31 32 33 34H Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 146 / 204
  • 147. Conversão de Números para ASCII Para esta conversão temos as seguintes instruções: AAA - ASCII Adjust After Addition AAS - ASCII Adjust After Subtraction AAM - ASCII Adjust After Multiplication AAD - ASCII Adjust Before Division Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 147 / 204
  • 148. Jumps (017_ajustaascii) 1 section .text 2 global _start 3 _start: 4 sub ah , ah 5 mov al , ’9’ 6 sub al , ’3’ 7 aas 8 or al , 30h 9 mov [res], ax 10 mov edx ,len ;comprimento da mensagem 11 mov ecx ,msg ;messagem a escrever 12 mov ebx ,1 ; (stdout) 13 mov eax ,4 ; (sys_write) 14 int 0x80 ; kernel Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 148 / 204
  • 149. Jumps (017_ajustaascii) 1 mov edx ,1 ; comprimento 2 mov ecx ,res ; mensagem 3 mov ebx ,1 ; (stdout) 4 mov eax ,4 ;(sys_write) 5 int 0x80 ; kernel 6 mov eax ,1 ; (sys_exit) 7 int 0x80 ; kernel 8 section .data 9 msg db ’O Resultado é:’,0xa 10 len equ $ - msg 11 section .bss 12 res resb 1 Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 149 / 204
  • 150. Representação BCD Existem dois tipos de representação BCD: 1 Representação BCD não compactada 2 Representação BCD compactada Na representação BCD não compactada, cada byte armazena o equivalente binário de um dígito decimal. Por exemplo, o número 1234 é armazenado como - 01 02 03 04H Na representação compactada cada byte pode represetar dois dígitos sendo cada dígito representado por 4 bits. Assim 1234 pode ser representado como -12 34h Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 150 / 204
  • 151. BCD Não Compactado As instruções para tratar estes números são: AAM - ASCII Adjust After Multiplication AAD - ASCII Adjust Before Division De fato as 4 instruções acima (slide anterior) podem ser usadas neste tipo de dado. Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 151 / 204
  • 152. BCD Compactado As instruções para tratar estes números são: DAA - Decimal Ajust After Addition DAS - Decimal Ajust After Subtraction Não há suporte para multiplicação e divisão na representação BCD compactada. Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 152 / 204
  • 153. BCD (018_ajusta_bcd) 1 section .text 2 global _start 3 _start: 4 mov esi , 4 ;posiçao do dígito mais à direita 5 mov ecx , 5 ;número de dígitos 6 clc ;Limpa o flag de carry 7 add_loop: 8 mov al , [num1 + esi] ; Adiciona o segundo operando a AL , considerando o flag de carry 9 adc al , [num2 + esi] ; idem 10 aaa ; Ascii adjust after addition 11 pushf ;empurrar o valor do registro de flags do processador na pilha 12 or al , 30h ;converte para o ascii correto 13 popf ;recupera os flags Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 153 / 204
  • 154. BCD (018_ajusta_bcd) 1 mov [sum + esi], al ; vai guardando os digitos em sum 2 dec esi 3 loop add_loop 4 mov edx ,len ; comprimento da mensagem 5 mov ecx ,msg ; mensagem 6 mov ebx ,1 ; (stdout) 7 mov eax ,4 ; (sys_write) 8 int 0x80 ; kernel 9 mov edx ,5 ; comrimento da mensagem 10 mov ecx ,sum ; mensagem 11 mov ebx ,1 ; (stdout) 12 mov eax ,4 ; (sys_write) 13 int 0x80 ; kernel 14 mov eax ,1 ;(sys_exit) 15 int 0x80 ; kernel Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 154 / 204
  • 155. BCD (018_ajusta_bcd) 1 section .data 2 msg db ’A Soma é:’,0xa 3 len equ $ - msg 4 num1 db ’12345 ’ 5 num2 db ’23456 ’ 6 sum db ’ ’ Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 155 / 204
  • 156. Strings Já usamos strings de comprimento variável em nossos exemplos anteriores. As strings de comprimento variável podem ter quantos caracteres necessários. Geralmente, especificamos o comprimento da sequência por qualquer uma das duas maneiras: 1 Armazenamento explícito do comprimento da string 2 Usando um caractere sentinela Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 156 / 204
  • 157. Caso 1 - Comprimento Definido msg db ’Hello, world!’,0xa len equ $ - msg msg db ’Hello, world!’,0xa len equ 13 Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 157 / 204
  • 158. Caso 2 - Uso de Caractere Sentinela messagem DB ’O escambau do judas!’, 0 Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 158 / 204
  • 159. Comandos para Manipulação de Strings 1 MOVS. Esta instrução move 1 byte Word ou Doubleword de dados do local de memória para outro. 2 LODS. Esta instrução carrega da memória. Se o operando é de um byte, ele é carregado no registro al, se o operando é uma palavra, ele é carregado no registro AX e uma palavra dupla é carregada no registro EAX. 3 STOS. Esta instrução armazena dados do registro (AL, AX ou EAX) para a memória. 4 CMPS. Esta instrução compara dois itens de dados na memória. Os dados podem ser de tamanho byte, palavra ou palavra dupla. 5 SCAS. Esta instrução compara o conteúdo de um registro (AL, AX ou EAX) com o conteúdo de um item na memória. Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 159 / 204
  • 160. Versões das Operações com Strings Instrução Base Operandos em Byte Word DWord MOVS ES:DI, DS:SI MOVSB MOVSW MOVSD LODS AX, DS:SI LODSB LODSW LODSD STOS ES:DI, AX STOSB STOSW STOSD CMPS DS:SI, ES: DI CMPSB CMPSW CMPSD SCAS ES:DI, AX SCASB SCASW SCASD Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 160 / 204
  • 161. Prefixo de Repetição O prefixo REP, quando definido antes de uma instrução de string, por exemplo - REP MOVSB, causa repetição da instrução com base em um contador colocado no registro CX. O REP executa a instrução, diminui o CX em 1 e verifica se o CX é zero. Ele repete o processamento de instruções até que o CX seja zero. Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 161 / 204
  • 162. REP O FLAG de Direção determina o sentido da operação. Use CLD (Clear Direction Flag, DF = 0) para fazer a operação da esquerda para a direita. Use SDT (Set Direction Flag, DF = 1) para tornar a operação da direita para a esquerda. Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 162 / 204
  • 163. Variações do REP 1 REP É a repetição incondicional. Repete a operação até que o CX seja zero. 2 REPE ou REPZ: É uma repetição condicional. Ele repete a operação enquanto a bandeira zero indica igual/zero. Para quando o ZF indica não igual/zero ou quando o CX é zero. 3 REPNE ou REPNZ: Também é uma repetição condicional. Ele repete a operação enquanto a bandeira zero indica não igual/zero. Para quando o ZF indica igual/zero ou quando o CX é decrementado a zero Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 163 / 204
  • 164. Diretivas Para Definição de Arrays Definindo variáveis Normais MESES DW 12 MESES DW 0CH MESES DW 0110B Definindo Arrays de Uma Dimensão NUMEROS DW 34, 45, 56, 67, 75, 89 Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 164 / 204
  • 165. Outra Forma de Definir Arrays MTX DW 0 DW 0 DW 0 DW 0 DW 0 DW 0 DW 0 Ou MTX DW 0, 0 , 0 , 0 , 0 , 0 , 0 , 0 MTX TIMES 8 DW 0 Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 165 / 204
  • 166. Matrizes (019_arrays) 1 section .text 2 global _start 3 _start: 4 mov eax ,3 ;numero de bytes a serem somados 5 mov ebx ,0 ;EBX guarda a soma 6 mov ecx ,x ;ECX aponta para o elemento atual a ser somado 7 top: 8 add ebx , [ecx] 9 add ecx ,1 ;move ponteiro para o próximo elemento 10 dec eax ;decrementa o contador 11 jnz top ;se o contador não é zero continua 12 done: 13 add ebx , ’0’ 14 mov [sum], ebx ;finaliza guardando o resutado em sum Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 166 / 204
  • 167. Matrizes (019_arrays) 1 display: 2 mov edx ,1 ;comprimento da mensagem 3 mov ecx , sum ;messagem a escrever 4 mov ebx , 1 ; (stdout) 5 mov eax , 4 ; (sys_write) 6 int 0x80 7 mov eax , 4 8 mov ebx ,1 9 mov ecx ,newLineMsg 10 mov edx ,newLineLen 11 int 0x80 12 mov eax , 1 ;(sys_exit) 13 int 0x80 Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 167 / 204
  • 168. Matrizes (019_arrays) 1 section .data 2 newLineMsg db 0xa 3 newLineLen equ $-newLineMsg 4 global x 5 x: 6 db 2 7 db 4 8 db 3 9 sum: 10 db 0 Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 168 / 204
  • 169. Procedimentos Sintaxe geral para procedimentos: proc_name: procedure body ... ret CALL proc_name Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 169 / 204
  • 170. Procedimentos (020_procs) 1 section .text 2 global _start 3 _start: 4 mov ecx ,’4’ 5 sub ecx , ’0’ 6 mov edx , ’5’ 7 sub edx , ’0’ 8 call sum ;chama o procedimento soma 9 mov [res], eax 10 mov ecx , msg 11 mov edx , len 12 mov ebx ,1 ;(stdout) 13 mov eax ,4 ;(sys_write) 14 int 0x80 Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 170 / 204
  • 171. Procedimentos (020_procs) 1 mov ecx , res 2 mov edx , 1 3 mov ebx , 1 ;(stdout) 4 mov eax , 4 ;(sys_write) 5 int 0x80 ; 6 mov eax ,4 7 mov ebx ,1 8 mov ecx ,newLineMsg 9 mov edx ,newLineLen 10 int 0x80 11 mov eax ,1 ;(sys_exit) 12 int 0x80 13 sum: 14 mov eax , ecx 15 add eax , edx 16 add eax , ’0’ 17 ret Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 171 / 204
  • 172. Procedimentos (020_procs) 1 section .data 2 msg db "A soma eh: " 3 len equ $- msg 4 newLineMsg db 0xa 5 newLineLen equ $-newLineMsg 6 7 segment .bss 8 res resb 1 Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 172 / 204
  • 173. Pilha Uma pilha é uma estrutura de dados semelhante a uma matriz na memória na qual os dados podem ser armazenados e removidos de um local chamado "topo"da pilha. Os dados que precisam ser armazenados são ’empurrados’ para dentro da pilha e os dados a serem recuperados são ’retirados’ da pilha. Trata-se de uma estrutura de dados LIFO, ou seja, os dados armazenados primeiro são recuperados por último. Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 173 / 204
  • 174. Operações sobre as Pilhas 1 PUSH operando 2 POP endereço/registrador Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 174 / 204
  • 175. Implementação A implementação da pilha é realizada no espaço de memória reservado para este fim. Os registros SS e ESP (ou SP) são utilizados para a implementação da pilha. A parte superior da pilha, que aponta para o último item de dados inserido na pilha é apontada pelo registro SS:ESP, onde o registro SS aponta para o início do segmento de pilha e o SP (ou ESP) dá o deslocamento para o segmento de pilha. Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 175 / 204
  • 176. Características do SS 1 Apenas palavras ou palavras duplas poderiam ser salvas na pilha, não um byte. 2 A pilha cresce na direção inversa, ou seja, em direção ao endereço de memória inferior 3 A parte superior da pilha aponta para o último item inserido na pilha; ele aponta para o byte inferior da última palavra inserida. Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 176 / 204
  • 177. Procedimentos (021_stack) 1 section .text 2 global _start 3 _start: 4 call display 5 mov eax ,1 ;(sys_exit) 6 int 0x80 7 display: 8 mov rcx , 256 ; uso em 64 bits 9 next: 10 push rcx 11 mov eax , 4 12 mov ebx , 1 13 mov rcx , achar 14 mov edx , 1 15 int 80h Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 177 / 204
  • 178. Procedimentos (021_stack) 1 pop rcx 2 mov edx , [achar] 3 cmp byte [achar], 0dh 4 inc byte [achar] 5 loop next 6 ret 7 section .data 8 achar db ’0’ Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 178 / 204
  • 179. Recursividade 022_fatorial Usando a recursividade em Assembly 1 section .text 2 global _start 3 _start: 4 mov bx , 3 ;calcular o fatorial de 3 5 call proc_fact 6 add ax , 30h 7 mov [fact], ax 8 mov edx ,len ;comprimento da mensagem 9 mov ecx ,msg ;mensagem a escrever 10 mov ebx ,1 ;(stdout) 11 mov eax ,4 ;(sys_write) 12 int 0x80 Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 179 / 204
  • 180. Recursividade 022_fatorial 1 mov edx ,1 ;comprimento da mensagem 2 mov ecx ,fact ;mensagem para escrever 3 mov ebx ,1 ;(stdout) 4 mov eax ,4 ; (sys_write) 5 int 0x80 6 mov eax ,1 ; (sys_exit) 7 int 0x80 8 proc_fact: 9 cmp bl , 1 10 jg calcula 11 mov ax , 1 12 ret 13 calcula: 14 dec bl 15 call proc_fact 16 inc bl 17 mul bl ;ax = al * bl 18 ret Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 180 / 204
  • 181. Recursividade 022_fatorial 1 section .data 2 msg db ’Factorial 3 is:’,0xa 3 len equ $ - msg 4 5 section .bss 6 fact resb 1 Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 181 / 204
  • 182. Macros 1 Escrever uma macro é outra forma de garantir a programação modular na linguagem de montagem. 2 Uma macro é uma sequência de instruções, atribuídas por um nome e podem ser usadas em qualquer lugar do programa. 3 No NASM, as macros são definidas com as diretivas %macro e %endmacro. 4 A macro começa com a diretiva %macro e termina com a diretiva %endmacro. Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 182 / 204
  • 183. Sintaxe para Construção de Macros %macro nome_macro número_de_parâmetros <macro body> %endmacro... Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 183 / 204
  • 184. Macros 023_macro 1 ; Uma macro com dois parâmmetros 2 ; implementa a system call write 3 %macro write_string 2 4 mov eax , 4 5 mov ebx , 1 6 mov ecx , %1 7 mov edx , %2 8 int 80h 9 %endmacro 10 section .text 11 global _start 12 _start: 13 write_string msg1 , len1 14 write_string msg2 , len2 15 write_string msg3 , len3 16 mov eax ,1 ; (sys_exit) 17 int 0x80 Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 184 / 204
  • 185. Macros 023_macro 1 2 section .data 3 msg1 db ’Alo programadoress... !’,0xA ,0xD 4 len1 equ $ - msg1 5 msg2 db ’Bem vindo ao mundo da ,’, 0xA ,0xD 6 len2 equ $- msg2 7 msg3 db ’Programação assembly para linux ’,0xA ,0xD 8 len3 equ $- msg3 Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 185 / 204
  • 186. Gerenciamento de Arquivos O sistema considera qualquer dados de entrada ou saída como fluxo de bytes. Existem três fluxos de arquivo padrão: 1 Entrada padrão (stdin), 2 Saída padrão (stdout) 3 Erro padrão (stderr). Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 186 / 204
  • 187. Descritor de Arquivo Um descritor de arquivo é um inteiro de 16 bits atribuído a um arquivo como um id de arquivo. Quando um novo arquivo é criado ou um arquivo existente é aberto, o descritor de arquivos é usado para acessar o arquivo. Descritores de arquivos padrões stdin, stdout e stderr são 0, 1 e 2, respectivamente. Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 187 / 204
  • 188. Ponteiro de Arquivos Um ponteiro de arquivo especifica o local para uma operação subsequente de leitura/gravação no arquivo em termos de bytes. Cada arquivo é considerado como uma sequência de bytes. Cada arquivo aberto está associado a um ponteiro de arquivo que especifica um deslocamento em bytes, em relação ao início do arquivo. Quando um arquivo é aberto, o ponteiro do arquivo é definido como zero. Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 188 / 204
  • 189. Chamadas ao Sistema para Gerenciamento de Arquivos %EAX NOME %EBX %ECX %EDX 2 sys_fork struct pt_regs - - 3 sys_read unsigned int char * size_t 4 sys_write unsigned int const char * size_t 5 sys_open const char * int int 6 sys_close unsigned int - - 8 sys_creat const char * int - 19 sys_lseek unsigned int off_t unsigned int Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 189 / 204
  • 190. Como Fazer Chamadas ao Sistema 1 Coloque o número de chamada do sistema no registro EAX. 2 Armazene os argumentos para a chamada do sistema nos registros EBX, ECX, etc.. 3 Ligue para a interrupção relevante (80h). 4 O resultado geralmente é devolvido no registro EAX. Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 190 / 204
  • 191. Como Criar um Arquivo 1 Coloque a chamada do sistema sys_creat() número 8, no registro EAX. 2 Coloque o nome do arquivo no registro EBX. 3 Coloque as permissões de arquivo no registro ECX. 4 A chamada do sistema retorna o descritor de arquivo do arquivo criado no registro EAX, em caso de erro, o código de erro está no registro EAX. Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 191 / 204
  • 192. Abrindo Um Arquivo Existente 1 Coloque o sistema de chamada sys_open() número 5, no registro EAX. 2 Coloque o nome do arquivo no registro EBX. 3 Coloque o modo de acesso ao arquivo no registro ECX. 4 Coloque as permissões de arquivo no registro EDX. 5 A chamada do sistema retorna o descritor de arquivo do arquivo criado no registro EAX, em caso de erro, o código de erro está no registro EAX. 6 Entre os modos de acesso ao arquivo, os mais utilizados são: somente leitura (0), somente gravação (1) e leitura-gravação (2). Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 192 / 204
  • 193. Lendo Um Arquivo 1 Coloque o sistema de chamada sys_read() número 3, no registro EAX. 2 Coloque o descritor de arquivos no registro EBX. 3 Coloque o ponteiro no buffer de entrada no registro ECX. 4 Coloque o tamanho do buffer, ou seja, o número de bytes para ler, no registro EDX. 5 A chamada do sistema retorna o número de bytes lidos no registro EAX, em caso de erro, o código de erro está no registro EAX. Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 193 / 204
  • 194. Escrevendo em Um Arquivo 1 Coloque a chamada do sistema sys_write() número 4, no registro EAX. 2 Coloque o descritor de arquivos no registro EBX. 3 Coloque o ponteiro no buffer de saída no registro ECX. 4 Coloque o tamanho do buffer, ou seja, o número de bytes para escrever, no registro EDX. 5 A chamada do sistema retorna o número real de bytes escritos no registro EAX, em caso de erro, o código de erro está no registro EAX. Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 194 / 204
  • 195. Fechando o Arquivo 1 Coloque a chamada do sistema sys_close() número 6, no registro EAX. 2 Coloque o descritor de arquivos no registro EBX. 3 A chamada do sistema retorna, em caso de erro, o código de erro no registro EAX. Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 195 / 204
  • 196. Atualizando o Arquivo 1 Coloque o sistema de chamada sys_lseek () número 19, no registro EAX. 2 Coloque o descritor de arquivos no registro EBX. 3 Coloque o valor de deslocamento no registro ECX. 4 Coloque a posição de referência para o deslocamento no registro EDX. Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 196 / 204
  • 197. Posições de Referência 1 Início do arquivo - valor 0 2 Posição atual - valor 1 3 Fim do arquivo - valor 2 Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 197 / 204
  • 198. Macros 024_arquivos 1 section .text 2 global _start 3 _start: 4 ;create the file 5 mov eax , 8 6 mov ebx , file_name 7 mov edx , lenmsgfilename 8 mov ecx , 0777 ;ler , escrever e esecutar por todos 9 int 0x80 10 mov [fd_out], eax 11 ;escrever no arquivo 12 mov edx ,lenmsg ;número de bytes 13 mov ecx , msg ;mensagem para escrever 14 mov ebx , [fd_out] ;descritor do arquivo 15 mov eax ,4 ; (sys_write) 16 int 0x80 Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 198 / 204
  • 199. Macros 024_arquivos 1 ; fecha o arquivo 2 mov eax , 6 3 mov ebx , [fd_out] 4 ; escreve a mensagem indicando o fim do arquivos 5 mov eax , 4 6 mov ebx , 1 7 mov ecx , msg_done 8 mov edx , len_done 9 int 0x80 10 11 ;abre o arquivo para leitura 12 mov eax , 5 13 mov ebx , file_name 14 mov ecx , 0 ;para acesso somente de leitura 15 mov edx , 0777 ;ler escrever e executar por todos 16 int 0x80 Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 199 / 204
  • 200. Macros 024_arquivos 1 mov [fd_in], eax 2 3 ;ler do arquivo 4 mov eax , 3 5 mov ebx , [fd_in] 6 mov ecx , info 7 mov edx , 26 8 int 0x80 9 10 ; fechar o arquivo 11 mov eax , 6 12 mov ebx , [fd_in] 13 int 0x80 14 15 ; imprimir informações 16 mov eax , 4 17 mov ebx , 1 18 mov ecx , info Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 200 / 204
  • 201. Macros 024_arquivos 1 2 section .data 3 file_name db ’myfile.txt ’,0 4 lenmsgfilename equ $-file_name 5 msg db ’Bem vindo ao assembly ’,0xa 6 lenmsg equ $-msg 7 8 msg_done db ’Escrito no arquivo ’, 0xa 9 len_done equ $-msg_done 10 11 section .bss 12 fd_out resb 1 13 fd_in resb 1 14 info resb 26 Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 201 / 204
  • 202. Gerenciamento de Memória A chamada do sistema sys_brk() é fornecida pelo kernel para alocar memória sem a necessidade de movê-la mais tarde. Esta chamada aloca memória logo atrás da imagem do aplicativo na memória. Esta função do sistema permite definir o endereço mais alto disponível na seção de dados. Esta chamada do sistema requer um parâmetro, que é o endereço de memória mais alto necessário para ser definido. Esse valor é armazenado no registro EBX. Em caso de erro, sys_brk() retorna -1 ou retorna o próprio código de erro negativo. O exemplo a seguir demonstra a alocação dinâmica da memória Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 202 / 204
  • 203. Memória 025_memoria 1 section .text 2 global _start 3 _start: 4 mov eax , 45 ;sys_brk 5 xor ebx , ebx 6 int 80h 7 add eax , 16384 ;número de bytes a ser reservado 8 mov ebx , eax 9 mov eax , 45 ;sys_brk 10 int 80h 11 cmp eax , 0 12 jl exit ;exit , caso erro 13 mov edi , eax ;EDI = endereço disponível mais alto 14 sub edi , 4 ;apontando para a última DWORD 15 mov ecx , 4096 ;número de DWORDs allocadas 16 xor eax , eax ;limpa eax 17 std ;backward - retorna Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 203 / 204
  • 204. Memória 025_memoria 1 2 rep stosd ;repete para toda a área alocada 3 cld ;coloca o DF flag para o estado nomal 4 mov eax , 4 5 mov ebx , 1 6 mov ecx , msg 7 mov edx , len 8 int 80h ;imprime uma mensagem 9 exit: 10 mov eax , 1 11 xor ebx , ebx 12 int 80h 13 section .data 14 msg db "Aloca 16k de memória!", 10 15 len equ $ - msg Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 204 / 204
  • 205. Fim da Primeira Parte Ronaldo Ramos (Instituto Federal do Ceará) Paradigmas de Programação 23 de julho de 2023 205 / 204