Upload
internet
View
132
Download
4
Embed Size (px)
Citation preview
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.
CS
SS
DS
ES
EIP
EFLAGS
16-bit Segment Registers
EAX
EBX
ECX
EDX
32-bit General-Purpose Registers
FS
GS
EBP
ESP
ESI
EDI
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 EFLAGSCada 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, 1101bHexadecimal começando com letra: 0A5h
Char e Strings
str1 BYTE "Enter your name",0str2 BYTE 'Error: halting program',0str3 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(?) ; 20 bytes, ; uninitialized
var3 BYTE 4 DUP("STACK") ; 20 bytes:
;"STACKSTACKSTACKSTACK"
var4 BYTE 10,3 DUP(0),20
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
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
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 32-bits.
INCLUDE Irvine32.inc.codemain PROCmov eax,10000h ; EAX = 10000hadd eax,40000h ; EAX = 50000hsub eax,20000h ; EAX = 30000hcall DumpRegs ; display exit
main ENDPEND main
Exemplo - LinuxSECTION .DATA
hello: db 'Hello world!',10helloLen: equ $-hello
SECTION .TEXTGLOBAL _START
_START:
; Write 'Hello world!' to the screenmov eax,4 ; 'write' system callmov ebx,1 ; file descriptor 1 = screenmov ecx,hello ; string to writemov edx,helloLen ; length of string to writeint 80h ; call the kernel
; Terminate programmov eax,1 ; 'exit' system callmov ebx,0 ; exit with error code 0int 80h ; call the kernel
Exemplo - DOSDOSSEG.MODEL LARGE.STACK 200h
.DATAhello db 'Hello world!',10,13,'$'helloLen db 14
.CODEASSUME CS:@CODE, DS:@DATA
START:mov ax,@datamov ds,ax
; Write 'Hello world!' to the screenmov ah,09h ; 'print' DOS servicemov dx,offset hello ; string to writeint 21h ; call DOS service; Terminate programmov ah,4Ch ; 'exit' DOS servicemov ax,0 ; exit with error code 0int 21h ; call DOS service
END START
Paramos por aqui (...)