• Nenhum resultado encontrado

Software de Telecomunicações. Tópicos de Assembly86

N/A
N/A
Protected

Academic year: 2021

Share "Software de Telecomunicações. Tópicos de Assembly86"

Copied!
40
0
0

Texto

(1)

Software de Telecomunicações

Tópicos de Assembly86

Prof RG Crespo Software de Telecomunicações Assembly86 : 1/79

Tópicos de Assembly86

Lista processadores Intel (1)

• Processadores IA-16

1978: 8086-29K transistores, 0.33 MIPS endereça 1MB

1982: 80286-134K transistores (MMU incorporado), 0.9 MIPS endereça 16MB de memória

• Processadores IA-32

1985: 80386-275K transistores, 5 MIPS endereça 4GB de memória 1989: 80486-1.2M transistores (FPU incorporado), 50 MIPS 1989: 80486-1.2M transistores (FPU incorporado), 50 MIPS

1993: Pentium-3.1M transistores, 60 MIPS [introduz SIMD instruções em registos de 64 bits]

1997: Pentium II- 9.5M transistores, 300 MIPS

1999: Pentium III-9.5M transistores, 500 MIPS [introduz Streaming SIMD instruções em registos de 128 bits]

2000: Pentium 4-42M transistores, 1500 MIPS endereça 64GB de memória

• Processadores IA-64

(2)

Lista processadores Intel (2)

• Na passagem de 32 bits para 64 bits, os fabricantes

seguiram abordagens distintas:

– Intel associou-se à HP para desenvolver processador Itanium dedicado a servidores e a estações de trabalho de elevado desempenho. O processador emulava o IA-32, mas com significativa degradação no desempenho.

Prof RG Crespo Software de Telecomunicações Assembly86 : 3/79

significativa degradação no desempenho.

– Advanced Micro Devices desenvolveu AMD64, estendendo o IA-32 (16 registos de uso geral de 64 bits)

• Vendas do AMD64 muito superiores levaram a Intel a

adoptar a arquitectura AMD64, sob a designação EM64T.

Informação complementar do IA32 e IA64 disponível em

http://developer.intel.com/products/processor/manuals

Pentium – arquitectura (1)

• O Pentium adopta arquitectura CISC

– reduzido número de registos de uso geral

– elevado número de instruções do tipo registo-memória (uma dos argumentos pode ser memória)

• Por compatibilidade, o Pentium mantém as características

dos antecessores (8086/8,80286,…)

dos antecessores (8086/8,80286,…)

– Segmentação de memória, em dois modos – Registos de uso geral acedidos a 8, 16 e 32 bits.

• A inércia (foi único processador de 16 bits durante 2 anos)

e ter sido adoptado pelo IBM-PC levaram vendas muito

superiors aos competidores tecnologicamente superiores.

(3)

Pentium – arquitectura (2)

• Core incorpora a arquitectura RISC.

– Maior número de registos de uso geral (16 contra 8 do IA-32). – Registos passam a ortogonais

• Multiplicação deixa de ser restrita a EDX:EAX.

• Acesso na parte inferior de 8 bits a todos os registos (ex: DIL, SIL, SPL, R8L)

Prof RG Crespo Software de Telecomunicações Assembly86 : 5/79 SPL, R8L)

• Nota: alguns registos continuam a ser dedicados, como o SP.

• Para continuar a executar imenso código desenvolvido,

Core disponibiliza dois modos:

– Compatível IA-32, com aplicações a aceder espaço de 4GB. – 64 bits, com instruções de prefixo REX a aceder às extensões de

registos.

Pentium – arquitectura (3)

• Distribuição das componentes de um programa no

Pentium

Pilha SP EBP Arena SS

EAX EBX ECX EDX

Registos uso geral Registos segmento CS Arena SS Dados estáticos DS Código EIP EDI ESI

(4)

Pentium: registos

• O Pentium possui registos dedicados a funções diversas

– 8 de uso geral (“genereal purpose”), para operações aritméticas e lógicas e de endereçamento.

– 1 contador de programa (“program counter”)

– 6 de segmento (“segment”), para organização de memória

Prof RG Crespo Software de Telecomunicações Assembly86 : 7/79

– 1 de bandeiras (“flags”)

– 8 de vírgula flutuante (“floating point”) – 8 de multimedia

Registos: uso geral (1)

IA-32: Os registos de uso geral podem ser acedidos

individualmente na parte inferior

16-bit 32-bit AH AL AX EAX BH BL BX EBX BH BL BX EBX CH CL CX ECX DH DL DX EDX BP EBP SI ESI DI EDI SP ESP Deslocamentos de blocos de memória

{

(5)

Registos: uso geral (2)

• Os registos de uso geral usados para

– guarda temporária de expressões

– execução de operações aritméticas (soma,…) e lógicas (e lógico, "shifts",…)

• As operações de multiplicação e de divisão trabalham com

Prof RG Crespo Software de Telecomunicações Assembly86 : 9/79

• As operações de multiplicação e de divisão trabalham com

valores de comprimento duplo (8086/8: 2*16=32 bits,

Pentium: 2*32=64 bits), que são guardados no par de

registos EDX:EAX (EDX contém dígitos mais

significativos).

Registos: uso geral (3)

• EIP: utilizado como ponteiro para a próxima instrução a

executar: este registo não é controlável directamente pelo

programador.

• EBX,EBP: utilizados como endereço base de tabela (EBX

no segmento de dados, EBP na pilha).

no segmento de dados, EBP na pilha).

