Exam 2024/25 · Exercise 1Examen 2024/25 · Ejercicio 1

Reading an unknown routineLeer una rutina desconocida

Analyse what it does, time the worst case, and assemble it by hand. Analizar qué hace, cronometrar el peor caso y ensamblarla a mano.

Santi Scagliusi, PhD

The code, as givenEl código, tal cual

label · instructionetiqueta · instrucción
emulated formforma emulada
cyclesciclos
algo  clr.w  r13
; mov.w #0, r13
1
bucle rla.w  r12
; add.w r12, r12
1
      jnc    sigue
;
2
      xor.w  #1, r13
;
1
sigue tst.w  r12
; cmp.w #0, r12
1
      jnz    bucle
;
2
      mov.w  r13, r12
;
1
      ret
; mov.w @sp+, pc
3

One input in R12. Half of these are emulated aliases. Una entrada en R12. La mitad son alias emulados.

Trace the loop, bit by bitSigue el bucle, bit a bit

R12 0xA000
Carry
R13 0

It computes parityCalcula la paridad

Is the number of 1-bits in R12 even or odd?¿El número de bits a 1 en R12 es par o impar?

0
even number of 1snúmero par de unos
1
odd number of 1snúmero impar de unos

Each 1 that falls into the carry flips R13. Flip an even count of times and you land back on 0. Cada 1 que cae en el carry invierte R13. Invierte un número par de veces y vuelves a 0.

It follows the C calling conventionSí sigue el convenio de llamada de C

check_circle Argument in R12Argumento en R12
check_circle Return in R12Retorno en R12
check_circle Leaves R4–R10 untouchedNo toca R4–R10
check_circle Uses R13 as scratchUsa R13 como temporal
int parity(int num);

Worst case: 117 cyclesPeor caso: 117 ciclos

The loop runs until R12 empties, so the lowest 1-bit sets the count. Worst case: a 1 in bit 0, like R12 = 0xFFFF, gives the full 16 passes.El bucle gira hasta vaciar R12, así que el 1 más bajo marca la cuenta. Peor caso: un 1 en el bit 0, como R12 = 0xFFFF, da las 16 vueltas completas.

instructioninstrucción
cyclesciclos
clr.w r13
1
rla.w r12
1
jnc   sigue
2
xor.w #1, r13
1
tst.w r12
1
jnz   bucle
2
mov.w r13, r12
1
ret
3
loop body = 1+2+1+1+2 = 7 cyclescuerpo del bucle = 1+2+1+1+2 = 7 ciclos
1 + 16 × 7 + 1 + 3
=
117 cyclesciclos
117 / 1 MHz =
117 µs

Assemble it by handEnsamblarla a mano

Every instruction is one word: 8 words · 16 bytes. Cada instrucción ocupa una palabra: 8 palabras · 16 bytes.

Three ideas to take with youTres ideas para llevarte

01

Half the program is emulated aliases: clr, rla, tst and ret are MOV, ADD, CMP and a pop in disguise.La mitad del programa son alias emulados: clr, rla, tst y ret son MOV, ADD, CMP y un pop disfrazados.

02

Timing follows the worst case: the loop runs longest when the lowest bit is 1, so R12 = 0xFFFF takes all 16 passes.El tiempo lo marca el peor caso: el bucle gira más cuando el bit más bajo es 1, así que R12 = 0xFFFF da las 16 vueltas.

03

A jump offset counts words from the next instruction: +1 forward, −5 backward in two's complement.El offset de un salto cuenta palabras desde la instrucción siguiente: +1 hacia delante, −5 hacia atrás en complemento a 2.