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 (...)