• ESI,EDI: utilizados como deslocamentos a partir de um

registo base (ESI indica deslocamento de uma fonte e EDI

indica deslocamento de um destino).

(6)

Registos: uso geral (4)

• ESP: utilizado como ponteiro base da pilha (endereço da

primeira posição ocupada da pilha).

• EBP: utilizado como ponteiro topo da pilha, para acesso a

parâmetros e variáveis locais.

Prof RG Crespo Software de Telecomunicações Assembly86 : 11/79 Parâmetros EBP Sentido do PUSH ESP Posições livres Variáveis locais

Espaço obtido por subtracção de SP

End. retorno

Registos

Registos: uso geral (5)

IA-64: Os registos de uso geral dependem do modo

– Compatível IA32

• 8 registos iguais aos IA32: EAX-EDX, EDI,ESI, EBP, ESP • 8 registos extra: R8D-R15D

– 64 bits

• 8 registos iguais aos IA32, mas com prefixo R: RAX-RDX, RDI,RSI, RBP, RSP

• 8 registos extra: R8-R15

• Todos os registos podem ser acedidos ao Byte, Word,

Double e Quad (só em modo compatível 64-bit)

(7)

Registos: uso geral (6)

Tipo registo Modo compatível IA32 Modo 64-bit Byte AL,BL,CL,DL, AH,BH,CH,DH AL,BL,CL,DL, DIL,SIL, BPL,SPL, R8L-R15L Word AX,BX,CX,DX, DI,SI, AX,BX,CX,DX, DI,SI,

Prof RG Crespo Software de Telecomunicações Assembly86 : 13/79

DI,SI, BP,SP DI,SI, BP,SP, R8W-R15W Double EAX,EBX,ECX,EDX, EDI,ESI, EBP,ESP EAX,EBX,ECX,EDX, EDI,ESI, EBP,ESP, R8D-R15D Quad -- RAX,RBX,RCX,RDX, RDI,RSI, RBP,RSP, R8-R15

Registo: bandeiras (1)

• O Pentium possui o registo EPFLAG, com 17 bandeiras

("flags").

– Alguns dos bits são modificados pelo CPU por forma a refletir o estado ("status") da ultima instrução lógica ou aritmética.

– Há instruções específicas para alterar valor de algumas bandeiras (ex: CLD limpa registo DF)

(ex: CLD limpa registo DF)

• Diversas instruções permitem transferir o controlo do

programa de acordo com o valor de bandeiras (ex: salto

condicional).

• Bandeiras DF, IF e TF permitem controlar a operação do

processador (ex: DF incrementa/decrementa valor de

EDI:ESI na instrução MOVSx).

(8)

Registo: bandeiras (2)

Nome Função

CF Carry flag. Colocado a 1 se houver transporte ou empréstimo.

PF Parity flag. Colocado a 1 se os 8 bits inferiores tiverem número par de 1's.

AF Auxiliary carry flag. Colocado a 1 se houver transporte ou empréstimo dos 4 bits

inferiores de AL

ZF Zero flag. Colocado a 1 se o resultado for nulo

Prof RG Crespo Software de Telecomunicações Assembly86 : 15/79

ZF Zero flag. Colocado a 1 se o resultado for nulo

SF Sign flag. Igual ao bit mais significativo

TF Trap flag.

IF Interrupt flag.

DF Direction flag.

OF Overflow flag. Colocado a 1 se o resultado não puder ser expresso dentro do

numero de bits do destino.

Registos: vírgula flutuante

• O Pentium possui o conjunto ST de 8 registos de 80 bits,

para vírgula flutuante

– ST manipulado como pilha

– Registo FPUstatus indica estado corrente da unidade de processamento

– Números representados pela norma IEEE 754

• Zero • Infinito

• Denormais (próximos do zero) • NAN (“Not A Number”) - ex: √-1

(9)

Modos de acesso à memória (1)

• Os registos 8086/8 têm 16 bits, endereçando apenas

64KB.

• Os registos de segmentos permitiram aumentar o espaço

de memória

– CS (Code Segment) para instruções

Prof RG Crespo Software de Telecomunicações Assembly86 : 17/79

– CS (Code Segment) para instruções – DS (Data Segment) para variáveis globais

– SS (Stack Segment) para pilha (parâmetros de rotinas e variáveis locais)

– ES (Extra Segment)

• Pentium possui dois registos extra de segmento: FS e GS

Modos de acesso à memória (2)

A. Modo real

– Único disponibilizado pelo 8086

– Endereço efectivo EA-”Effective address”, determinado por:

1. Deslocar segmento 4 bits para a esquerda

2. Somar deslocamento (“offset”) 0fffffh 2. Somar deslocamento (“offset”)

Ex: CS=01200h, IP=03f7h Endereço efectivo = 021000h+03f7h = 0123f7h 00000h 0fffffh Segmento 64KB

EA

offset

(10)

Modos de acesso à memória (3)

• Por omissão, as instruções usam determinado registo de

segmento para cálculo do endereço efectivo

– Acesso a instrução: CS

– PUSH/POP: SS para endereço efectivo de memória – MOV: DS para endereço efectivo de memória

Prof RG Crespo Software de Telecomunicações Assembly86 : 19/79

– MOV: DS para endereço efectivo de memória

• [BX]: DS para endereço efectivo de memória • [BP]: SS para endereço efectivo de memória

