Instruções adicionais thumb2 e instruções de deslocamento do ARM
MC404 2o semestre de 2014


Atualizado em 18/set/2014 - Prof. Célio

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:

Instruções de deslocamento

As instruções a seguir são, na verdade, sinônimos para a instrução MOV Rd, Rd, XXX #n onde XXX é um dentre LSR, LSL, ASR, ROR e n é uma constante variando de 0-31.
Obs: se o sufixo S for acrecentado a XXX então o último bit deslocado de Rd entra no bit C (Carry) da palavra de estado.
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.

Execução condicional de instruções

As instruções lógico-aritméticas podem ser condicionalmente executadas dependendo dos flags da palavra de estado que foram atualizados numa instrução anterior (usualmente imediatamente anterior). Existem 15 condições que podem ser usadas como sufixo da instrução (ver p. 58 do manual detalhado), e que são as mesmas usadas nas instruções de salto condicional: eq, ne, cs ou hs, cc ou lo, mi, pl, vs, vc, hi, ls, ge, lt, gt, le, al. Para que a execução condicional seja possível até 4 instruções devem ser precedidas pela instrução especial "If-Then condition instruction": it cond, onde cond é uma das 15 siglas de 2 letrasi citadas anteriormente (existem outros 3 possíveis parâmetros, veja p. 94 do manual detalhado de nstruções. Exemplos:
(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