Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
MC404
Modos de Operao
O processador Arm tem vrios modos de operao:
Usurio (sem privilgios) Supervisor (quando inicia ou reset) System (para chamadas ao S.O.) IFQ (interrupo rpida) IRQ (interrupo normal) Abort (violaes de memria, como falta de pgina) Undef (instrues inexistentes)
Registradores
O Arm tem 37 registradores, mas cada modo enxerga 17 registradores:
16 registradores gerais
r0 a r15 r15 o apontador de instrues (chamado de PC, program counter) Qualquer registrador pode ser usado como apontador de pilha! No tem SP ou FP fixos, mas normalmente SP=r13 e FP=r11
Registradores
Todas as instrues podem usar r0-r14 como operandos Maioria das instrues permitem uso de r15 (PC) como operando, mas algumas no podem usar PC. H instrues especficas para carregar e armazenar as flags (cpsr) em um registrador
Flags
Program status registers (basicamente, um para cada modo, como veremos) Bit 31: N, flag de sinal Bit 30: Z, flag de zero Bit 29: C, flag de carry Bit 28: V, flag e overflow Bit 7: ativa/inibe interrupes IRQ Bit 6: ativa/inibe interrupes IFT Bit 4-0: indicam modo do processador
Tipos de instrues
Data Processing
Aritmticas, lgicas, deslocamento, cpia de registradores, cpia de flags
Load/Store
Palavra, meia-palavra, bytes, mltiplas palavras
Branch
Desvio e chamadas de procedimento
Instrues
Instrues
Instrues
Execuo condicional
Todas as instrues so executadas condicionalmente aos valores das flags do modo corrente (cpsr) Bits 31-28 de cada instruo contm cdigo da condio (ou seja, possvel codificar 16 condies, mas somente 15 so codificadas)
Execuo condicional
Shifter
No processador Arm, na maioria das instrues um dos operandos pode ser deslocado/rotacionado antes de ter o seu valor utilizado na instruo. Shifts possveis:
ASL (ou LSL), logical shift left LSR, logical shift right ASR, arithmetic shift right ROR, rotate right
Nmero de operandos
A maioria das instrues pode utilizar at trs registradores
Data Processing
Destino sempre um registrador
Mas tst,teq,cmp e cmn no usam destino
Operando1 sempre um registrador Operando2 pode ser um registrador shiftado/rotacionado ou um valor imediato shiftado/rotacionado. Cada instruo pode especificar se flags so atualizadas ou no
Data Processing
Juntando as peas
Instrues Data Processing MOV/MVN <opcode>{cond}{S} Op2 pode ser:
Rm Rm,#expression Rm, shift #expression Rm, shift Rn
Rd,<Op2>
Exemplos
mov mov mvn movs mov mov movne r1,r2!! ! ! @ r10,#0! ! ! @ r2,#0!! ! ! @ r2,r2,lsl #2 ! @ r3,r3,lsr r10 ! @ no no no no no faiska: faiska: faiska, faiska: faiska: mov set set shl shr r1,r2! r10,0! r2,-1! r2,2! r3,r10!
Data Processing
CMP,CMN,TEQ,TST <opcode>{cond} Rn,<Op2>
Exemplos
cmp cmn tst teq cmpeq cmphi r1,r2!! ! ! r10,#4! ! ! r2,#0!! ! ! r2,r4,lsl #2 ! r1,r2! ! r1,r2! ! ! ! @ @ @ @ ! ! no no no no faiska: faiska: faiska, faiska: and r1,r2! no tem! test r2,0! no tem!
Data Processing
AND,EOR,SUB,RSB,ADD,ADC,SBC,RSC,ORR,BIC
Rd,Rn,<Op2>
Exemplos
add add adds sub r1,r1,r2!! ! @ r1 r1+r2! r1,r2,r3!! ! @ r1 r2+r3 ! r10,r2,#4! ! @ r10 r2+4, seta flags ! r4,r5,r7 lsl r0!
Branch
B{L}{cond} <expression>
Se L presente, escreve valor do endereo da instruo seguinte ao (endereo de retorno) no registrador r14 (Link Register).
No escreve na pilha! Se procedimento chamado folha, no precisa guardar na pilha; caso contrrio procedimento guarda r14 na pilha
Exemplos
b beq perto!! ! longe!! ! @no faiska: jmp perto! @no faiska: jz perto! @chamada de procedimento condicional! @no faiska: no tem! @no faiska: no tem !
moveq pc,lr!! !
Load/Store
<LDR|STR>{cond}{B} Rd,<Address>
Load/Store
Um endereo com registrador base prindexado pode ser
[Rn] [Rn,<#expression>]{!} [Rn,{-}Rm,<shift> #expresso]{!}
Exemplos
ldr r1,[r2]! ! ! !! ! ! ! ! ! ! @ r1 mem[r2]! @ no faiska: ld r1,(r2)! @ r1 mem[r2+r4]! @ no faiska: no tem! @ r1 mem[r2+4], r2 r2+4! @ bom para percorrer vetor!! @ mem[r4+r5] r3 se carry set! ! @ mem[r4] r1!
Load/Store
Um endereo com registrador base psindexado pode ser
[Rn],<#expression> [Rn],{-}Rm,<shift> #expresso]
Exemplos
ldr r1,[r2]! ! ! !! ! ! ! ! ! ! @ r1 mem[r2]! @ no faiska: ld r1,(r2)! @ r1 mem[r2]; r2 r2+r4! @ no faiska: no tem! @ r1 mem[r2], r2 r2+4! @ bom para percorrer cadeia de ! @ caracteres!!