• Pode-se indicar outro registo na forma xS:

Ex: MOV AX,ES:[$var]

Modos de acesso à memória (4)

• Para 16 bits, o Asm86 disponibiliza modos de

programação de acordo com a distribuição dos segmentos

– Tiny: CS=DS=SS (ficheiro de tipo .COM) – Small: CS=DS=SS

– Medium: DS=SS e distinto de CS – Medium: DS=SS e distinto de CS – Large: segmentos separados

(11)

Modos de acesso à memória (5)

B. Modo protegido

– Disponibilizado pelo 80286, com CS=DS=SS. – O registo de segmento indexa tabela, LDT ou

GDT, com entradas a 64 bits que contêm

• Endereço base

• Limite superior

Endereço

32bits

Prof RG Crespo Software de Telecomunicações Assembly86 : 21/79 • Limite superior • Descritores 13 bits Limite superior Endereço base Descritores

EA

Segmento

32bits 32bits

• LDT-”Local Descriptor Table”, uma por processo

• GDT-”Global Descriptor Table”, uma para o sistema operativo

Modos de acesso à memória (6)

• No Pentium, o limite é indicado por 20 bits

• Descritores determinam diversas propriedades:

– Modo de acesso à memória – Bit D : dimensão dos dados

• D=0 : instruções de 16 bit • D=0 : instruções de 16 bit • D=1 : instruções de 32 bit

– Bit de granularidade

• G=0 : o processo pode aceder entre 1B e 1 MB. • G=1 : o processo pode aceder entre 4KB e 4GB

(12)

Modos de acesso à memória (7)

C. Modo plano (“flat”)

– Disponibilizado pelo 80386, com CS=DS=SS.

– Os registos de 32 bits acedem ao espaço, designado endereçamento linear, de 232 = 4GB.

• No IA64, modo 64-bit, o endereçamento linear depende da implementação (a primeira cobre 48 bits).

Prof RG Crespo Software de Telecomunicações Assembly86 : 23/79

implementação (a primeira cobre 48 bits).

• O endereço deve ser canónico, com bits mais significativos fora do endereçamento linear inverso do bit mais significativo do

endereçamento linear.

Endereço EndereçamentoLinear (virtual)

Modos de acesso à memória (8)

• Na realidade, o endereço virtual é transcrito para endereço físico por paginação

(13)

Endereçamento operandos (1)

Pentium disponibiliza 5 modos de endereçamento de

operandos e 9 derivados.

1. Imediato

: valor indicado na própria instrução (para

literais, tamanho indicado por directiva Byte-1, Word-2,

Prof RG Crespo Software de Telecomunicações Assembly86 : 25/79

literais, tamanho indicado por directiva Byte-1, Word-2,

Dword-4):

MOV EAX,0h ; 32 bits PUSH Byte PTR 0 ; 8 bits

2. Registo

PUSH CX ; 16 bits POP EAX ; 32 bits

Endereçamento operandos (2)

3. Directo: localização por identificador de variável

A localização pode ser deslocada

[var + Base + índice*escala + deslocamento]

– Reg base: {EAX,EBX,ECX,EDX,ESP,EBP,ESI,EDI} – Reg índice: diferente registo base, excluindo ESP – Escala: {1,2,4,8}, 1 por omissão

(14)

Endereçamento operandos (3)

Exemplos:

Instrução Significado

PUSH Byte PTR [$m+1] Insere na pilha Byte de endereço seguinte a $m

Prof RG Crespo Software de Telecomunicações Assembly86 : 27/79

seguinte a $m

PUSH Word PTR [$m+EAX*2] Insere na pilha Word de uma tabela $m no índice indicado em EAX*2

PUSH Byte PTR [$m+EDX+EBP]

Insere na pilha Byte de endereço $m mais soma dos conteúdos de EDX e de EBP

Endereçamento operandos (4)

4. Indirecto: endereço determinado a partir de registos não

sendo indicada variável.

Há 3 designações de endereçamento indirecto, conforme os registos usados:

– Base: apenas {EBX,EBP}, com eventual deslocamento. – Indexado: apenas {EDI, ESI}, com eventual deslocamento. – Indexado: apenas {EDI, ESI}, com eventual deslocamento. – Base indexada: indicados registos base e índice, com eventual

deslocamento.

• Podendo o mesmo registo ser base ou índice, que designação usar no endereçamento indirecto quando apenas se usa 1 registo?

– Se for indicada escala, ex: PUSH [EBX*2], o modo é indexado. – Para os registos ESI e EDI, ex: PUSH [ESI+1], o modo é indexado. – Os restantes casos são designados por modo base.

(15)

Endereçamento operandos (5)

5. Bloco: usado no deslocamento de sequências de dados de

grande dimensão.

– Cadeia fonte apontada por DS:SI

– Cadeia destino apontada por ES:DI

Prof RG Crespo Software de Telecomunicações Assembly86 : 29/79

Mnemónica Código Segmento Operação simbólica MOVSB A4 ES,DS [ES:EDI]<− [DS:ESI]

If DF=0 then ESI<-ESI+1;EDI<-EDI+1; If DF=1 then ESI<-ESI-1;EDI<-EDI-1; Controlo exercido por instrução de repetição (ex: LOOP label)

Formato de instruções

• As instruções variam entre 1 e 5 B

Mod Reg r/m

Byte/Word Mod Reg r/m

