Software de Telecomunicações Tópicos de Assembly86 Prof RG Crespo Software de Telecomunicações Assembly86 : 1/79 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 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 2006: Core 2-151M transistores, 20_000 MIPS Prof RG Crespo Software de Telecomunicações Assembly86 : 2/79
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. 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 Prof RG Crespo Software de Telecomunicações Assembly86 : 3/79 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, ) 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. Prof RG Crespo Software de Telecomunicações Assembly86 : 4/79
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) 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. Prof RG Crespo Software de Telecomunicações Assembly86 : 5/79 Pentium arquitectura (3) Distribuição das componentes de um programa no Pentium EBP SP Pilha Registos segmento SS DS EIP Arena Dados estáticos Código Registos uso geral CS EAX EBX ECX EDX EDI ESI Prof RG Crespo Software de Telecomunicações Assembly86 : 6/79
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 1 de bandeiras ( flags ) 8 de vírgula flutuante ( floating point ) 8 de multimedia Prof RG Crespo Software de Telecomunicações Assembly86 : 7/79 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 CH CL CX ECX DH DL DX EDX Deslocamentos de blocos de memória{ BP SI DI SP EBP ESI EDI ESP Prof RG Crespo Software de Telecomunicações Assembly86 : 8/79
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 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). Prof RG Crespo Software de Telecomunicações Assembly86 : 9/79 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). ESI,EDI: utilizados como deslocamentos a partir de um registo base (ESI indica deslocamento de uma fonte e EDI indica deslocamento de um destino). Prof RG Crespo Software de Telecomunicações Assembly86 : 10/79
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. Parâmetros Sentido do PUSH EBP ESP End. retorno Registos Variáveis locais Posições livres Espaço obtido por subtracção de SP Prof RG Crespo Software de Telecomunicações Assembly86 : 11/79 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) Prof RG Crespo Software de Telecomunicações Assembly86 : 12/79
Registos: uso geral (6) Tipo registo Modo compatível IA32 Modo 64-bit Byte Word Double AL,BL,CL,DL, AH,BH,CH,DH AX,BX,CX,DX, DI,SI, BP,SP EAX,EBX,ECX,EDX, EDI,ESI, EBP,ESP AL,BL,CL,DL, DIL,SIL, BPL,SPL, R8L-R15L AX,BX,CX,DX, DI,SI, BP,SP, R8W-R15W EAX,EBX,ECX,EDX, EDI,ESI, EBP,ESP, R8D-R15D Quad -- RAX,RBX,RCX,RDX, RDI,RSI, RBP,RSP, R8-R15 Prof RG Crespo Software de Telecomunicações Assembly86 : 13/79 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) 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). Prof RG Crespo Software de Telecomunicações Assembly86 : 14/79
Registo: bandeiras (2) Nome CF PF AF ZF SF TF IF DF OF Função Carry flag. Colocado a 1 se houver transporte ou empréstimo. Parity flag. Colocado a 1 se os 8 bits inferiores tiverem número par de 1's. Auxiliary carry flag. Colocado a 1 se houver transporte ou empréstimo dos 4 bits inferiores de AL Zero flag. Colocado a 1 se o resultado for nulo Sign flag. Igual ao bit mais significativo Trap flag. Interrupt flag. Direction flag. Overflow flag. Colocado a 1 se o resultado não puder ser expresso dentro do numero de bits do destino. Prof RG Crespo Software de Telecomunicações Assembly86 : 15/79 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 Prof RG Crespo Software de Telecomunicações Assembly86 : 16/79
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 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 Prof RG Crespo Software de Telecomunicações Assembly86 : 17/79 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 Ex: CS=01200h, IP=03f7h Endereço efectivo = 021000h+03f7h = 0123f7h Segmento offset EA 64KB 00000h Prof RG Crespo Software de Telecomunicações Assembly86 : 18/79
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 [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] Prof RG Crespo Software de Telecomunicações Assembly86 : 19/79 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 Large: segmentos separados Prof RG Crespo Software de Telecomunicações Assembly86 : 20/79
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 Descritores Descritores Segmento 13 bits Endereço Limite superior Endereço base 32bits 32bits EA LDT- Local Descriptor Table, uma por processo GDT- Global Descriptor Table, uma para o sistema operativo Prof RG Crespo Software de Telecomunicações Assembly86 : 21/79 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=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 Prof RG Crespo Software de Telecomunicações Assembly86 : 22/79
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 2 32 = 4GB. No IA64, modo 64-bit, o endereçamento linear depende da 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çamento Linear (virtual) Prof RG Crespo Software de Telecomunicações Assembly86 : 23/79 Modos de acesso à memória (8) Na realidade, o endereço virtual é transcrito para endereço físico por paginação Prof RG Crespo Software de Telecomunicações Assembly86 : 24/79
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, Dword-4): MOV EAX,0h PUSH Byte PTR 0 ; 32 bits ; 8 bits 2. Registo PUSH CX POP EAX ; 16 bits ; 32 bits Prof RG Crespo Software de Telecomunicações Assembly86 : 25/79 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 (modo suportado a partir do 386) Prof RG Crespo Software de Telecomunicações Assembly86 : 26/79
Endereçamento operandos (3) Exemplos: Instrução PUSH Byte PTR [$m+1] PUSH Word PTR [$m+eax*2] PUSH Byte PTR [$m+edx+ebp] Significado Insere na pilha Byte de endereço seguinte a $m Insere na pilha Word de uma tabela $m no índice indicado em EAX*2 Insere na pilha Byte de endereço $m mais soma dos conteúdos de EDX e de EBP Prof RG Crespo Software de Telecomunicações Assembly86 : 27/79 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. 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. Prof RG Crespo Software de Telecomunicações Assembly86 : 28/79
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 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) Prof RG Crespo Software de Telecomunicações Assembly86 : 29/79 Formato de instruções As instruções variam entre 1 e 5 B Prefixo Opcode Mode SIB disp-low disp-high Operação Destino Byte/Word Mod Reg r/m 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 Prof RG Crespo Software de Telecomunicações Assembly86 : 30/79
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 terminam obrigatoriamente por um NEWLINE. Comentários podem ser colocados a seguir a ; Prof RG Crespo Software de Telecomunicações Assembly86 : 31/79 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 1 não confundir com registo de segmento Prof RG Crespo Software de Telecomunicações Assembly86 : 32/79
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 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) Prof RG Crespo Software de Telecomunicações Assembly86 : 33/79 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 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 Prof RG Crespo Software de Telecomunicações Assembly86 : 34/79
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 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. Prof RG Crespo Software de Telecomunicações Assembly86 : 35/79 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 MOV EAX,data ; ponto entrada do programa ; inicialização do DS MOV DS,EAX ; // LEA ESP,_top ; inicialização do SP ; _code ENDS END main Prof RG Crespo Software de Telecomunicações Assembly86 : 36/79
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. 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 Prof RG Crespo Software de Telecomunicações Assembly86 : 37/79 Directivas (7) PROC, ENDP Delimitam rotinas name PROC type 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. No corpo da rotina deve existir pelo menos uma instrução ret. Prof RG Crespo Software de Telecomunicações Assembly86 : 38/79
Directivas (8) ORG Inicializa o contador para a expressão (que deve ser um numero absoluto). _code SEGMENT PARA PUBLIC 'CODE' ORG 0100h ASSUME CS:_code, DS:_code, SS:_code _main PROC NEAR ; ; programa e dados ; _code ENDS ; ponto entrada do programa END _main Prof RG Crespo Software de Telecomunicações Assembly86 : 39/79 Directivas (9) EQU Constante na forma name EQU valor CR EQU 0dh LF EQU 0ah DIM EQU 100 _newline DB CR,LF, $ _data DB DIM DUP(0) Prof RG Crespo Software de Telecomunicações Assembly86 : 40/79
Directivas (10) macro Inserção inline de código, delimitado por macro endm $pushr MACRO push push push push ENDM $pushr ; salvaguarda registos na pilha bp bx cx dx Prof RG Crespo Software de Telecomunicações Assembly86 : 41/79 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, 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' ) Prof RG Crespo Software de Telecomunicações Assembly86 : 42/79
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 Letras minúsculas convertidas para maiúsculas. Apenas são considerados os primeiros 31 caracteres. Prof RG Crespo Software de Telecomunicações Assembly86 : 43/79 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 Quádruplo DQ 64 double Prof RG Crespo Software de Telecomunicações Assembly86 : 44/79
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 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 $ Prof RG Crespo Software de Telecomunicações Assembly86 : 45/79 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 EXTRN var1: BYTE ; localização da variável de 1 BYTE var1 Prof RG Crespo Software de Telecomunicações Assembly86 : 46/79
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 _top dw 4096 dup(?) 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 LEA EAX, OFFSET _hello EAX, _hello Prof RG Crespo Software de Telecomunicações Assembly86 : 47/79 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 Prof RG Crespo Software de Telecomunicações Assembly86 : 48/79
Programa tipo (1) Formato típico de um programa MASM.model medium ;modelo DIM equ 40 ;constantes extrn _print:near ;visibilidade $pushr macro endm ;macros _data segment word public 'DATA' _data ends ;declarações dados Prof RG Crespo Software de Telecomunicações Assembly86 : 49/79 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 end _start Prof RG Crespo Software de Telecomunicações Assembly86 : 50/79
Instruções (1) Instruções do IA-32 divididas em 9 classes Classe Aritméticas Conversão Lógicas Movimentação Pilha Processador Repetição Salto Teste Objectivos Conversão de dados Deslocamento de informação de um local para outro Manipulação da pilha Ciclos Alteração do registo IP Modificação do registo de bandeiras Prof RG Crespo Software de Telecomunicações Assembly86 : 51/79 Instruções (2) As seguintes abreviaturas são usadas: Abreviatura accum reg segreg r/m immed mem label acumulador (EAX,AX ou AL) Significado registo Byte (AL, ), Word (AX, ) ou Dword (EAX ) registo segmento operando geral: registo, endereço de memória, operando indexado, operando baseado ou operando indexado baseado valor imediato (8 ou 16 bits) operando de memória (etiqueta, variável ou símbolo) etiqueta de instrução Prof RG Crespo Software de Telecomunicações Assembly86 : 52/79
Instruções (3) A. Aritméticas ADC accum,immed ADC r/m,immed ADC r/m,reg ADC reg,r/m ADD accum,immed ADD r/m,immed ADD r/m,reg ADD reg,r/m DEC r/m DEC reg DIV r/m IDIV r/m IMUL r/m Add immediate with carry to accumulator Add immediate with carry to operand Add register with carry to operand Add operand with carry to register Add immediate to accumulator Add immediate to operand Add register to operand Add operand to reg Decrement operand Decrement 16-bit register Divide accumulator by operand Integer divide accumulator by operand Integer multiply accumulator by operand Prof RG Crespo Software de Telecomunicações Assembly86 : 53/79 Instruções (4) INC r/m INC reg MUL r/m NEG r/m SBB accum,immed SBB r/m,immed SBB r/m,reg SBB reg,r/m SUB accum,immed SUB r/m,immed SUB r/m,reg SUB reg,r/m Increment operand Increment 16-bit register Multiply accumulator by operand Negate operand Subtract immediate with borrow Subtract immediate with borrow Subtract register with borrow Subtract operand and carry flag Subtract immediate from accumulator Subtract immediate from operand Subtract register from operand Subtract operand from register Prof RG Crespo Software de Telecomunicações Assembly86 : 54/79
Instruções (5) B. Conversão AAA AAD AAM AAS CBW CDQ CWD DAA DAS ASCII adjust for addition ASCII adjust for division ASCII adjust for multiplication ASCII adjust for subtraction Convert byte to word Convert double word to quad word Convert word to double word Decimal adjust for addition Decimal adjust for substraction Prof RG Crespo Software de Telecomunicações Assembly86 : 55/79 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 é 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 Prof RG Crespo Software de Telecomunicações Assembly86 : 56/79
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 MOV AX,y ; carrega dividendo CWD MOV BX,5 ; carrega divisor IDIV BX ; AX <- y/5, DX <- resto divisão Prof RG Crespo Software de Telecomunicações Assembly86 : 57/79 Instruções (8) C. Lógicas AND accum,immed AND r/m,immed AND r/m,reg AND reg,r/m NOT r/m OR accum,immed OR r/m,immed OR r/m,reg OR reg,r/m RCL r/m,1 RCL r/m,cl RCR r/m,1 RCR r/m,cl Bitwise And immediate with accumulator Bitwise And immediate with operand Bitwise And register with operand Bitwise And operand with register Invert operand bits Bitwise Or immediate with accumulator Bitwise Or immediate with operand Bitwise Or register with operand Bitwise Or operand with register Rotate left through carry by 1 bit Rotate left through carry by CL Rotate right through carry by 1 bit Rotate right through carry by CL Prof RG Crespo Software de Telecomunicações Assembly86 : 58/79
Instruções (9) ROL r/m,1 ROL r/m,cl ROR r/m,1 ROR r/m,cl ROR r/m,cl SAL r/m,1 SAL r/m,cl SAR r/m,1 SAR r/m,cl SHL r/m,1 SHL r/m,cl SHL r/m,1 SHL r/m,cl XOR accum,immed XOR r/m,immed XOR r/m,reg XOR reg,r/m Rotate left by 1 bit Rotate left by CL Rotate right by 1 bit Rotate right by CL Rotate right by CL Shift arithmetic left by 1 bit Shift arithmetic left by CL Shift arithmetic right by 1 bit Shift arithmetic right by CL Shift left by 1 bit Shift left by CL Shift right by 1 bit Shift right by CL Bitwise Xor immediate with accumulator Bitwise Xor immediate with operand Bitwise Xor register with operand Bitwise Xor operand with register Prof RG Crespo Software de Telecomunicações Assembly86 : 59/79 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 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 Prof RG Crespo Software de Telecomunicações Assembly86 : 60/79
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 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 Prof RG Crespo Software de Telecomunicações Assembly86 : 61/79 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 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 Prof RG Crespo Software de Telecomunicações Assembly86 : 62/79
Instruções (13) PUSH r/m PUSH reg PUSH segreg PUSHA PUSHF RET [immed] F.Processador ESC immed,r/m HLT LOCK NOP WAIT Push 16-bit operand Push 16-bit register onto stack Push segment register Push all registers Push flags Return after popping bytes from stack Escape with 6-bit immediate and operand Halt Lock bus No operation Wait Prof RG Crespo Software de Telecomunicações Assembly86 : 63/79 Instruções (14) G.Repetição LOOP label LOOPE label LOOPNE label LOOPNZ label LOOPZ label REPE REPNE REPNZ REPZ SCAS dest Loop Loop while equal Loop while not equal Loop while not zero Loop while zero Repeat if equal Repeat if not equal Repeat if not zero Repeat if zero Scan string Prof RG Crespo Software de Telecomunicações Assembly86 : 64/79
Instruções (15) H.Salto JA label JAE label JB label JBE label JC label JCE label JCXZ label JE label JGE label JL label JLE label JMP label JMP r/m Jump on above Jump on above or equal Jump on below Jump on below or equal Jump on carry Jump on carry or equal Jump on CX zero Jump on equal Jump on greater or equal Jump on less then Jump on less then or equal Jump to instruction at label Jump to instruction indirect Prof RG Crespo Software de Telecomunicações Assembly86 : 65/79 Instruções (16) JNA label JNAE label JNB label JNBE label JNC label JNE label JNG label JNGE label JNL label JNLE label JNO label JP label JPE label JPO label JS label JZ label Jump on not above Jump on not above or equal Jump on not below Jump on not below or equal Jump on not carry Jump on not equal Jump on not greater Jump on not greater or equal Jump on not less than Jump on not less than or equal Jump on not overflow Jump on parity Jump on parity even Jump on parity odd Jump on sign Jump on zero Prof RG Crespo Software de Telecomunicações Assembly86 : 66/79
Instruções (17) I. Teste CLC CLD CLI CMC CMP accum,immed CMP r/m,immed CMP r/m,reg CMP reg,r/m CMPS src,dest CMPSB CMPSW STC STD STI TEST accum,immed TEST r/m,immed TEST r/m,reg TEST reg,r/m Clear carry flag Clear direction flag Clear interrupt flag Complement carry flag Compare immediate with accumulator Compare immediate with operand Compare register with operand Compare operand with register Compare strings Compare strings byte for byte Compare strings word for word Set carry flag Set direction flag Set interrupt flag Compare immediate bits with accumulator Compare immediate bits with operand Compare register bits with operand Compare operand bits with register Prof RG Crespo Software de Telecomunicações Assembly86 : 67/79 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 E 1 op E 2 1. Se operando E 1 não estiver no registo, carregá-lo. 2. Gerar instrução op E 1,E 2 (modo imediato, directo ou registo depende do operando E 2 ) 3. Resultado encontra-se disponível no registo E 1 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. Prof RG Crespo Software de Telecomunicações Assembly86 : 68/79
Transcrição de Expressões (2) Exemplos: ; x+5 MOV EAX,[$x] ADD EAX,5 ; resultado colocado em [EAX] ; z*y MOV EAX,[$z] MOV EDX,[$y] IMUL EDX ; resultado colocado em [EDX:EAX] ; 7*(x+1) // subexpressões: E 1 =x+1 e E 2 =7*E 1 MOV EAX,[$x] INC EAX ; resultado colocado em [EAX] MOV EDX,7 IMUL EDX Prof RG Crespo Software de Telecomunicações Assembly86 : 69/79 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) 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 Prof RG Crespo Software de Telecomunicações Assembly86 : 70/79
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 JMP lbl_else lbl_if: ; bloco do IF JMP lbl_after lbl_else: ; bloco do ELSE lbl_after: Prof RG Crespo Software de Telecomunicações Assembly86 : 71/79 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). 4. Inserir salto para fora do corpo (caso FALSE). 5. No final do corpo, inserir salto para cálculo da expressão de teste. Prof RG Crespo Software de Telecomunicações Assembly86 : 72/79
Transcrição de Ciclo (2) Exemplo: ; while (x<100) lbl_cycle: MOV EAX,[$x] CMP EAX,100 JL lbl_block JMP lbl_after lbl_block: ; bloco corpo JMP lbl_cycle lbl_after: Prof RG Crespo Software de Telecomunicações Assembly86 : 73/79 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. EBP ESP Parâmetros end. retorno Registos Variáveis locais Rotina chamadora Rotina chamada Prof RG Crespo Software de Telecomunicações Assembly86 : 74/79
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). 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. Prof RG Crespo Software de Telecomunicações Assembly86 : 75/79 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 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). Prof RG Crespo Software de Telecomunicações Assembly86 : 76/79
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 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 Prof RG Crespo Software de Telecomunicações Assembly86 : 77/79 Ferramentas (2) Outras ferramentas NASM (http://nasm.sourceforge.net) Corre no Linux YASM (http://www.tortall.net/projects/yasm) Suporta x86 e AMD64 Gera ficheiros objecto elf (Unix), win32 e win64 Prof RG Crespo Software de Telecomunicações Assembly86 : 78/79
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: 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 end _start Prof RG Crespo Software de Telecomunicações Assembly86 : 79/79