Assembly x86 Oque é assembly? 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 Assembly x86 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). Sintaxe 2 tipos principais, algumas diferenças -Ordem dos parâmetros .Intel: mov ax, 03d00h .AT&T: mov 03d00h, ax Registradores Usados para guardar os dados binários. 32-bit General-Purpose Registers EAX EBP EBX ESP ECX ESI EDX EDI 16-bit Segment Registers EFLAGS EIP CS ES SS FS DS GS Registradores Registradores Especiais 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 Flag 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 Pilha 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 Tipos de Dados 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 Definindo 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' Operador DUP 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(?) ; ; uninitialized 20 var3 BYTE 4 DUP("STACK") ; 20 bytes: ;"STACKSTACKSTACKSTACK" var4 BYTE 10,3 DUP(0),20 bytes, Instruções Transformado em codigo de maquina pelo assembler (TASM) Membro do instruction set IA-32. 4 partes: Label: - Mnemônicos - Operandos - ;Comentários Instruções 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 MNEMÔNICOS 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 Interrupçõ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. Instruçõ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.. Endereçamento 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) Comentarios ; Não vou nem comentar Código Assembly TITLE Add and Subtract (AddSub.asm) ; Este programa soma e subtrai inteiros de 32bits. 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 Exemplo - Linux 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 - DOS 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 Paramos por aqui (...)