• Operação • Destino • Byte/Word

disp-high disp-low

Prefixo Opcode Mode SIB

• Scale • Index • Base

Byte/Word Mod Reg r/m

0-Byte 00-disp ausente 00-ES 000-EA=(EBX)+(ESI)+Disp 1-Word 01-disp low estendido 01-CS 001-EA=(EBX)+(EDI)+Disp

10-disp high/low presentes 10-SS 010-EA=(EBP)+(ESI)+Disp 11-DS 011-EA=(EBP)+(EDI)+Disp

100-EA=(ESI)+Disp 101-EA=(EDI)+Disp 110-EA=(EBP)+Disp 111-EA=(EBX)+Disp

(16)

Estrutura do programa

• As instruções do programa Asm86 possuem a forma

[nome] mnemónica [operandos]

• As instruções podem começar em qualquer coluna e

Prof RG Crespo Software de Telecomunicações Assembly86 : 31/79

• As instruções podem começar em qualquer coluna e

terminam obrigatoriamente por um NEWLINE.

• Comentários podem ser colocados a seguir a ;

Directivas (1)

Segmento lógico

• Um segmento lógico

1

é um módulo que pode conter até os

3 componentes físicos de um programa (código, dados e

pilha).

name SEGMENT align combine 'class' name ENDS

• As opções align, combine e class definem instruções de

``loading´´

(17)

Directivas (2)

• align define o alinhamento do segmento lógico, i.e., a

gama de endereços de memória a partir dos quais se

poderá colocar o início do segmento de programa

– BYTE qualquer endereço

Prof RG Crespo Software de Telecomunicações Assembly86 : 33/79

– BYTE qualquer endereço

– WORD qualquer endereço de palavra (i.e., endereço par) – PARA endereço de parágrafo (16 Bytes/parágrafo) – PAGE endereço de página (1024 Bytes/página)

Directivas (3)

• combine define o critério de combinação dos segmentos

lógicos que possuem o mesmo nome

– PUBLIC Concatena todos os segmentos lógicos com o mesmo nome. Todos os endereços de código e dados são

mesmo nome. Todos os endereços de código e dados são relacionados no mesmo registo de segmento.

– STACK Concatena todos os segmentos lógicos com o mesmo nome. Todos os endereços são relacionados com SS

– COMMON Cria segmentos sobrepostos colocando o início de todos os segmentos que possuem o mesmo nome no mesmo endereço

(18)

Directivas (4)

– MEMORY Coloca todos os segmentos que possuem o mesmo nome no maior segmento físico possível.

– AT addr Todas as etiquetas e endereços de variáveis são relacionados para o dado endereço: os segmentos AT não contêm código ou dados inicializados e representam acessos a ROM

Prof RG Crespo Software de Telecomunicações Assembly86 : 35/79

ROM

• class determina os segmentos de programa que devem ser

colocados uns a seguir aos outros quando o editor de

ligações agrupar todos os módulos.

Directivas (5)

END

• Todos os programas devem terminar por um

END. Se na directiva END for indicado um nome,

ele é considerado como o módulo principal

.

_code SEGMENT PARA PUBLIC 'CODE'

main PROC FAR ; ponto entrada do programa MOV EAX,data ; inicialização do DS

MOV DS,EAX ; //

LEA ESP,_top ; inicialização do SP ;

_code ENDS END main

(19)

Directivas (6)

ASSUME

• Identifica registo de segmento seg-reg a usar como registo

de omissão para as etiquetas e variáveis definidas no

segmento de programa seg-name.

Prof RG Crespo Software de Telecomunicações Assembly86 : 37/79

ASSUME seg-reg:seg-name,… ASSUME NOTHING

Cancela selecção existente

Exemplo: ASSUME CS:_code, DS:_code, SS: _code

Todos os segmentos dentro do mesmo segmento lógico

Directivas (7)

PROC, ENDP

• Delimitam rotinas

name PROC type

name ENDP name ENDP

– O tipo da rotina pode ser NEAR (rotina chamada dentro do segmento) ou FAR.

– O nome da rotina pode ser usado como operando de instruções

jump, call ou loop.

(20)

Directivas (8)

ORG

• Inicializa o contador para a expressão (que deve

ser um numero absoluto).

_code SEGMENT PARA PUBLIC 'CODE' ORG 0100h

Prof RG Crespo Software de Telecomunicações Assembly86 : 39/79 ORG 0100h

ASSUME CS:_code, DS:_code, SS:_code _main PROC NEAR ; ponto entrada do programa ; ; programa e dados ; _code ENDS END _main

Directivas (9)

EQU

• Constante na forma

name EQU valor

CR EQU 0dh CR EQU 0dh LF EQU 0ah DIM EQU 100

_newline

DB

CR,LF,”$”

(21)

Directivas (10)

macro

• Inserção “inline” de código, delimitado por

macro … endm

Prof RG Crespo Software de Telecomunicações Assembly86 : 41/79

$pushr MACRO ; salvaguarda registos na pilha push bp push bx push cx push dx ENDM … $pushr

Inteiros, Cadeias caracteres

• Literais expressos na forma digitosR

– B (binários: 01b) – Q,O (octal)

– D (decimal, opção por omissão)

