E N D
Assembly ou linguagem de montagem é uma notação legível por humanos para o código de máquina que uma arquitetura de computador específica usa. A linguagem de máquina, que é um mero padrão de bits, torna-se legível pela substituição dos valores em bruto por símbolos chamados mnemónicos. Ex.: MOV AL, 61h Oque é assembly?
Conjunto de instruções de baixo nível tanto para arquiteturas de processadores Intel (Intel 8088 e 8086), como para não Intel (5x86 da AMD). Assembly x86
2 tipos principais, algumas diferenças -Ordem dos parâmetros .Intel: mov ax, 03d00h .AT&T: mov 03d00h, ax Sintaxe
Usados para guardar os dados binários. Registradores
Alguns de uso especial: EAX – acumulador (automaticamente usado para divisao e multiplicação) ECX – contador de loop (instrução LOOP) ESP – stack pointer (não deve ser usado para OP aritmeticas e transferir dados) ESI, EDI – index registers (para instruções de transferencia de memoria rapidas) EBP – extended frame pointer (pilha) EIP – Ponteiro para instruções Registradores Especiais
EFLAGS Cada flag tem só 1 bit (set/clear) Carry (CF) -Out of range (sem sinal) Overflow(OF) -Out of range (com sinal) Sign (SF) -Resultado negativo Zero (ZF) -Resultado é zero Auxiliary Carry (AF) - Parity (PF) -Verifica paridade Registradores Flag
Todas as arquiteturas x86 usam uma pilha como uma área de armazenamento temporário em memória RAM, que permite ao processador armazenar e recuperar rapidamente os dados na memória. O topo da pilha atual é apontada pelo registrador ESP. A pilha "cresce" para baixo. Instruções PUSH e POP Pilha
As principais funcionalidades da pilha são: - Preservar valores de registradores em funções - Preservar dados da memória - Transferir dados sem usar registradores - Reverter a ordem de dados - Chamar outras funções e depois retornar - Passar parâmetros para funções Pilha
Byte, Word e Dword são blocos de dados básicos. O processador trabalha com o tamanho de dados adequados para executar as instruções Um byte possui 8 bits, um word possui 16 bits ou 2 bytes e um dword possui 32 bits ou 4 bytes Tipos de Dados
BYTE, SBYTE 8-bit unsigned integer; 8-bit signed integer WORD, SWORD 16-bit unsigned & signed integer DWORD, SDWORD 32-bit unsigned & signed integer QWORD 64-bit integer TBYTE 80-bit integer Tipos de Dados
REAL8 8-byte IEEE long real REAL10 10-byte IEEE extended real REAL4 4-byte IEEE short real ? Indefinido Tipos de Dados
Inteiros Ex: 30d, 6Ah, 42, 42o, 1101b Hexadecimal começando com letra: 0A5h Char e Strings str1 BYTE "Enter your name",0 str2 BYTE 'Error: halting program',0 str3 BYTE 'A','E','I','O','U' Definindo Dados
Usa-se DUP para alocar uma matriz ou string. Contador e argumentos devem ser constantes ou expressões constantes. var1 BYTE 20 DUP(0) ; 20 bytes, all zero var2 BYTE 20 DUP(?) ; 20 bytes, ; uninitialized var3 BYTE 4 DUP("STACK") ; 20 bytes: ;"STACKSTACKSTACKSTACK" var4 BYTE 10,3 DUP(0),20 Operador DUP
Instruções • Transformado em codigo de maquina pelo assembler (TASM) • Membro do instruction set IA-32. • 4 partes: Label: - Mnemônicos - Operandos - ;Comentários
MNEMÔNICOS Exemplos: MOV, ADD, SUB, MUL, INC, DEC OPERANDOS Constante (immediate value), 96 Registradores, eax Memória (rótulo de dados), count NUMERO DE DADOS stc ; set Carry flag inc ax ; add 1 to ax mov count, bx ; move BX to count Instruções
DIRETIVAS Comandos reconhecidos pelo Assembler Parte da sintaxe do assembler Usado para declarar codigo, area de dados, modo de seleção de memoria, Procedures. etc. Case insensitive Diferentes assemblers, diferentes diretivas NASM != TASM, por exemplo Ex: .data .code PROC struc Instruções
Por hardware, exception (ñ-controlada).. Interrupções pelo software são usadas para system calls (sub-rotinas). Muito úteis INT 21h ; muito usada Se AH = 3E , fecha o arquivo Parametros geralmente são requeridos CX,BX,AL. Interrupções
Várias outras intruções: JMP / LOOP ...: Usados para desvios. AND / NOR / OR ...: Operações booleanas nivel bit SZF / STC / STD ... : Setar flags CMP, CALL, PUSH, POP, etc.. Instruções
Três tipos básicos de operandos: Immediate – um inteiro constante (8, 16, or 32 bits) Valor codificado ja na instrução Registradores – nome do registrador Memoria – Referencia a um local na memoria (label) Endereçamento
; Não vou nem comentar Comentarios
TITLE Add and Subtract (AddSub.asm) ; Este programa soma e subtrai inteiros de 32-bits. INCLUDE Irvine32.inc .code main PROC mov eax,10000h ; EAX = 10000h add eax,40000h ; EAX = 50000h sub eax,20000h ; EAX = 30000h call DumpRegs ; display exit main ENDP END main Código Assembly
SECTION .DATA hello: db 'Hello world!',10 helloLen: equ $-hello SECTION .TEXT GLOBAL _START _START: ; Write 'Hello world!' to the screen mov eax,4 ; 'write' system call mov ebx,1 ; file descriptor 1 = screen mov ecx,hello ; string to write mov edx,helloLen ; length of string to write int 80h ; call the kernel ; Terminate program mov eax,1 ; 'exit' system call mov ebx,0 ; exit with error code 0 int 80h ; call the kernel Exemplo - Linux
DOSSEG .MODEL LARGE .STACK 200h .DATA hello db 'Hello world!',10,13,'$' helloLen db 14 .CODE ASSUME CS:@CODE, DS:@DATA START: mov ax,@data mov ds,ax ; Write 'Hello world!' to the screen mov ah,09h ; 'print' DOS service mov dx,offset hello ; string to write int 21h ; call DOS service ; Terminate program mov ah,4Ch ; 'exit' DOS service mov ax,0 ; exit with error code 0 int 21h ; call DOS service END START Exemplo - DOS