TRABALHO PROCESSADOR H8 abel ferreira – 05132002 eberle rambo- 05132118 Monografia abel ferreira – 05132002 eberle rambo - 05132118 Prefácio. A família do micro processador h8 inclui diversas versões. Nesse trabalho abordaremos o micro processador da família H8/300. O H8/300 é um processador de alta velocidade caracterizado com poderosas instruções de manipulação de bit, projetado para controle de aplicações de tempo real. Arquitetura RISC, tendo oito 16-bit (ou dezesseis 8-bit) registradores de uso geral com um conciso e otimizado conjunto de instruções. Fornece suporte de módulos on-chip ROM, RAM, quatro tipos de timers, portas de entrada e saída, uma interface de comunicação serial, I2c bus interface, sistema de controle de alta velocidade. Característica Descrição CPU Arquitetura de registradores de uso geral • Oito registradores de 16-bit de uso geral (R0 to R7) ou • Dezesseis registradores de 8-bit de uso geral (R0H, R0L, ..., R7H, R7L), Alta velocidade • Taxa de clock máxima: 16 MHz/5 V, 12 MHz/4 V, 10 MHz/3 V (ø clock) • Add/subtract: 125 ns (16 MHz operation), 167 ns (12 MHz operation), 200 ns (10 MHz operation) • Multiplicação/divisão: 875 ns (16 MHz operation), 1167 ns (12 MHz operation), 1400 ns (10 MHz operation) Conciso e otimizado conjunto de instruções • Todas instruções são de 2 ou 4 bytes long • Registrador-registrador para aritméticas e operações lógicas • Registrador-memória para transferência de dados pela instrução MOV (máquina load-store) Características do conjunto de instruções • Instrução de multiplicação (8 bits × 8 bits) • Instrução de divisão (16 bits ÷ 8 bits) • Instrução de acumulador de bit Tipos de bit de dados • 4-bit (pacote BCD), byte, word (2 bytes) Registradores de controle • Program counter (PC) • Condition code register (CCR) Modos de Endereçamento • direto • indireto • indireto com deslocamento de 16 bit • indireto com pós-incremento • indireto com pré-incremento • endereço absolute ( 8 ou 16 bits) • imediato (8 ou 16 bit de dado) • relativo ao PC ( deslocamento de 8-bit) • Memoria indireta Conjunto de instruções O H8 é um processador com arquitetura RISC, como o MIPS. São no total 57 instruções: ● 3 tipos de instruções para transferência de dados: MOV, MOVFPE, MOVTPE, POP*, PUSH* (POP Rn é equivalente a MOV.W @SP+,Rn) (PUSH Rn é equivalente a MOV.W @SP+, Rn) ● 14 tipos de instruções para operações aritméticas: ADD, SUB, ADDX, SUBX, INC, DEC, ADDS, SUBS, DAA, DAS, MULXU, DIVXU, CMP, NEG ● 4 tipos de instruções para operações lógicas: AND, OR, XOR, NOT ● 8 tipos de instruções para deslocamento: SHAL, SHAR, SHLL, SHLR, ROTL, ROTR, ROTXL, ROTXR ● 14 tipos de instruções para manupulações de bit: BSET, BCLR, BNOT, BTST, BAND, BIAND, BOR, BIOR, BXOR, BIXOR, BLD, BILD, BST, BIST ● 5 tipos de instruções branch: Bcc**, JMP, BSR, JSR, RTS ● 9 tipos para controle do sistema: RTE, SLEEP, LDC, STC, ANDC, ORC, XORC, NOP ● 1 tipo para transferência de bloco de dados: EEPMOV Similaridades/diferenças com o MIPS: Apesar do H8 ser também uma maquina RISC, como o MIPS, suas instruções diferem um pouco. O H8 tem as instruções PUSH e POP já implementadas, enquanto no MIPS é necessario implamentar usando um load/store na memoria e somar/subtrair o Stack Point. No H8 existe mais instruções condicionais do que no MIPS, enquanto o segundo possui apenas “branch if equal” e “brach if not equal”, o H8 possui 5 tipos condicionais. O H8 assim como o MIPS é uma máquina load/store, ou seja, as isntruções aritméticas e as outras não podem trabalhar direto coma memória, somente usando a instrução MOV.W no H8 e usando SW/LW no MIPS. Estrutura dos dados nos registradores de uso geral. O H8 pode processar dados de 1 bit, 4 bit (packed BCD),de 8 bits, e dados de 16 bits (palavra) Todas instruções operacionais, exceto ADDS e SUBS podem operar em dados de byte. As instruções MOV.W, ADD.W, SUB.W, CMP>W, ADDS, SUBS, MULXU (8 bits x 8 bits), e DIVXU (16 bits / 8 bits) operam em dados de palavra. Dados de todos os tamanhos podem ser gravados nos registradores de uso geral como mostrado na figura: Similaridades/diferenças com o MIPS: A arquitetura de registradores de uso geral é bem diferente do MIPS, enquanto o MIPS possui somente 32 registradores de 32 bits de uso geral, o H8 possui registradores mutantes. Dados de palavras gravados na memoria devem começar sempre no mesmo endereço. Em acesso na memoria, o bit menos significativo do endereço é considerado como zero. Se um endereço impar é expecificado, não ocorre erros mas o acesso será no endereço precedente. Essa regra afeta instruções MOV.W e condicionais. Formato de dados na memória: Espaço de endereçamento: O H8 suporta um espaço de endereçamento de 64K bytes. Registradores: A figura abaixo mostra a estrutura dos registradores da CPU H8/300. Existem 16 registradores geral de 8 bits (R0H, R0L, ..., R7H, R7L), que também podem ser acessador como 8 registradores de 16 bits (R0 até R7). Há também 2 registradores de controle: o PC (program counter) de 16 bits e o condition code register (CCR) de 8 bits. Todos os registradores de uso geral podem ser usados como registradores de dados e endereço. Quando usado como registrador de endereço, os registradores são acessados como registradores de 16 bits. Quando usado como registradores de dados, eles podem ser acessados como registradores de 16 bits, ou como registradores de 8 bits. O tamanho do registrador é determinado pela instrução. R7 também tem função de Stack Pointer, usado implicitamente pelo hardware em processamento de interrupções e chamada de subrotinas. Em linguagem assembly, as letras SP podem ser codificadas como um sinonimo para R7. Como indicato na figura abaixo, o R7 (SP) aponta para o topo da pilha. Similaridades/diferenças com o MIPS: Enquanto o MIPS possui um registrador especifico para o Stack Point, o H8 usa um dos registradores de uso geral como SP. Registradores de controle: Program Counter (PC): Esse registrador de16 bit indica o endereço da proxima instrução que a CPU executará. Instruções são buscadas em acessos de 16 bits, então o bit menos significativo é ignorado. Condition Code Register (CCR): Esse registrador de 8 bits indica status interno da CPU com um bit de mascara de interrupção e 5 bits de flag: half-cary (H), negativo (N), zero (Z), overflow (V), e carry (C) flags. Os 2 bits não usados são disponibilizado ao usuario. bit 7 - bit de mascara de interrupção (I): Quando esse bit é setado para "1", todas exceções de interrupções são mascarado. O bit é setado para "1" automaticamente por um reset e no começo de manipulação de interrupção. Bits 6 e 4 - bits de usuário (U): Esses bits podem ser escrito e lido pelo software para o propósito que o usuário necessitar. Bit 5 - Half-carry(H): Esse bit é usado pelas instruções de adição, subtração e comparação. É referenciado por instruções de ajustes decimais. Bit 3 - negative (N): Esse bit indica o bit mais significativo (o bit de sinal) do resultado de uma instrução. Bit 2 - Zero (Z): Esse bit seta para "1" para indicar um resultado nulo (zero) e seta para "0" para indicar um resultado não nulo. Bit 1 - OverFlow(V): Esse bit seta para "1" quando ocorre uma overflow aritmético, e seta para zero em outras horas. Bit 0 - Carry (C): Esse bit é usado por: - instruções de adição, subtração e comparação para indicar um carry do bit mais significativo - instrução de deslocamento para gravar o valor deslocado do bit mais ou menos significativo - instruções de manipulação de bit, como um acumulador de bit. Valores de registrador inicial: Quando a CPU é resetada, o Program Counter (PC) é carregado da tabela de vetor e o bit de mascara de interrupção no CCR é setado para "1". Outros bits do CCR e os registradores de uso geral não são inicializados. Em particular, o stack pointer (R7) não é inicializado. Para prevenir erros de programas um stack pointer deve ser inicializado por software, pela primeira instrução executada após o reset. Interrupt Programming #include <stdio.h> void mostraRegistradores(unsigned int * sp) { unsigned int i; for (i = 0; i <= 7; i++){ printf("r%i: %i\n", i, sp[i]); } } void salvarRegistradores(){ asm( "mov.w #26, r0\n" "mov.w #55, r1\n" "mov.w #-15, r2\n" "mov.w #7, r3\n" "mov.w #32, r4\n" "mov.w #66, r5\n" "push r7\n" "push r6\n" "push r5\n" "push r4\n" "push r3\n" "push r2\n" "push r1\n" "push r0\n" "mov.w r7,r0\n" "jsr _mostraRegistradores\n" "pop r0\n" "pop r1\n" "pop r2\n" "pop r3\n" "pop r4\n" "pop r5\n" "pop r6\n" "pop r7\n" ); } main(){ salvarRegistradores(); } Exploring Arithmetic and Logical Operations .LC0: .string "\nResultado: " .LC1: .string "%#10x\n" .section .text .align 1 .globl _main _main: mov.w r6,@-r7 mov.w r7,r6 subs #2,r7 #valores a serem multiplicados mov.b #6,r1l #carrega o valor 6 no registrador de 8 bits r1l mov.b #5,r2l #carrega o valor 5 no registrador de 8 bits r2l # -----------------------------------------------# Implemente o algoritmo de multiplicacao aqui # Os valores que devem ser multiplicados estao nos # registradores $16 (R1L) e $17 (R2L). Armazene o resultado no # proprio registrador $16 (R3l) mov.b #xor xor #slt r2l,r3l $18, $16, $17 r1l,r3l $18, $18, $0 # torna primeiro valor positivo, caso necessite #slt $9, $16, $0 cmp.b #0, r1l #beq $9, $0, _cont bpl _cont #nor $16, $16, $0 not r1l #add $16, $16, 1 add.b #1,r1l #_cont: slt $9, $17, $0 _cont: cmp.b #0,r2l #beq $9, $0, _cont2 bpl _cont2 #nor $17, $17, $0 not r2l #add $17, $17, 1 add.b #1,r2l #_cont2:sll _cont2: shll shll shll shll $17, $17, 16 r2l r2l r2l r2l #move 16 bits para a esquerda #add #add mov.b #_multp:and _multp: mov.b and #beq beq #add add.b #_avanca:srl _avanca: shlr #add add.b #bne bne #beq cmp.b bpl #nor not #add add.b $8, $0, 1#cria mascara $10, $0, 16 #contador de looping #4,r2h $9, $8, $16 #looping da multiplicacao #1,r1h r1l,r1h $9, $0, _avanca _avanca $16, $16, $17 r2l,r1l $16, $16, 1 r1l $10, $10, -1 #(0-1),r2h $10, $0, _multp _multp $18, $0, saida #0,r3l _saida $16, $16, $0 r1l $16, $16, 1 #1,r1l #coloca sinal se necessario _saida: # Fim da implementacao --------------------------#imprime resultado na tela mov.w r1,r2 mov.w r2,@(-2,r6) mov.w #.LC0,r2 mov.w r2,@-r7 jsr @_printf adds #2,r7 mov.w @(-2,r6),r2 mov.w r2,@-r7 mov.w #.LC1,r2 mov.w r2,@-r7 jsr @_printf mov.w @r7+,r6 rts Bibliografia: Hitachi Single-Chip Microcomputer H8/3217 Series H8/3217, H8/3216 H8/3214, H8/3212 H8/3202 Hardware Manual H8/300 Programming Manual Todas imagens foram retiradas da bibliografia. Nota: * H8 is a trademark of Renesas, Ltd.