Risc-16 Isat
Risc-16 Isat
Risc-16 Isat
Conjunto de instrues RiSC-16 Este artigo descreve o conjunto de instrues do Computador Ridiculamente Simples (RiSC-16) de 16 bits, um ISA para aprendizagem que baseado no Little Computer (LC896) desenvolvido por Peter Chen na Universidade de Michigan. O RiSC-16 um computador de 16 bits e 6 registradores. Todos os endereos so endereos de palavras curtas (isto , o endereo 0 corresponde aos primeiros dois bytes da memoria principal, endereo 1 corresponde aos segundos dois bytes da memoria principal, etc). Como o conjunto de instrues da arquitetura MIPS, pela conveno de hardware, o registrador 0 sempre conter o valor 0. A maquina refora isso: l o registrador 0 sempre retorna 0, independente do que tenha escrito l. O RiSC-16 muito simples, mas geral o bastante para resolver problemas complexos. H trs formatos de instrues de cdigo de mquina e um total de 8 instrues. Elas esto listadas na figura abaixo:
addi
001
nand
010
lui
011
sw
101
lw
100
beq
110
jalr
111
jalr rA, rB
2. Linguagem de montagem RiSC-16 e Assembler A distribuio inclui um simples montador para o RiSC-16 (este o primeiro projeto atribudo aos meus estudantes na turma de Organizao de Computadores). O montador chamando a e vem como um executvel SPARC. Tambm est includo o cdigo fonte do montador caso voc queira recompilar para alguma outra arquitetura (por exemplo, x86). O formato para uma linha de cdigo assembly :
Label:<espao>opcode<espao>field0, field1, filed2<espao># comentrio
O campos mais a esquerda na linha o campo label. Labels RiSC vlidos so qualquer combinao de letras e nmeros seguidos por dois pontos. Os dois pontos no final do label no so opcionais um label sem os dois pontos interpretado como um opcode. Depois do label opcional est o espao em branco (espao(s) ou tab(s)). Ento segue o campo opcode, onde o opcode pode ser qualquer instruo mnemnica da linguagem de montagem listada na tabela acima. Depois de mais um espao vem uma seria de campos separados por virgulas e possivelmente espaos em branco (voc precisa ter ou espaos em branco ou uma virgula ou ambos entre cada campo). Todos os campos para valores de registradores so dados como nmeros decimais, opcionalmente precedidos pela letra r como em r0, r1,r2, etc. Campos para valores imediatos so dados ou na forma decimal, octal ou hexadecimal. Nmeros octais so precedidos pelo caractere 0 (zero). Por exemplo, 032 interpretado como o n mero octal zero-trs-dois que corresponde ao nmero decimal 26. No interpretado como o nmero decimal 32. Nmeros hexadecimais so precedidos por 0x (zero -x). Por exemplo, 0x12 (hex-um-dois) corresponde ao nmero decimal 18, no ao decimal 12. Para aqueles que conhecem a linguagem de programao C, voc se sentir perfeitamente em casa. O nmero de campos depende da instruo. A seguinte tabela descreve as instrues Codigo em formato assembly add regA, regB, regC addi regA, regB, regC nand regA, regB, regC lui regA, immed sw regA, regB, immed lw regA, regB, immed beq regA, regB, immed jalr regA, regB Significado R[regA] <- R[regB] + R[regC] R[regA] <- R[regb] + immed R[regA] <- ~(R[regB] & R[regC]) R[regA] <- immed & 0xFFC0 R[regA] -> Mem[R[regB] + immed] R[regA] <- Mem[R[regB] + immed] If (R[regA] == R[regB]){ PC <- PC + 1 + immed (if label, PC <- label)} PC <- R[regB], R[regA] <- PC + 1
Qualquer coisa depois de uma # considerado como um comentrio e ignorado. O campo de comentrio termina no fim da linha. Comentrios so vitais para a criao de programas em linguagem de montagem compreensveis, por que as instrues em si so bastante crticas. Em adio as instrues do RiSC-16, um programa em linguagem de montagem pode conter diretivas para o montador. Essas so chamadas de pseudo-instrues. As seis diretivas assembler que usaremos so nop, halt, lli, movi, .fill e .space (note os pontos no inicio de .fill e .space, que simplesmente significa que estes representam valores de dados, no instrues executveis).
Cdigo em formato assembly nop halt lli regA, immed movi regA, immed .fill immed .space immed
Significado Faz nada Para a mquina e imprime o estado R[regA] <- R[regB] + (immed & 0x3F) R[regA] <- immed Inicializa dado com o valor immed Array preenchido com 0 (zero) do tamanho de immed
Os seguintes pargrafos descrevem essas pseudo-instrues em mais detalhes: A pseud-instruo nop significa fazer nada neste ciclo e recolocada pela instruo add 0,0,0 (que claramente no faz nada). A pseudo-instruo halt significa parar de executar instrues e imprimir o estado atual da mquina e substituda por jalr 0,0 com um campo imediato no-zero. Esta descrita em mais detalhes nos documentos The pipelined RiSC16 e An out-of order Risc-16, no qual HALT um subconjunto de instrues de chamada de sistema para o proposito de manipular interrupes e excees: qualquer instruo JALR com um valor imediato no-zero usa aquele imediato como um opcode de chamada de sistema. Isto permite tais instrues como chamadas de sistema, halt, retorno de exceo, etc. A pseudo-instruo lli (load-lower-immediate) significa OR dos seis ltimos bits deste nmero para dentro do registrador indicado e substitudo por addi X,X,imm6, onde X o registrador especificado, e imm6 e igual a imm & 0x3F. Esta instruo pode ser usada em conjunto com lui: o lui primeiro move os dez primeiros bits de um dado numero (ou endereo, se um label especificado) para dentro do registrador, colocando os seis ltimos bits em 0; o lli move os seis ltimos bits para dentro. O numero de 6-bits garantido de ser interpretado como um positivo e assim evita extenses de sinal; portanto, o resultado de addi essencialmente a concatenao de dois campos de bits. A pseudo-instruo movi s um atalho para a combinao lui+lli. Note, contudo, que a instruo movi parece que somente representa uma simples instruo, enquanto que de fato representa duas. Isso pode jogar fora sua contagem se voc est esperando uma certar distncia entre instrues. Assim, sempre uma boa ideia usar labels sempre que possvel. A diretiva .fill diz ao montador para colocar um numero no local onde a instruo a seria normalmente armazenada. A diretiva .fill usa um campo, que pode ser ou um valor numrico ou um endereo simblico. Por exemplo, .fill 32 coloca o valor 32 onde a instruo normalmente seria armazenada. Usando .fill com um endereo simblico armazenar o endereo do label. No exemplo abaixo, a linha .fill start armazenar o valor 2, por que o label start refere ao endereo 2.
4
A diretiva .space toma um inteiro n como um argumento e substitudo por n copias de .fill 0 no cdigo; isto , resulta na criao de n palavras de 16bits todas inicializadas com zero.
O seguinte cdigo um programa em linguagem de montagem que decrementa a partir de 5, parando quando chegar em 0. lw lw add beq beq halt .fill .fill .fill 1,0,count 2,1,2 1,1,2 0,1,1 0,0,start 5 -1 Start # carrega reg1 com 5 (usa endereo simbolico) # carrega reg2 com -1 (usa enredeo simblico) # decrementa reg1 poderia ser addi 1,1,-1 # Vai para o fim do programa quando reg1 == 0 # volta para o comeo do loop # fim do programa
start:
Em geral, cdigo risc-16 aceitvel uma instruo por linha. Est tudo bem se tem uma linha em branco, se comentada (isto , a linha comea com #) ou no (isto , s uma linha em branco). Contudo, um label no pode aparecer em uma linha sozinho; ele deve ser seguido por uma instruo vlida na mesma linha (uma diretiva .fill ou halt/nop/etc conta como uma instruo). Note que as 8 instrues bsicas da arquitetura risc-16 forma uma ISA completa que pode executar computao arbitraria. Por exemplo: Mover valores constantes para dentro de registradores. O numero 0 pode ser movido para dentro de qualquer registrador em um ciclo (add rX r0 r0). Qualquer nmero entre -64 e 63 pode ser colocado dentro de um registrador em uma operao usando a instruo ADDI (addi rX r0 numero). E, como mencionado, qualquer numero de 16-bits pode ser movido para dentro de um registrador em duas operaes (lui+lli). Subtrair nmeros. Subtrao simplesmente adicionar o numero negativo. Qualquer numero pode ser negativado em duas instrues pela troca dos seus bits e adicionando 1. Troca de bits pode ser feita fazendo um NAND dos valores com eles mesmos; adicionando 1 feito com uma instruo ADDI. Portanto, subtrao um processo de trs instrues. Note que sem um registrador extra, um processo destrutivo. Multiplicar nmeros. Multiplicao facilmente feita por adies repetidas, teste de bit, e deslocando a esquerda um bitmask por um bit (que o mesmo que uma soma consigo mesmo).