Instruções adicionais thumb2 e instruções de deslocamento do ARM
|
As instruções a seguir se referem às adições do conjunto de instruções "thumb2" do ARM (que alem de implementar as instruções de 16 bits no formato "thumb", acrescentou novas instruções de 32 bits ao conjunto padrão de instruções do ARM), ou, em alguns casos, não foram colocadas no resumo do Prof. Borin. Apenas as mais interessantes para a disciplina foram relacionadas. Para cada instrução colocamos o mnemônico, descrição, e o número da página correspondente no manual detalhado de instruções:
Obs: os bits de uma palavra são numerados de 0 a 31, do menos significativo ao mais significativo LSR Rd, #n - desloca Rd n bits para a direita inserindo n 0s à esquerda (divide Rd por 2**n) LSL Rd, #n - desloca Rd n bits para a esquerda inserindo n 0s à direita (multiplica Rd por 2**n) ASR Rd, #n - desloca Rd n bits para a direita, replicando o bit 31 (preserva o bit de sinal) - divide um inteiro com sinal por 2**n ROR Rd, #n - rotaciona para a direita n bits de Rd (o bit 0, - significativo, entra no lugar do bit 31) XXX Rd, Rm,#n - variante permitida das instruções acima; Rm não muda RRX Rd, Rm - rotaciona um bit do par (Rm,C) como se fosse uma palavra de 33 bits: Rd0->C, C->Rd31, etc - resultado vai para Rd, Rm não é alterado, exceto se Rd=Rm.
(1) suponha que r1 contem um inteiro com sinal: colocar em r0 o valor absoluto desse inteiro: movs r0, r1 @ atualiza flags it mi @ queremos tomar o negativo caso r0 <0 rsbmi r0, #0 @ faça r0 := 0 - r0 caso o bit N estivesse ligado (2) algoritmo para calcular o máximo divisor comum de dois inteiros em r1 e r2, devolvendo o resultado em r1 e r2: loop: cmp r1, r2 @ cmp sempre atualiza flags it gt @ queremos testar se r1 > r2 subgt r1, r2 @ se r1 > r2, faça r1:=r1-r2 it lt @ senão teste por < sublt r2, r1 @ se r1 < r2 faça r2:= r2 -r1 bne loop @ se r1 # r2 volte ao laço @ senão mdc=r1=r2