Sin los códigos de operación originales, no es posible decir con total confianza si esta secuencia se está decodificando con precisión.
Sin embargo, una
posibilidad que sería legítima en un Cortex M3 sería esta instrucción Thumb-2 de 32 bits descodificada por arm-none-eabi-objdump:
f803 1b01 strb.w r1, [r3], #1
Este es del tipo que ARM Holdings llama "Sintaxis del pulgar (ancho, v6T2)" y un formato alternativo que se acerque más a la vista de su depurador sería:
STRB Rt, [Rn], #-255…255
En este caso, el byte bajo del valor en r1 se almacenaría en la dirección en r3, y luego r3 sería (como se señaló por primera vez por @old_timer) incrementado en 1.
Este es un significado bastante plausible, ya que la traza de depuración hace que parezca que esto es parte de la implementación de la función memset()
, que llena la memoria con un valor de byte.
Si este fuera el caso, entonces el pseudocódigo real sería algo así como:
//r0=memset(r0, r1, r2)
Copy target address from r0 to working register r3
Add length in r2 to target address in r0 or r3 and save in r2
another:
if r3 equals r2 goto end
store byte from r1 to address in r3, then increment r3 by one byte
goto another
end:
return instruction, with the un-incremented target address in r0
Como nota adicional, el rango de incremento para esta instrucción es de +/- 255 unidades, donde la unidad en este caso es un byte. Un byte completo de la instrucción de 32 bits está disponible para almacenar la magnitud del desplazamiento, mientras que el signo se almacena por separado.
La copia de la dirección base de r0 a r3 es necesaria porque memset()
debe devolver la dirección base sin modificar, y convenientemente, en la misma r0 en la que se pasó.