– H (hexadecimal, obrigatoriamente iniciado por dígito 0-9: 0ffh, – H (hexadecimal, obrigatoriamente iniciado por dígito 0-9: 0ffh,

42h)

• Cadeias de caracteres delimitas por plicas ou aspas. O

carácter delimitador pode ser inserido na string através da

sua duplicação (ex: 'don''t' )

(22)

Identificadores

• Iniciados por uma letra, _, ?, $ ou @

– Os compiladores geram identificadores próprios (ex: etiquetas) com prefixo inexistente na linguagem (ex: _)

– Os compiladores inserem prefixos extra (ex: $) nos identificadores de programas (variáveis, rotinas) para evitar conflitos com

instruções do Assembly

Prof RG Crespo Software de Telecomunicações Assembly86 : 43/79

instruções do Assembly

• Letras minúsculas convertidas para maiúsculas.

• Apenas são considerados os primeiros 31 caracteres.

Declaração de dados (1)

• O Asm86 disponibiliza 2 tipos de dados, básicos

e compostos

[name] ESP valor-inicial,…

Tipo ESP Espaço (bits) Tipo em C Byte DB 8 char(ASCII)

Palavra DW 16 short, char(UNICODE) Duplo DD 32 int

(23)

Declaração de dados (2)

• O valor inicial pode ser

– literal (inteiro, real, …, string),

– ponto de interrogação - valor inicial é indefinido

– count DUP(value,…) - multiplas ocorrências de um, ou mais, valores iniciais

Prof RG Crespo Software de Telecomunicações Assembly86 : 45/79

empty db ? ; Byte com valor indefinido

integer dw 32000 ; Word inicializada a 32000 db 100 DUP(1) ; 100 Bytes inicializados a 1

msg1 db “Resultado=$”

No MS-DOS as cadeias terminam por $

Visibilidade

• Directivas para controlar a visibilidade de nomes entre

módulos de programas

– PUBLIC name,… – EXTRN name:type,…

Tipos possiveis:

• Variáveis externas: BYTE, WORD, DWORD, QWORD • Rotinas: FAR, NEAR

• Números absolutos: ABS

Exemplos

EXTRN _printf: FAR ; localização da rotina_printf

(24)

Operadores (1)

Operadores do Asm86 para cálculo de expressões:

1. LABEL: localização do topo da zona de memória declarada

imediatamente atrás

dw 4096 dup(?) _top LABEL WORD

Prof RG Crespo Software de Telecomunicações Assembly86 : 47/79

_top LABEL WORD ;

mov ax, offset _top ; inicializar pilha

mov sp,ax ; //

2. OFFSET: deslocamento de variável ou etiqueta em relação ao

segmento

MOV EAX, OFFSET _hello LEA EAX, _hello

Operadores (2)

3. PTR: imposição de espaço

CALL FAR PTR subrot3

PUSH BYTE PTR [EBP]; carrega Byte endereçado por EBP

4. LENGTH: número de elementos de um array

5. SIZE: espaço ocupado (em Bytes)

array DW 100 DUP(1)

MOV EBX, LENGTH array ; EBX <- 100 MOV ECX,SIZE array ; ECX <- 200

(25)

Programa tipo (1)

Formato típico de um programa MASM

.model medium ;modelo DIM equ 40 ;constantes extrn _print:near ;visibilidade

Prof RG Crespo Software de Telecomunicações Assembly86 : 49/79

extrn _print:near ;

$pushr macro ;macros endm

_data segment word public 'DATA' ;declarações dados

_data ends

Programa tipo (2)

_stack segment para stack 'STACK' stk dw 1024 dup(?)

_top label word _stack ends

_code segment word public 'CODE'

assume cs:_code,ds:_data,ss:_stack _start:

;programa _code ends

(26)

Instruções (1)

• Instruções do IA-32 divididas em 9 classes

Classe Objectivos

Aritméticas

Conversão Conversão de dados

Prof RG Crespo Software de Telecomunicações Assembly86 : 51/79 Lógicas

Movimentação Deslocamento de informação de um local para outro Pilha Manipulação da pilha

Processador

Repetição Ciclos

Salto Alteração do registo IP

Teste Modificação do registo de bandeiras

Instruções (2)

As seguintes abreviaturas são usadas:

Abreviatura Significado accum acumulador (EAX,AX ou AL)

reg registo Byte (AL,…), Word (AX,…) ou Dword (EAX…) reg registo Byte (AL,…), Word (AX,…) ou Dword (EAX…) segreg registo segmento

r/m operando geral: registo, endereço de memória, operando indexado, operando baseado ou operando indexado baseado immed valor imediato (8 ou 16 bits)

mem operando de memória (etiqueta, variável ou símbolo) label etiqueta de instrução

(27)

Instruções (3)

A. Aritméticas

ADC accum,immed Add immediate with carry to accumulator ADC r/m,immed Add immediate with carry to operand ADC r/m,reg Add register with carry to operand ADC reg,r/m Add operand with carry to register ADD accum,immed Add immediate to accumulator

Prof RG Crespo Software de Telecomunicações Assembly86 : 53/79 ADD accum,immed Add immediate to accumulator

ADD r/m,immed Add immediate to operand ADD r/m,reg Add register to operand ADD reg,r/m Add operand to reg

DEC r/m Decrement operand

DEC reg Decrement 16-bit register DIV r/m Divide accumulator by operand IDIV r/m Integer divide accumulator by operand IMUL r/m Integer multiply accumulator by operand

Instruções (4)

INC r/m Increment operand INC reg Increment 16-bit register

MUL r/m Multiply accumulator by operand NEG r/m Negate operand

SBB accum,immed Subtract immediate with borrow SBB r/m,immed Subtract immediate with borrow SBB r/m,immed Subtract immediate with borrow SBB r/m,reg Subtract register with borrow SBB reg,r/m Subtract operand and carry flag SUB accum,immed Subtract immediate from accumulator SUB r/m,immed Subtract immediate from operand SUB r/m,reg Subtract register from operand SUB reg,r/m Subtract operand from register

(28)

Instruções (5)

B. Conversão

AAA ASCII adjust for addition AAD ASCII adjust for division AAM ASCII adjust for multiplication AAS ASCII adjust for subtraction

Prof RG Crespo Software de Telecomunicações Assembly86 : 55/79

AAS ASCII adjust for subtraction CBW Convert byte to word

CDQ Convert double word to quad word CWD Convert word to double word DAA Decimal adjust for addition DAS Decimal adjust for substraction

Instruções (6)

Exemplos

i. Multiplicação de inteiros

[DX:AX] <- AX * r/m

– O resultado de uma multiplicação de dois inteiros de 16 bits é – O resultado de uma multiplicação de dois inteiros de 16 bits é

um inteiro de 32 bits, residente no par DX:AX

– Normalmente, o multiplicador é colocado no registo DX MOV AX,y ; carrega multiplicando

MOV DX,5 ; carrega multiplicador IMUL DX ; DX:AX <- y*5

(29)

Instruções (7)

ii. Divisão de inteiros

AX <- [DX:AX] / r/m

A instrução IDIV r/m exige um dividendo com 32 bits

– A conversão de um inteiro de 16 bits para inteiro de 32 bits é efectuada pela instrução CWD

Prof RG Crespo Software de Telecomunicações Assembly86 : 57/79

efectuada pela instrução CWD

MOV AX,y ; carrega dividendo CWD

MOV BX,5 ; carrega divisor

IDIV BX ; AX <- y/5, DX <- resto divisão

Instruções (8)

C. Lógicas

AND accum,immed Bitwise And immediate with accumulator AND r/m,immed Bitwise And immediate with operand AND r/m,reg Bitwise And register with operand AND reg,r/m Bitwise And operand with register NOT r/m Invert operand bits

NOT r/m Invert operand bits

OR accum,immed Bitwise Or immediate with accumulator OR r/m,immed Bitwise Or immediate with operand OR r/m,reg Bitwise Or register with operand OR reg,r/m Bitwise Or operand with register RCL r/m,1 Rotate left through carry by 1 bit RCL r/m,CL Rotate left through carry by CL RCR r/m,1 Rotate right through carry by 1 bit RCR r/m,CL Rotate right through carry by CL

(30)

Instruções (9)

ROL r/m,1 Rotate left by 1 bit ROL r/m,CL Rotate left by CL ROR r/m,1 Rotate right by 1 bit ROR r/m,CL Rotate right by CL ROR r/m,CL Rotate right by CL

SAL r/m,1 Shift arithmetic left by 1 bit SAL r/m,CL Shift arithmetic left by CL SAR r/m,1 Shift arithmetic right by 1 bit

Prof RG Crespo Software de Telecomunicações Assembly86 : 59/79

SAR r/m,1 Shift arithmetic right by 1 bit SAR r/m,CL Shift arithmetic right by CL SHL r/m,1 Shift left by 1 bit

SHL r/m,CL Shift left by CL SHL r/m,1 Shift right by 1 bit SHL r/m,CL Shift right by CL

XOR accum,immed Bitwise Xor immediate with accumulator XOR r/m,immed Bitwise Xor immediate with operand XOR r/m,reg Bitwise Xor register with operand XOR reg,r/m Bitwise Xor operand with register

Instruções (10)

D. Movimentação de dados

IN accum,immed Input from port (8-bit immediate) IN accum,DX Input from port given by DX LAHF Load AH with flags

LDS r/m Load operand into DS

LEA r/m Load effective address of operand LES r/m Load operand into ES

LES r/m Load operand into ES LODS src Load string

LODSB Load byte from string into AL LODSW Load word from string into AH MOV accum,mem Move memory to accumulator MOV mem,accum Move accumulator to memory MOV r/m,immed Move immediate to operand MOV r/m,reg Move register to operand

MOV r/m,segreg Move segment register to operand MOV reg,immed Move immediate to register

(31)

Instruções (11)

MOV reg,r/m Move operand to register

MOV segreg, r/m Move operand to segment register MOVS dest,src Move string

MOVSB Move string byte by byte MOVSW Move string word by word bit OUT DX,accum Output to port given by DX OUT immed,accum Output to port (8-bit immediate

Prof RG Crespo Software de Telecomunicações Assembly86 : 61/79

OUT immed,accum Output to port (8-bit immediate SAHF Store AH into flags

STOS dest Store string

STOSB Store byte in AL at string STOSW Store word in AX at string

XCHG accum,reg Exchange accumulator with register XCHG r/m,reg Exchange operand with register XCHG r/reg,accum Exchange register with accumulator XCHG reg,r/m Exchange register with operand XLAT mem Translate

Instruções (12)

E. Pilha

CALL label Call instruction at label CALL r/m Call instruction indirect

INT3 Software interrupt 3 (encoded as one byte) INT immed Software Interrupt 0 through 255

INT immed Software Interrupt 0 through 255 INTO Interrupt on overflow

IRET Return from interrupt POP r/m Pop 16-bit operand

POP reg Pop 16-bit register from stack POP segreg Pop segment register

POPA Pop todos os registos POPF Pop flags

(32)

Instruções (13)

PUSH r/m Push 16-bit operand

PUSH reg Push 16-bit register onto stack PUSH segreg Push segment register

PUSHA Push all registers PUSHF Push flags

RET [immed] Return after popping bytes from stack

Prof RG Crespo Software de Telecomunicações Assembly86 : 63/79

F.Processador

ESC immed,r/m Escape with 6-bit immediate and operand

HLT Halt

LOCK Lock bus NOP No operation WAIT Wait

Instruções (14)

G.Repetição

LOOP label Loop

LOOPE label Loop while equal LOOPNE label Loop while not equal LOOPNZ label Loop while not zero LOOPNZ label Loop while not zero LOOPZ label Loop while zero REPE Repeat if equal REPNE Repeat if not equal REPNZ Repeat if not zero REPZ Repeat if zero SCAS dest Scan string

(33)

Instruções (15)

H.Salto

JA label Jump on above

JAE label Jump on above or equal JB label Jump on below

JBE label Jump on below or equal JC label Jump on carry

Prof RG Crespo Software de Telecomunicações Assembly86 : 65/79

JC label Jump on carry

JCE label Jump on carry or equal JCXZ label Jump on CX zero JE label Jump on equal

JGE label Jump on greater or equal JL label Jump on less then

JLE label Jump on less then or equal JMP label Jump to instruction at label JMP r/m Jump to instruction indirect

Instruções (16)

JNA label Jump on not above

JNAE label Jump on not above or equal JNB label Jump on not below

JNBE label Jump on not below or equal JNC label Jump on not carry

JNE label Jump on not equal JNG label Jump on not greater JNG label Jump on not greater

JNGE label Jump on not greater or equal JNL label Jump on not less than

JNLE label Jump on not less than or equal JNO label Jump on not overflow

JP label Jump on parity JPE label Jump on parity even JPO label Jump on parity odd JS label Jump on sign JZ label Jump on zero

(34)

Instruções (17)

I. Teste

CLC Clear carry flag

CLD Clear direction flag

CLI Clear interrupt flag

CMC Complement carry flag

CMP accum,immed Compare immediate with accumulator CMP r/m,immed Compare immediate with operand CMP r/m,reg Compare register with operand

Prof RG Crespo Software de Telecomunicações Assembly86 : 67/79 CMP r/m,reg Compare register with operand

CMP reg,r/m Compare operand with register CMPS src,dest Compare strings

CMPSB Compare strings byte for byte

CMPSW Compare strings word for word

STC Set carry flag

STD Set direction flag

STI Set interrupt flag

TEST accum,immed Compare immediate bits with accumulator TEST r/m,immed Compare immediate bits with operand TEST r/m,reg Compare register bits with operand TEST reg,r/m Compare operand bits with register

Transcrição de Expressões (1)

• Uma expressão em C é transcrita para Asm86 pela

sequência de instruções

1. Identificar a árvore de expressões, em profundidade 2. Para cada subexpressão E1op E2

1. Se operando E1não estiver no registo, carregá-lo. 1. Se operando E1não estiver no registo, carregá-lo.

2. Gerar instrução op E1,E2 (modo imediato, directo ou registo depende do operando E2)

3. Resultado encontra-se disponível no registo E1

Nota 1: selecção dos registos pode depender da operação. Se necessário deslocar conteúdo de registos

Nota 2: registos devem ser seleccionados de forma criteriosa, para minimizar deslocamentos.

(35)

Transcrição de Expressões (2)

Exemplos:

; x+5

MOV EAX,[$x]

ADD EAX,5 ; resultado colocado em [EAX] ; z*y

MOV EAX,[$z]

Prof RG Crespo Software de Telecomunicações Assembly86 : 69/79

MOV EAX,[$z] MOV EDX,[$y]

IMUL EDX ; resultado colocado em [EDX:EAX] ; 7*(x+1) // subexpressões: E1=x+1 e E2=7*E1

MOV EAX,[$x]

INC EAX ; resultado colocado em [EAX] MOV EDX,7

IMUL EDX

Transcrição de Execução condicional (1)

• Um if em C é transcrito para Asm86 pela seguinte

sequência de instruções

1. Gerar instruções de cálculo da expressão de teste 2. Gerar comparação CMP

3. Inserir teste curto para ramo mais próximo (THEN) 3. Inserir teste curto para ramo mais próximo (THEN) 4. Inserir salto para ramo mais afastado (ELSE)

5. No final do ramo mais próximo, inserir salto para depois do ramo mais afastado.

Nota

: Lembrar que na instrução de teste curto (J…), o

destino tem de estar a meio Byte de distância

(36)

Transcrição de Execução condicional (2)

Exemplo:

; if((x+y)>=10)

MOV EAX,[$x]

ADD EAX,[$y] ; subexpressão colocada em [EAX] CMP EAX,10

JGE lbl_if

Prof RG Crespo Software de Telecomunicações Assembly86 : 71/79

JGE lbl_if JMP lbl_else lbl_if: ; bloco do IF JMP lbl_after lbl_else: ; bloco do ELSE lbl_after:

Transcrição de Ciclo (1)

• Um while em C é transcrito para Asm86 pela

seguinte sequência de instruções

1. Gerar instruções de cálculo da expressão de teste. 2. Gerar comparação CMP.

3. Inserir teste curto para corpo (caso TRUE). 3. Inserir teste curto para corpo (caso TRUE). 4. Inserir salto para fora do corpo (caso FALSE).

(37)

Transcrição de Ciclo (2)

Exemplo:

; while (x<100) lbl_cycle: MOV EAX,[$x] CMP EAX,100 JL lbl_block

Prof RG Crespo Software de Telecomunicações Assembly86 : 73/79

JL lbl_block JMP lbl_after lbl_block: ; bloco corpo JMP lbl_cycle lbl_after:

Transcrição de rotinas (1)

• Rotinas chamadora e chamada usam pilha para guardar

parâmetros, endereço de retorno, e espaço de variáveis

locais.

• Valor de retorno pode ser armazenado num registo

(tipicamente EAX) ou na pilha.

(tipicamente EAX) ou na pilha.

Parâmetros

end. retorno

Rotina chamadora

Registos Variáveis locais

Rotina chamada

ESP

EBP

(38)

Transcrição de rotinas (2)

Passos na execução de rotinas

Rotina chamadora

1. Carregar parâmetros, pela instrução PUSH.

2. Chamar rotina pela instrução CALL (o processador insere automaticamente na pilha o endereço de retorno).

Prof RG Crespo Software de Telecomunicações Assembly86 : 75/79

Início da rotina chamada

1. Salvaguardar registos (pelo menos, EBP).

2. Copiar ESP para EBP (que passa a referenciar o registo de activação-“frame register”).

3. Subtrair a ESP espaço para as variáveis locais.

Transcrição de rotinas (3)

– Variáveis locais acedidas pelo endereço [EBP-desl] – Parâmetros acedidos pelo endereço [EBP+desl]:

se forem salvaguardados 4 registos num processador de 16 bits, o último parâmetro está deslocado de 4*2+2=10 Bytes.

Fim da rotina chamada Fim da rotina chamada

1. Instalar no EAX o valor de retorno.

2. Incrementar em ESP o espaço de variáveis locais.

3. Recuperar da pilha os registos, pela ordem inversa de

salvaguarda.

4. Executar instrução RET nn (nn - espaço dos

parâmetros).

(39)

Ferramentas (1)

• Ferramentas suportadas pela Microsoft

– masm fich.asm

• Gera ficheiro objecto de extensão .OBJ

– link fich1+fich2 ,,,,,

• Por omissão, os ficheiros de entrada possuem extensão .COM • Por omissão, gera fich1.EXE

• Opção /t gera ficheiro .COM

Prof RG Crespo Software de Telecomunicações Assembly86 : 77/79 • Opção /t gera ficheiro .COM

Ambiente:

– No MSDOS, acrescentar no autoexec.bat

– No Windows XP ou Vista executar na janela de comandos o ficheiro C:\PROGRAMF\MASM611\BINR\NEW-VARS.BAT SET PATH=C:\PROGRAMF\MASM611\BIN;C:\PROGRAMF\MASM611\BINR;%PATH% SET LIB=C:\PROGRAMF\MASM611\LIB SET INCLUDE=C:\PROGRAMF\MASM611\INCLUDE;%INCLUDE% SET INIT=C:\PROGRAMF\MASM611\INIT SET HELPFILES=C:\PROGRAMF\MASM611\HELP\*.HLP SET TMP=C:\USERS\CRESPO\APPDATA\LOCAL\TEMP

Ferramentas (2)

• Outras ferramentas

– NASM (http://nasm.sourceforge.net)

Corre no Linux

– YASM (http://www.tortall.net/projects/yasm)

Suporta x86 e AMD64

(40)

Exemplo em MSDOS

.model tiny

CR equ 0DH LF equ 0AH

code segment word public 'CODE' org 0100H

assume cs:_code,ds:_code,ss:_code start:

Prof RG Crespo Software de Telecomunicações Assembly86 : 79/79

start:

mov dx, offset msg1 ; imprime mensagem introducao mov ah,09h

int 21h

_close: mov al,00 ; termina programa mov ah,04ch

int 21h

msg1 db "Sou o programa 1",CR,LF,"$" code ends

Referências

Documentos relacionados

Abstract Faced with the historical role of or- ganized civil society in the social responses to AIDS and the global health governance, this paper analyzes the biography of

Três artigos utilizaram critérios padronizados para definição de fragilidade e quatro estudos avaliaram a capacidade funcional como sinônimo de síndrome de fragilidade.. Conclusão:

Os objetivos deste trabalho são conhecer os problemas orais resultantes da radioterapia feita para o tratamento de neoplasias na área da cabeça e pescoço assim

O objetivo geral deste estudo foi verificar a diferença de desempenho dos sujeitos em relação ao gênero e os procedimentos utilizados pelos sujeitos, para solucionar os

We studied the lipid stability in patties prepared with salt with or without iodide, and mixed with meat from chicken or beef.. Ground meat was mixed and ice, salt, onion, garlic

• Se nenhuma aplicação for iniciada ou se a aplicação estiver minimizada, a imagem digitalizada será guardada numa pasta predefinida (para obter mais informações sobre como

Valley fold the bottom point up so that the intersection of the edge of the paper and the angle bisector from Step 1 lays on the crease line from Step 2.. Rotate the

Par la montée puis la persistance de l’écran noir (à la fois page blanche du cinéma mais aussi espace vide de la réception) Marguerite Duras réalise ce “film de