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

Assemblyx86 Denyson