Microprocessadores Intel Enfim, a dura realidade (ou: que saudades dos simuladores….) Chip 8088(6) 80186 80286 ALU 16 16 16 reg 16 16 16 dado 8 (16) 16 16 End. 20 20 24 386SX 80386 486SX 80486 486DX2 32 32 32 32 32 32 32 32 32 32 16 32 32 32 32 32 32 32 32 32 DX4 32 32 32 32 Pentium 32 32 64 32 Pentium Pro 32 32 64 36 Pentium MMX 32 32 64 32 Pentium II 32 32 64 36 Cache - Características micro de 16 bits 8086 & circuitos de apoio memória virtual segmentada e modo protegido 80386 simplificado MMU, 32 bits e modo virtual 8K 80486 sem FPU 8K 80386 com FPU 8K 486 com frequência interna de clock dupla 8K instr. 486 com frequência interna de clock 8K dado tripla 8K instr. 2 pipelines inteiros, FPU de 64 bits, 8K dado lógica de previsão de desvios 8K instr. Pentium, mais renomeação de 8K dado registradores e execução fora de 256Knível2 sequência 16K instr. Pentium, com instruções extras para 16K dado paralelismo (SIMD) 16K instr. Pentium Pro com MMX 16K dado 512Knível2 Chip Pentium ALU reg dado 32 32 64 Pentium Pro 32 32 64 Pentium MMX 32 32 64 Pentium II 32 32 64 Pentium Celeron II 32 32 64 Pentium Celeron A II 32 32 64 Pentium II Xeon 32 32 64 Pentium III 32 32 64 Pentium 4 32 32 64 End. Cache 32 8K instr. 8K dado 36 8K instr. 8K dado 256Knível2 32 16K instr. 16K dado 36 16K instr. 16K dado 512Knível2 36 16K instr. 16K dado 0K nível 2 36 16K instr. 16K dado 128Knível2 36 16K instr. 16K dado cache nív.2 36 16K instr. 16K dado cache nív.2 36 12K instr. 8K dado cache nív.2 Características 2 pipelines inteiros, FPU de 64 bits, lógica de previsão de desvios Pentium, mais renomeação de registradores e execução fora de sequência Pentium, com instruções extras para paralelismo (SIMD) Pentium Pro com MMX Pentium II sem cache de nível 2 Pentium II com cache na mesma frequência da CPU Pentium II com 512K/1M/2M de cache na mesma frequência da CPU Pentium II com instruções extras para paralelismo de ponto flutuante Pentium III com mais instruções extras para paralelismo de ponto flutuante (SSE2) Características tecnológicas Processador 8088(6) 80286 80386 486SX 486DX 486DX2 DX4 Pentium 60/66 Pentium 75/200 Pentium Pro Pentium MMX Pentium II Celeron Celeron A Xeon Pentium III Pentium III E Pentium 4 Cache 8K 8K 8K 16K 2x8K 2x8K 2x8K 2x16K 2x16K 2x16K 2x16K 2x16K 2x16K 2x16K 8K tipo WT WT WT WT WB WB WB WB WB WB WB WB WB WB WB nível 2 256K 512K 0K 128K 512K-2M 512K 256K 256K frequência 1 1/2 1 1 1/2 1 1 mult. 1x 1x 1x 1x 1x 2x 2-3x 1x 1,5-3x 2-3x 1,5-3x 3,5-5x 3,5-5x 3,5-5x 3,5-5x 3,5-5x 4,0-9x 3,0-4x Tensão 5V 5V 5V 5V 5V 5V 3,3 V 5V 3,3 V 3,3 V 1,8-2,8 V 1,8-2,8 V 1,8-2,8 V 1,8-2,8 V 1,8-2,8 V 1,8-2,8 V 1,3-1,7 V 1,3-1,7 V Transistor 29.000 134.000 275.000 1.185.000 1.200.000 1.100.000 1.600.000 3.100.000 3.300.000 5.500.000 4.100.000 7.500.000 7.500.000 7.500.000 7.500.000 9.500.000 28.100.000 42.000.000 Computadores Pessoais tipo PC tipos microprocessador FPU barramento de dados barramento de endereços PC XT PC AT PC AT PC AT 386 486 8088 80286 80386 80486 8087 8 bits 80287 80387 16 bits 32 bits 20 bits 24 bits 30 bits Pentium P5 Pentium, MMX interna interna 32 bits 64 bits Pentium P6 Pentium Pro, II, III, 4 Interna 64 bits 30 bits 33 bits 30 bits • versão PC 99 disponível em http://developer.intel.com/design/desguide ou http://www.microsoft.com/hwdev/pc99.htm. • Usos distintos (servidores, portáteis, domésticos, estações de trabalho, etc) • Configuração básica: – – – – – – – – Pentium II 300 MHz 32 a 64 MBytes de memória barramento PCI (sem conectores ISA) duas portas USB resolução de vídeo de 800 x 600 com 64K cores suporte a CD ou DVD modem de 56 Kbps ou placa de rede opcionais: placas de som, placas aceleradoras 3D, suporte a infravermelho (IrDA) e IEEE 1394 (barramento serial rápido) • versão PC 2001 disponível em http://www.pcdesguide.org. • Usos distintos (servidores, portáteis, domésticos, estações de trabalho, etc) • Configuração básica: – – – – – – – – – Pentium II 667 MHz (desktop) ou 400 MHz (laptop) 64 a 128 MBytes de memória barramento PCI (proibição de conectores ISA) duas portas USB (substituição de portas seriais e paralela) resolução de vídeo de 1024 x 768 com 32 bits por pixel suporte a CD ou DVD modem de 56 Kbps ou placa de rede placa aceleradora 3D em modelos desktop opcionais: placas de som, suporte a infravermelho (IrDA) e IEEE 1394 (barramento serial rápido) Microprocessador Intel 8086 • • • • Arquitetura de 16 bits Comunicação com a memória em 16 (8086) ou 8 (8088) bits Capacidade máxima de memória de 1 MByte 14 registradores (4 dado, 4 endereço, 4 segmento, ponteiro do programa, flags) Microprocessador Intel 8086/8088 15 AX BX CX DX SP BP SI DI IP FLAGS CS DS SS ES 8 AH BH CH DH 7 0 AL BL CL DL acumulador base contador dado ponteiro para pilha ponteiro base índice fonte índice destino apontador de instruções flags segmento de código segmento de dados segmento de pilha segmento extra Microprocessador Intel 8086 • • • • Arquitetura de 16 bits Comunicação com a memória em 16 (8086) ou 8 (8088) bits Capacidade máxima de memória de 1 MByte 14 registradores (4 dado, 4 endereço, 4 segmento, ponteiro do programa, flags) • endereço físico = segmento * 16 + deslocamento 8086 - Formação de endereço 15 0 Offset (deslocamento) CS DS SS ES 15 0 0000 0000 0000 0000 19 0 Endereço Físico Uso padrão de registradores de segmento tipo de referência memória busca de instrução pilha variável à segmento default CS SS DS segmento alternativo BP como base SS CS,ES,DS string fonte string destino DS ES CS,ES,SS CS,ES,SS deslocamento IP SP endereço de operando endereço de operando SI DI Uso padrão de registradores de segmento Modos de endereçamento (cálculo do deslocamento) Modo Imediato Registrador Direto Significado operando na instrução operando em registrador operando na memória, endereçado por deslocamento contido na instrução Registrador indireto operando na memória, endereçado por deslocamento contido em registrador Indexado (ou base) operando na memória, endereçado pela soma do conteúdo do registrador de índice (ou base) com o deslocamento contido na instrução Base e indexado com operando na memória, endereçado pela soma do conteúdo do deslocamento registrador de índice com o conteúdo do registrador base e com o deslocamento contido na instrução Exemplos de modos de endereçamento (ADD destino, fonte) Imediato: ADD CH,5FH Registrador: ADD BX,DX Direto: ADD WVAR,BX (WVAR é uma referência à memória) Registrador indireto: ADD CX,[BX] Indexado (ou base): ADD [SI+6],AL Base e indexado com deslocamento: ADD [BX+DI+5],DX Microprocessador Intel 8086 • • • • Arquitetura de 16 bits Comunicação com a memória em 16 (8086) ou 8 (8088) bits Capacidade máxima de memória de 1 MByte 14 registradores (4 dado, 4 endereço, 4 segmento, ponteiro do programa, flags) • endereço físico = segmento * 16 + deslocamento • 85 instruções básicas AAA AAM ADC AND CBW CLD CMC CMPSB/W DAA DEC ESC IDIV IN INT IRET JA,JNBE JB,JNAE JC JE,JZ JGE,JNL JLE,JNG JNC JNP,JPO JP,JPE LAHF LEA LODSB/W LOOPE/Z MOV MUL NOP OR POP PUSH RCL REP REPNE/Z ROL SAHF SAR SCASB/W SHR STD STOS/W TEST XCHG XOR ASCII Adjust After Adition ASCII Adjust After Multiply Add with Carry Logical And Convert Byte to Word Clear Direction Flag Complement Carry Flag Compare strings (Byte, Word) Decimal Adjust After Division Decrement Escape (for FPU) Signed Divide Input from Port Software Interrupt Interrupt Return (16 bits) Jump if Above Jump if bellow Junp on Carry Jump if Equal (Zero) Jump if Greater or Equal Jump if Less or Equal Jump if not Carry Jump if Parity Odd Jump if Parity Even Load Flags into AH Load Effective Address Load String (Byte, Word) Loop while Equal Move Data Unsigned Multiply No Operation Inclusive Or Pop from Stack Push into Stack Rotate with Carry Left Repeat String Repeat while not Equal (Zero) Rotate Left Store AH into Flags Shift Arithmetic Right Scan String (Byte, Word) Shift Right Set Direction Flag Store String (Byte, Word) Logica Compare Exchange Exclusive Or AAD AAS ADD CALL CLC CLI CMP CWD DAS DIV HLT IMUL INC INTO IRETD JAE,JNB JBE,JNA JCXZ JG,JNLE JL,JNGE JMP JNE,JNZ JO,JNO JS,JNS LDS,LES LOCK LOOP LOOPNE/Z MOVSB/W NEG NOT OUT POPF PUSHF RCR REPE/Z RET,RETF ROR SAL SBB SHL STC STI SUB WAIT XLAT ASCII Adjust Before Division ASCII Adjust After Subtract Add Call Procedure Clear Carry Flag Clear Interrupt Flag Compare Convert Word to Double Decimal Adjust after Subtract Unsigned Divide Halt Signed Multiply Increment Interrupt on Overflow Interrupt Return (32 bits) Jump if Above or Equal Jump if Bellow or Equal Jump if CX is Zero Jump if Greater Jump if Less Jump inconditionally Jump if not Equal Jump on Overflow, not Overf. Jump on Sign, not Sign Load Far Pointer (DS, ES) Lock the Bus Loop Loop while not Equal Move String (Byte,Word) Two’s Complement Negation One’s Complement Negation Output to Port Pop Flags Push Flags Rotate with Carry Right Repeat while Equal (Zero) Return from Procedure Rotate Right Shift Arithmetic Left Subtract with Borrow Shift Left Set Carry Flag Set Interrupt Flag Subtract Wait (coprocessor) Translate Microprocessador Intel 8086 • • • • Arquitetura de 16 bits Comunicação com a memória em 16 (8086) ou 8 (8088) bits Capacidade máxima de memória de 1 MByte 14 registradores (4 dado, 4 endereço, 4 segmento, ponteiro do programa, flags) • endereço físico = segmento * 16 + deslocamento • 85 instruções básicas • co-processador: 8087 (67 instruções básicas) F2XM1 FADD FBLD FCHS FCOM FCOMPP F(N)DISI (*) FDIVP FDIVRP FFREE FICOM FIDIV FILD FINCSTP FIST FISUB FLD FLDCW FLDL2E FLDLG2 FLDPI FMUL FNOP FPREM FRNDINT F(N)SAVE FSQRT F(N)STCW FSTP FSUB FSUBPR FTST FXAM FXTRACT FYL2XP1 Calculates 2^x-1 Add Real Load BCD Change Sign Compare Real Compare Real and Pop Twice Disable Interrupts Divide Real and Pop Divide Real Reversed and Pop Free Register Compare Integer Integer Divide Load Integer Increment Stack Store Integer Integer Subtract Load Real Load Control Word Load Value of Log2(e) Load Value of Log10(2) Load Value of Pi Real Multiply No Operation Partial Remainder Round to Integer Save Coprocessor State Square Root Store Control Word Store Real and Pop Real Subtract Real Subtract Reversed and Pop Test for Zero Examine Extract Exponent and Mantissa Calculates y . log2(x+1) FABS FADDP FBSTP F(N)CLEX FCOMP FDECSTP FDIV FDIVR F(N)ENI (*) FIADD FICOMP FIDIVR FIMUL F(N)INIT FISTP FISUBR FLD1 FLDENV FLDL2T FLDLN2 FLDZ FMULP FPATAN FPTAN FRSTOR FSCALE FST F(N)STENV F(N)STSW FSUBP FSUBR FWAIT FXCH FYL2X (*) – eliminadas a partir do 80287 Absolute Value Add Real and Pop Store BCD and Pop Clear exceptions Compare Real And Pop Decrement Stack Divide Real Divide Real Reversed Enable Interrupts Integer Add Compare Integer and Pop Integer Divide Reversed Integer Multiply Initialize Coprocessor Store Integer and Pop Integer Subtract Reversed Load Value of 1.0 Load Environment State Load Value of Log2(10) Load Value of Loge(2) Load Value of 0.0 Real Multiply and Pop Partial Arctangent Partial Tangent Restore Saved State Scale with powers of 2 Store Real Store Environment State Store Status Word Real Subtract and Pop Real Subtract Reversed CPU Wait (until FPU ready) Exchange Registers Calculates y . log2(x) Microprocessador Intel 8086 • • • • • • • • • Arquitetura de 16 bits Comunicação com a memória em 16 (8086) ou 8 (8088) bits Capacidade máxima de memória de 1 MByte 14 registradores (4 dado, 4 endereço, 4 segmento, ponteiro do programa, flags) endereço físico = segmento * 16 + deslocamento 85 instruções básicas co-processador: 8087 (67 instruções básicas) sem cache, sem memória virtual somente opera no modo real Microprocessador Intel 80186 • • • • • • • • Idêntico ao 8086 Comunicação com a memória em 16 bits Capacidade máxima de memória de 1 MByte 14 registradores Endereço físico = segmento * 16 + deslocamento Sete instruções extras (85 + 7 = 92 instruções básicas) Co-processador: 80187 (idêntico ao 8087) Sem cache, sem memória virtual Microprocessador Intel 80286 • • • • • • • • • Modos real (8086) e virtual (modo protegido) Comunicação com a memória em 16 bits Capacidade máxima de memória de 16 MByte 14 registradores (os do 8086) Endereço físico ou virtual 15 instruções extras (92 + 15 = 107 instruções básicas) Co-processador: 80287 Sem cache Memória virtual segmentada Microprocessador Intel 80386 • • • • Modos real (8086), virtual (protegido) e virtual86 Comunicação com a memória em 16 (SX) ou 32 bits (DX) Capacidade máxima de memória de 4 GByte 14 registradores (os do 8086, estendidos para 32 bits) e mais 2 registradores de segmento 31 16 15 EAX EBX ECX EDX AH BH CH DH ESP EBP ESI EDI acumulador base contador dado SP BP SI DI 31 EIP EF AL BL CL DL 16 15 ponteiro para pilha ponteiro base índice fonte índice destino 0 IP FLAGS apontador de instruções flags Registrador de flags (F ou EF) Flags de status: CF Bit 0 vai-um (carry) PF Bit 2 paridade (parity) AF Bit 4 vai-um auxiliar (auxiliary carry) ZF Bit 6 zero SF Bit 7 sinal (sign) OF Bit 11 overflow Flags de controle: TF Bit 8 trap IF Bit 9 interrupt enable DF Bit 10 direção (direction) Flags específicos do 80386: IOPL Bits 12 e 13 nível de privilégio de E/S NT Bit 14 tarefa aninhada RF Bit 16 flag resume VM Bit 17 modo virtual Registradores de segmento CS SS DS ES FS GS segmento de código segmento de pilha segmento de dados segmento de dados segmento de dados segmento de dados (code segment) (stack segment) (data segment) • Formam endereço físico (modo real) • Selecionam descritor de segmento (modo protegido) Microprocessador Intel 80386 • • • • Modos real (8086), virtual (protegido) e virtual86 Comunicação com a memória em 16 (SX) ou 32 bits (DX) Capacidade máxima de memória de 4 GByte 14 registradores (os do 8086, estendidos para 32 bits) e mais 2 registradores de segmento • Endereço físico ou virtual • 44 instruções extras (107 + 44 = 151 instruções básicas) • Memória virtual segmentada e paginada (opcional) Gerência de memória virtual Questões de memória virtual • Quando mover um bloco da memória secundária para a memória primária (real) ? por demanda • Quando mover um bloco da memória real para a memória secundária? quando faltar espaço na memória real • qual o tamanho ideal de um bloco? constante (paginação) ou variável (segmentação) onde colocar um novo bloco transferido para a memória principal? onde houver área livre (paginação) ou no “melhor” lugar (segmentação) Microprocessador Intel 80386 • • • • • • • • • Modos real (8086), virtual e virtual86 Comunicação com a memória em 16 (SX) ou 32 bits (DX) Capacidade máxima de memória de 4 GByte 14 registradores (os do 8086, estendidos para 32 bits) e mais 2 registradores de segmento Endereço físico ou virtual 44 instruções extras (107 + 44 = 151 instruções básicas) Memória virtual segmentada e paginada (opcional) Co-processador: 80387 (67 + 7 -1 = 73 instruções básicas) Sem cache Microprocessador Intel 80486 • • • • • • • • • Idêntico ao 386 Modos real (8086), virtual e virtual86 Comunicação com a memória em 32 bits Capacidade máxima de memória de 4 GByte 16 registradores (os do 80386, também em 32 bits) Endereço físico ou virtual 6 instruções extras (151 + 6 = 157 instruções básicas) Memória virtual segmentada e paginada (opcional) Co-processador: 80487 para 80486SX integrado no 80486DX • Com cache de 8 KByte Microprocessador Intel Pentium • • • • • • • • • • Re-estruturação do 486 Modos real (8086), virtual e virtual86 Comunicação com a memória em 64 bits Capacidade máxima de memória de 4 GByte 16 registradores (os do 80386, também em 32 bits) Endereço físico ou virtual 5 instruções extras (157 + 5 = 162 instruções básicas) Memória virtual segmentada (sempre) e paginada (opcional) Co-processador: integrado Com cache de 16 KByte (2 x 8 KByte) Microprocessador Intel Pentium 2 pipelines para de inteiros, operando em paralelo cada pipeline inteiro consta de 5 estágios: busca de instrução (a partir da cache de instruções), decodificação de instrução, geração de endereço, execução, escrita (write back). FPU também em pipeline (mas não em paralelo) Operação super-escalar: mais de uma instrução pronta em um ciclo de relógio Instruções paralelizáveis no Pentium ADD AND CALL (immediate) CMP DEC INC Jcc JMP (immediate only) LEA MOV (general register and memory only) NOP OR POP (register only) PUSH (register only) RCL, RCR (one bit and immediate only) ROL, ROR (one bit and immediate only) SAR,SHL,SHR (one bit and immediate only) SUB TEST (reg-reg, mem-reg and immediate-EAX only) XOR U+V U+V V U+V U+V U+V V V U+V U+V U+V U+V U+V U+V U U U U+V U+V U+V Microprocessador Intel Pentium Pro (P6) • Re-estruturação do Pentium (P5) • Mesmas características de 80386 (mem. virtual) e do Pentium (largura de dados de 64 bits) • 5 instruções extras (162 + 3 = 165 instruções básicas) • Co-processador: integrado • Com cache de 16 KByte (2 x 8 KByte) • Operação super-escalar • Cinco unidades internas Execução fora de sequência Execução especulativa Microprocessador Intel Pentium MMX • • • • • • Arquitetura do Pentium (P5) Novo tipo de dado: “packed” 57 instruções extras (além das 165 instruções básicas) Com cache de 32 KByte (2 x 16 KByte) Operação super-escalar Não possui as características do Pentium Pro (execução fora de sequência, execução especulativa) • Instruções para processamento de vetores (8 bytes, 4 palavras ou 2 palavras duplas) • 8 novos registradores lógicos (MMX0 a MMX7) Microprocessador Intel Pentium MMX • 57 Instruções para processamento de vetores (8 bytes, 4 palavras ou 2 palavras duplas) • 8 novos registradores lógicos (MMX0 a MMX7) • Aritmética de saturação Tipo de dado Com sinal Byte Palavra Sem sinal Byte Palavra Limite Inferior Limite Superior -128 -32.768 127 32.767 0 0 255 65.535 Microprocessador Intel Pentium II (P6) • • • • Pentium Pro com MMX Mesmas características do Pentium Pro Instruções MMX Cinco unidades internas Execução fora de sequência Execução especulativa Microprocessador Intel Pentium III • • • • Arquitetura do Pentium II (P6) Novo tipo de dado: “floating packed” 70 instruções extras (além das 167 básicas e 57 MMX) Instruções para processamento de vetores inteiros (MMX) ou de ponto flutuante (SSE) • 8 novos registradores físicos (XMM0 a XMM7), de 128 bits, para as instruções SSE 127 96 95 64 63 32 31 0 Single FP Single FP Single FP Single FP Packed Single FP 127 96 95 64 63 32 31 0 Não alterado Não alterado Não alterado Single FP Scalar Single FP Pentium: instrução CPUID e número de série Parâmetro Valores após execução de CPUID EAX=0 EAX: Maior valor aceito para EAX EBX:ECX:EDX: String de identificação EAX=1 EAX: Identificador do processador (32 bits superiores do número de série) EBX:ECX: Indefinidos EDX: Feature Flags EAX=2 EAX:EBX:ECX:EDX: valores de configuração do Processador EAX=3 EDX:ECX: 64 bits inferiores do número de série EAX>3 EAX:EBX:ECX:EDX: Indefinidos Desabilitar o número de série MOV ECX, 119H RDMSR OR EAX, 0020 0000h WRMSR ;loads EDX:EAX Codificação de Instruções (exemplo: MOV) Tipo 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 Código (hexa) 88 reg rm 89 reg rm 89 reg rm 8A reg rm 8B reg rm 8B reg rm 8C reg rm 8E reg rm A0 A1 A1 A2 A3 A3 B0 reg imed B8 reg imed B8 reg imed C6 rm imed C7 rm imed C7 rm imed Instrução MOV rm8, r8 MOV rm16, r16 MOV rm32, r32 MOV r8, rm8 MOV r16, rm16 MOV r32, rm32 MOV rm16, sreg MOV sreg, rm16 MOV AL, m8 MOV AX, m16 MOV EAX, m32 MOV m8, AL MOV m16, AX MOV m32, EAX MOV r8, im8 MOV r16, im16 MOV r32, im32 MOV rm8, im8 MOV rm16, im16 MOV rm32, im32 Descrição Move de registradores de 8 bits Move de registradores de 16 bits Move de registradores de 32 bits Move para registradores de 8 bits Move para registradores de 16 bits Move para registradores de 32 bits Move de registrador de segmento Move para registrador de segmento Move byte para AL Move palavra (16 bits) para AX Move palavra dupla (32 bits) para EAX Move AL para memória (byte) Move AX para memória (palavra) Move EAX para memória (palavra dupla) Move dado imediato (byte) para reg. 8 bits Move dado imediato para reg. 16 bits Move dado imediato para reg. 32 bits Move dado imediato para reg/mem (8 bits) Move dado imediato para reg/mem (16 bits) Move dado imediato para reg/mem (32 bits) Instruções de transferência de dados • • • • • • MOV PUSH POP XCHG BSWAP Restrições: destino, fonte fonte destino op1, op2 reg32 move fonte para destino (B,W,D) coloca fonte na pilha (W,D) retira da pilha para destino (W,D) troca (exchange) operandos inverte a ordem dos 4 bytes apenas MOV, PUSH e POP podem acessar registradores de segmento não é possível mover um dado imediato para um registrador de segmento CS não pode ser usado como destino (nem IP) operandos de PUSH e POP devem ser de 16 ou 32 bits op1 e op2 em XCHG podem ser registradores, ou apenas um pode ser operando na memória Instruções de transferência de dados • • • • • • • • • • • • MOV reg, reg mesmo tamanho (8, 16 ou 32 bits) MOV mem, reg mesmo tamanho (8, 16 ou 32 bits) MOV reg, mem mesmo tamanho (8, 16 ou 32 bits) MOV reg, imed mesmo tamanho (8, 16 ou 32 bits) MOV mem, imed mesmo tamanho (8, 16 ou 32 bits) MOV reg, segreg operandos de 16 bits MOV segreg, reg (exceto CS) operandos de 16 bits MOV segreg, mem (exceto CS) operandos de 16 bits MOV mem, segreg operandos de 16 bits XCHG reg, reg mesmo tamanho (8, 16 ou 32 bits) XCHG reg, mem mesmo tamanho (8, 16 ou 32 bits) XCHG mem, reg mesmo tamanho (8, 16 ou 32 bits) Instruções de transferência de dados • • • • • • • • • • • PUSH r16/r32 Empilha um registrador de 16 ou 32 bits PUSH m16/m32 Empilha um operando de memória de 16 ou 32 bits PUSH im16/im32 Empilha um dado imediato de 16 ou 32 bits PUSH segreg Empilha um registrador de segmento (16 bits) PUSHA Empilha AX, CX, DX, BX, SP (original), BP, SI e DI PUSHAD Empilha EAX,ECX,EDX,EBX,ESP(original),EBP,ESI,EDI POP r16/r32 Desempilha um registrador de 16 ou 32 bits POP m16/m32 Desempilha um operando de 16 ou 32 bits POP segreg (exceto CS) Desempilha um registrador de segmento (exceto CS) POPA Desempilha DI, SI, BP, SP, BX, DX, CX e AX POPAD Desempliha EDI, ESI, EBP, ESP, EBX, EDX, ECX e EAX Instruções de transferência de flags • PUSHF/PUSHFD coloca registrador de flags na pilha (16 bits para F ou 32 bits para EF) • POPF/POPFD retira registrador de flags da pilha (16 bits para F e 32 bits para EF) • LAHF carrega AH com flags (8 bits menos significativos do registrador F) • SAHF carrega flags com AH (8 bits menos significativos do registrador F) Instruções de transferência sobre endereços • LEA r16/r32, mem carrega endereço efetivo do operando mem para reg (16 ou 32 bits) • LDS r16/32, mem carrega endereço de mem para reg (16 ou 32 bits) e DS (16 bits) • LESr16/32, mem carrega endereço de mem para reg (16 ou 32 bits) e ES (16 bits) • LFS r16/32, mem carrega endereço de mem para reg (16 ou 32 bits) e FS (16 bits) • LGS r16/32, mem carrega endereço de mem para reg (16 ou 32 bits) e GS (16 bits) Instrução de tradução • XLAT converte AL (translate byte) • Substitui um byte em AL por um byte de uma tabela, indicada em BX • Conteúdo de AL fornece o deslocamento na tabela • Instrução substitui o conteúdo de AL pelo byte em [BX+AL] Instruções de entrada e saída • IN acumulador, porta leitura de byte, word ou dobleword para AL, AX ou EAX • OUT porta, acumulador transfere byte, word ou doubleword de AL, AX ou EAX para a porta • IN e OUT podem referenciar até 65536 portas de E/S Cada porta pode receber ou fornecer um byte apenas • Aparecem em dois tipos: direto e indireto No tipo direto a instrução fornece um endereço de porta de 1 byte (sob a forma de constante imediata, entre 0 e 255) No tipo indireto, o registrador DX fornece o endereço de porta, permitindo assim referenciar até 65536 portas Instruções de entrada e saída • Formatos possíveis IN IN IN IN IN IN AL, im8 AL, DX AX, im8 AX, DX EAX, im8 EAX, DX OUT OUT OUT OUT OUT OUT im8, AL DX, AL im8, AX DX, AX im8, EAX DX, EAX Instruções aritméticas sobre dois operandos • ADD destino, fonte soma (destino = destino + fonte) • ADC destino, fonte soma com carry (destino = destino + fonte + carry) • SUB destino, fonte subtrai fonte do destino (destino = destino - fonte) • SBB destino, fonte subtrai com borrow (destino = destino - fonte - borrow) • CMP destino, fonte compara destino - fonte (sem armazenar o resultado) • combinações “reg, reg”, “reg, mem”, “mem, reg”, “reg, imed” e “mem, imed”, em 8, 16 ou 32 bits Instruções aritméticas sobre um operando • INC destino • DEC destino • NEG destino incrementa de 1 decrementa de 1 troca sinal (complemento de dois) • “destino” pode ser um registrador ou uma referência a memória, de 8, 16 ou 32 bits Instruções de multiplicação e divisão • MUL fonte multiplica como inteiro sem sinal • IMUL fonte multiplica como inteiro com sinal • DIVfonte divide como inteiro sem sinal • IDIV fonte divide como inteiro com sinal Instruções de multiplicação e divisão • Três formas possíveis para a multiplicação • AL x fonte = AX (multiplicação de bytes, resultado em uma palavra) • AX x fonte = DX:AX (multiplicação de palavras, resultado em palavra dupla) • EAX x fonte = EDX:EAX (multiplicação de palavras duplas, resultado em 64 bits) • CF e OF são ligados se a metade mais significativa do resultado não for apenas extensão do sinal; demais flags indefinidos Instruções de multiplicação e divisão • Três formas possíveis para divisão • AX / fonte =AL e resto em AH (divisão por byte) • DX:AX / fonte = AX e resto em DX (divisão por palavra) • EDX:EAX / fonte = EAX e resto em EDX (divisão por palavra dupla) • Todos os flags são indefinidos • Se o resultado tiver mais bits do que pode ser armazenado no quociente é gerada uma interrupção do tipo 0 (erro de divisão) Instruções de multiplicação e divisão • IMUL: 2 novos formatos no 80186 e 1 novo no 486: Com um operando (IMUL fonte) Com dois operandos (IMUL destino, fonte) o operando destino (registrador) é multiplicado pelo operando fonte (registrador, operando em memória ou dado imediato). O resultado é armazenado no registrador destino, truncado para o seu tamanho (16 ou 32 bits). CF e OV indicam então se ocorreu estouro Com três operandos (IMUL destino, fonte, constante) o operando destino (registrador) recebe o produto do operando fonte (registrador ou operando em memória) pela constante (dado imediato). Os operandos fonte e destino devem ser de 16 ou 32 bits e ter o mesmo comprimento; o resultado é armazenado com truncagem dos bits mais significativos. CF e OV indicam se houve estouro devido a esta truncagem Instruções de conversão e ajuste • • • • • • • • • • CBW CWD CWDE CDQ DAA DAS AAA AAS AAM AAD converte AL para AX converte AX para DX:AX converte AX para EAX converte EAX para EDX:EAX decimal adjust after addition (sobre AL) decimal adjust after subtraction (sobre AL) ASCII adjust after addition (sobre AL) ASCII adjust after subtraction (sobre AL) ASCII adjust after multiplication (sobre AX) ASCII adjust before division (sobre AX) Instruções de transferência e ajuste • MOVSX destino, fonte move fonte para destino com extensão do sinal • MOVZX destino, fonte move fonte para destino com extensão de zeros • Instruções foram acrescentadas a partir do 80386 MOVSX MOVSX MOVSX MOVZX MOVZX MOVZX r16, rm8 r32, rm8 r32, rm16 r16, rm8 r32, rm8 r32, rm16 Instruções lógicas convencionais • • • • • NOT AND OR XOR TEST destino destino, fonte destino, fonte destino, fonte destino, fonte (idêntico a AND, sem armazenar resultado) Instruções de deslocamento • ROR destino, contador rotate right msb recebe lsb, lsb vai também para CF • RCR destino, contador rotate with carry right msb recebe CF, lsb vai para CF • ROL destino, contador rotate left lsb recebe msb, msb vai também para CF • RCL destino, contador rotate with carry left lsb recebe CF, msb vai para CF Instruções de deslocamento • SHR destino, contador shift logical right msb recebe 0, lsb vai para CF • SAR destino, contador shift arithmetic right msb recebe sinal, lsb vai para CF • SHL destino, contador shift left lsb recebe 0, msb vai para CF • SAL destino, contador shift left lsb recebe 0, msb vai para CF (como SHL) Instruções de deslocamento • Codificações possíveis operação operação operação operação operação operação reg,1 reg, CL reg, im8 mem,1 mem, CL mem, im8 Instruções sobre bits de um operando • BSF bit_index, operando Bit Scan Forward • BSR bit_index, operando Bit Scan Reverse Se nenhum bit for um, ZF=1 • • • • BT operando, bit_index BTC operando, bit_index BTR operando, bit_index BTS operando, bit_index Copia o bit para CF Bit Test Bit Test and Complement Bit Test and Reset Bit Test and Set Instruções de desvio • As instruções de desvio podem alterar CS e IP (ou EIP) ou somente IP (ou EIP) • Se o endereço fornecido é de 16 bits, o registrador EIP é mascarado pelo valor 0000FFFFH; o endereço alvo fica dentro da área de 64 KBytes de um segmento • Se o endereço fornecido é de 32 bits, o mascaramento não é realizado; endereçando uma área de 4 GBytes. Somente é válido no modo protegido.Nos modos real e virtual86, uma interrupção de erro de endereçamento é gerada se o valor final apontar para valores acima de 64 K Instruções de desvio incondicional • JMP direto • Pode ser curto (short), perto (near) ou longe (far) • No JMP curto e no perto, um deslocamento contido na instrução é adicionado ao IP (modo de endereçamento relativo para desvios) • Esse deslocamento pode ser de 1 byte (short), ou de 2 ou 4 bytes (near) • No JMP longe, CS e IP (ou EIP) são carregados com o endereço especificado • JMP indireto • Pode ser perto (near) ou longe (far) • No JMP perto, o conteúdo de um registrador ou uma posição de memória é copiado no IP (ou EIP) • No JMP longe, CS e IP(ou EIP) são carregados com o conteúdo de memória (endereçada como operando, usando os modos de endereçamento) Controle de laço • • • • • • • LOOP endereço_alvo LOOPE endereço_alvo LOOPZ endereço_alvo LOOPNE endereço_alvo LOOPNZ endereço_alvo JCXZ endereço_alvo JECXZ endereço_alvo loop loop while equal (ZF=1) loop while zero(ZF=1) loop while not equal (ZF=0) loop while not zero (ZF=0) jump if CX = 0 jump if ECX = 0 Usam o registrador CX (ou ECX) como contador Decrementam o contador e desviam se não chegou a zero Nenhum flag é afetado LOOPE e LOOPNE testam adicionalmente o flag ZF Todas as instruções permitem apenas deslocamentos curtos (short, ou seja, de +127 a -128) Chamada e retorno de subrotina • CALL endereço_alvo • RET valor_opcional call procedure return from procedure • CALL é semelhante a JMP, só que armazena o endereço de retorno na pilha • CALL pode ser direto ou indireto, assim como near ou far • A forma near armazena o IP (ou EIP) na pilha • A forma far armazena CS e IP (ou EIP) na pilha • RET também deve ser correspondentemente near ou far • RET pode ter um valor que é somado ao SP depois do retorno Interrupções de software • INT tipo • INTO • IRET interrupção interrupção se overflow retorno de interrupção • INT tipo: desvia de modo far para o endereço especificado mem(0000:tipo*4) desvio semelhante a uma subrotina, mas empilha flags em Instruções de desvio condicional • Com sinal – – – – – – – – – – – – JG JNLE JGE JNL JL JNGE JLE JNG JO JS JNO JNS endereço_alvo endereço_alvo endereço_alvo endereço_alvo endereço_alvo endereço_alvo endereço_alvo endereço_alvo endereço_alvo endereço_alvo endereço_alvo endereço_alvo greater ((SF XOR OF) OR ZF) = 0 not less nor equal (idem) greater or equal (SF XOR OF) = 0 not less (idem) less(SF XOR OF) = 1 not greater nor equal (idem) less or equal ((SF XOR OF) OR ZF) = 1 not greater (idem) overflow OF = 1 sign SF = 1 not overflow OF = 0 not sign SF = 0 Instruções de desvio condicional • Sem sinal: – – – – – – – – JA JNBE JAE JNB JB JNAE JBE JNA endereço_alvo endereço_alvo endereço_alvo endereço_alvo endereço_alvo endereço_alvo endereço_alvo endereço_alvo above (CF OR ZF) = 0 not below nor equal (idem) above or equal CF = 0 not below (idem) below CF = 1 not above nor equal (idem) below or equal (CF OR ZF) = 1 not above (idem) Instruções de desvio condicional • Independente de sinal JC endereço_alvo JE/JZ endereço_alvo JP/JPE endereço_alvo JNC endereço_alvo JNE/JNZ endereço_alvo JNP/JPO endereço_alvo carry CF = 1 equal / zero ZF = 1 parity / parity even PF = 1 not carry CF = 0 not equal / not zero ZF = 0 not parity / parity odd PF = 0 Instruções de manipulação de strings • Registradores implícitos – – – – – – [E]SI índice para string fonte [E]DI índice para string destino ES segmento do string destino [E]CX contador AL/AX/EAX valor de busca (destino p/ LODS, fonte p/ STOS) DF 0 (auto incremento p/ DI, SI) 1 (auto decremento p/ DI, SI) – ZF condição de término para busca e comparação Instruções Primitivas • • • • • • • MOVS CMPS SCAS LODS STOS INS OUTS move source string to destination string compare source string with destination string scan destination string load into AL/AX from source string store AL/AX into destination string input from I/O port (in DX) into destination output from source to I/O port (in DX) Instruções Primitivas • MOVS move source string to destination string – MOVSB – MOVSW – MOVSD move um byte de DS:SI para ES:DI move uma palavra de DS:SI para ES:DI move uma palavra dupla de DS:SI para ES:DI • CMPS compare source string with destination string – – – – CMPSB subtrai byte de mem(DS:SI) – mem(ES:DI) CMPSW subtrai palavra de mem(DS:SI) – mem(ES:DI) CMPSD subtrai palavra dupla de mem(DS:SI) – mem(ES:DI) afeta flags de forma idêntica a CMP Instruções Primitivas • SCAS scan destination string – – – – SCASB subtrai byte em AL – mem(ES:DI) SCASW subtrai palavra em AX – mem(ES:DI) SCASD subtrai palavra dupla em EAX – mem(ES:DI) AL, AX ou EAX contém valor sendo buscado • LODS load into AL/AX from source string – LODSB – LODSW – LODSW carrega byte de mem(DS:SI) em AL carrega palavra de mem(DS:SI) em AX carrega palavra dupla de mem(DS:SI) em EAX Instruções Primitivas • STOS store AL/AX into destination string – STOSB – STOSW – STOSD • INS armazena AL no byte de mem (ES:DI) armazena AX na palavra de mem (ES:DI) armazena EAX na palavra dupla de mem (ES:DI) input from I/O port (in DX) into destination – INSB – INSW – INSD ES:DI move byte da porta especificada em DX para ES:DI move palavra da porta especificada em DX para ES:DI move palavra dupla da porta especificada em DX para Instruções Primitivas • OUTS output from source to I/O port (in DX) – OUTSB – OUTSW – OUTSD move byte de DS:SI para porta de E/S especificada em DX move palavra de DS:SI para porta especificada em DX move palavra dupla de DS:ES para porta especificada em DX Instruções primitivas 1. Realiza operação primitiva (sobre um byte, uma palavra ou uma palavra dupla) 2. Atualiza registradores de índice (SI e/ou DI): 2.1 Se DF=0, então incrementa registradores de índice: 2.1.1 de um, se operação for a byte 2.1.2 de dois, se operação for a palavra 2.1.3 de quatro, se a operação for a palavra dupla 2.2 Se DF=1, então decrementa registradores de índice: 2.2.1 de um, se operação for a byte 2.2.2 de dois, se operação for a palavra 2.2.3 de quatro, se a operação for a palavra dupla Instruções de repetição • REP repeat • REPE / REPZ repeat while equal/repeat while zero • REPNE / REPNZ repeat while not equal/repeat while not zero 1. Se ECX = 0, então não executa a primitiva e encerra a repetição 2. Se ECX > 0, então: 2.1 Executa a operação primitiva, atualizando os flags 2.2 Decrementa ECX, sem afetar os flags 2.3 Volta para a repetição, de acordo com o prefixo: 2.3.1 Se for REP, repete incondicionalmente 2.3.2 Se for REPE/Z, somente repete se Z=1 2.3.3 Se for REPNE/NZ, somente repete se Z=0 Instruções sobre flags • • • • • • • STC CLC CMC STD CLD STI CLI set carry flag clear carry flag complement carry flag set direction flag clear direction flag set interrupt-enable flag clear interrupt-enable flag Instruções condicionais sobre flags • SETcc rm8 Set Byte on condition (386) Se cc for verdadeiro, rm8 recebe 1 Se cc for falso, rm8 recebe 0 • CMOVcc destino, fonte Conditional Move (P6) Se cc for verdadeiro, copia fonte para destino Instruções especiais • HLThalt until interrupt or reset (suspende o processador) • • • • WAIT ESC LOCK NOP wait for TEST pin active escape to external processor lock bus during next instruction no operation Instruções de prefixo • Prefixo para operando de 32 bits (senão é 16 bits) • Prefixo para endereço de 32 bits (senão é 16 bits) • SEG regseg - altera o registrador de segmento padrão Bibliografia • Weber, Raul F. “Fundamentos deArquitetura de Computadores”. Segunda Edição. Ed. Sagra-Luzzatto, 2001 – Capítulo 12