Você está na página 1de 3

1. Explique como ARM implementa uma pilha mesmo sem as instrues push e pop.

R a pilha em arm armazenada na memria principal, sendo usada principalmente para armazenar valores temporrios. Em geral temos a pilha descendente, ou seja, a pilha cresce de endereos maiores para menores. O registrador R13(stack pointer) aponta para o topo da pilha, devendo ser inicializado antes de comearmos a utilizar a pilha. (o meu arm-sin inicializa em 53fc). As funes STMFD e LDMFD empilham e desempilham respectivamente. A pilha pode estar cheia ou vazia. Sendo ela decrescente(padro ARM decrescente cheia) no caso da pilha cheia, o SP aponta para um dado que est no topo da pilha. Ao empilhar algo, decrementamos SP e depois armazenamos. Para desempilhar lemos o dado e depois decrementamos SP. Se a pilha estiver vazia, o SP aponta para a posio subsequente do dado que est no topo da pilha (esta posio est vazia). Empilhar: Escreve o dado e depois decrementa SP, Desempilhar: Incrementa SP e depois l o dado. 2) Explique como podemos realizar funes aninhadas (funes que chamam outras) em ARM, se existe apenas um registrador para armazenar o valor de retorno, denominado lr (R14). R Salvando o valor de Lr na pilha, e depois quando for para retornar para a funo que chamou a aninhada, carregamos Lr no Pc, retornando normalmente. 3) Utilize a tcnica explicada na questo anterior para fazer um cdigo assembly ARM referente ao seguinte cdigo em C: main() { func1() } func1() { func2(); } Rmain: Bl func1 b end func1: STMFD SP!, {LR} BL func2 .... LDMFD SP!, {PC} func2: ... mov pc,lr end: 4) Pesquise e explique as seguintes diretivas de assembly: SECTION, END, EQU, PUBLIC, EXTERN, DCB, DCW, DCD, DCQ. RSECTIONEND- marca o fim da linguagem assembly no programa fonte. EQU- <label> EQU <value> interpreta o nome como o valor. PUBLICEXTERNDCB- coloca o dado na prxima posio de memria livre e chama do label a esquerda.(para um byte) DCW- coloca o dado na prxima posio de memria livre e chama do label a esquerda. (para uma word) DCDDCQ-

5) Explique como a instruo BIC R0, R0, R0, ASR#31 Atribui o valor 0 a R0 se o valor anterior de R0 for menor que 0. (se R0 < 0 ento R0 = 0)

R- O resultado do bic fica no primeiro operando, e o valor resultante de um and do segundo termo com o negado do terceiro. Quando fazemos o ASR#31 de um nmero negativo, teremos 0xffffffff. Que tem como negado 0x00000000. O and de qualquer nmero com esse nmero 0. J se o nmero positivo, o ASR#31 dar 0x00000000. Que tem como negado 0xffffffff. O and de qualquer numero com esse nmero o prprio nmero.

6) Indique a operao realizada pelo cdigo a seguir para entradas r0=0, r0=1 e r0 >= 2. Rnum EQU 2 nomeia num de 2 CMP r0, #num compara r0 com 2 BHS DoSoma se r0 for maior ou igual a 2 pule para DoSoma ADR r3, JumpTable carregue em r3 o endereo de JumpTable LDR pc, [r3,r0,LSL#2] leva o pc para JumpTable label JumpTable DCD DoSoma reserva uma memria para DoSoma DCD DoSub reserva uma memria para DoSub DoSoma ADD r0, r1, r2 soma r1 e r2 e guarda em R0 MOV pc, lr reposiciona o pc para onde teve o pulo DoSub SUB r0, r1, r2 subtrai r1 de r2 e guarda em R0 MOV pc,lr reposiciona o pc para onde teve o pulo END
Se r0 = 0, r0 = r1+r2; se r0=1; r0 = r1-r2; se r0>=2; r0 = r1+r2 7) Implemente a funo limite(a,b,c) em assembly de ARM usando desvios (branches). Parmetros passados pelos registradores R0, R1 e R2, valor de retorno em R0. A funo devolve o valor b se a < b, c se a > c ou a, se estiver na faixa entre b e c. O valor de c garantido ser maior do que b. Todos os nmeros so sem sinal. Rmov r0, #7 mov r1, #2 mov r2, #6 cmp r0, r2 bhi r0maiorr2 cmp r0, r1 blt r0menorr1 b end r0maiorr2: mov r0, r2 b end r0menorr1: mov r0, r1 b end end: 8) Implemente a funo da questo anterior sem usar desvios. Rmov r0, #1 mov r1, #2 mov r2, #6 cmp r0,r1 movlt r0, r1 cmp r0,r2 movhi r0, r2

9) Explique as pseudo-ops de assembly de ARM LDR= e ADR. RLDR= equivalente a MOV, transferindo o valor para o registrador. Usado se o valor for muito grande. ADR carrega o endereo de um label em um registrador. 10) Faa uma rotina em assembly ARM que devolva em R0 o menor valor do array de inteiros de 32 bits comeando pelo endereo armazenado em R1. A quantidade de inteiros est em R2. Rmov r1, #0x5400 mov r2, #6 mov r3, #0 mov r0, #12 mov sp, r1 mov r4, #10 STMFD SP!, {r4} mov r4, #15 STMFD SP!, {r4} mov r4, #20 STMFD SP!, {r4} mov r4, #5 STMFD SP!, {r4} mov r4, #17 STMFD SP!, {r4} mov r4, #24 STMFD SP!, {r4}

while: ldr r4,[r1,#-4]! cmp r0, r4 ldrgt r0, [r1] add r3, r3, #1 cmp r3, r2 beq end b while end:

Você também pode gostar