Ensamblaje ARM: adición de bytes específicos de valores de tamaño de palabra

Estoy tratando de codificar una forma de agregar medias palabras específicas a partir de números del tamaño de una palabra en el lenguaje ensamblador ARM. Por ejemplo, digamos que quiero agregar los primeros 4 dígitos de r0=0x 3B02 9BA1 y r1=0x 0B54 A361 o los 4 dígitos del medio de r0=0x3B 029B A1 y r1=0x0B 54A3 61. Parece que no puedo hacer este trabajo. Este es un ejemplo abreviado de lo que tengo hasta ahora.

LDR r0, =0x3B029BA1;
LDR r1, =0x0B54A361;
LDRH r10, [r1]; 

Estoy bastante seguro de que tendrá que haber un desplazamiento para la dirección en la tercera línea del código, pero no he superado la mitad de la palabra solo ingresando al registro 10. Cada vez que ejecuto este código, los valores de registro correctos terminan en r0 y r1, pero no aparece nada en r10. Entonces, antes de hacer cualquier otra cosa, solo quiero entender por qué sucede esto.

¿Hay alguna razón por la que no cambiaría y enmascararía los valores? P.ej. en uint32_t r0 = 0x3B029BA1; uint32_t r1 = 0x0B54A361; uint32_t result = ((r0>>8) & 0xFFFF) + ((r1>>8) & 0xFFFF)c ¿También son números con o sin signo?
Bueno, soy nuevo en esto y, por mi parte, el desplazamiento puede venir más tarde, ahora mismo no entiendo por qué no aparece nada en r10. Además, solo puedo usar lo que hemos aprendido hasta ahora.
Rara vez escribo el ensamblador ARM y no estoy usando mi computadora habitual, por lo que no tengo los manuales de ARM para estar seguro. Sin embargo, IIRC una instrucción LDRx siempre significa cargar desde la memoria, por lo que LDRH ...,[r1]debería significar cargar desde la memoria usando el valor en r1 como esa dirección de memoria. Debe cargar los dos bytes correctos del valor, y no los 4 bytes, o usar shift y mask, o mirar la instrucción MOV para registrar transferencias. Vuelva a verificar, ya que no tengo los manuales de ARM y es posible que los recuerde mal. Pido disculpas, no puedo ser de más ayuda.

Respuestas (1)

LDR y LDRH son instrucciones para cargar un registro desde la memoria. Está utilizando R1 como puntero a la ubicación de memoria 0x0B54A361. Luego, R10 se carga con el contenido de esta ubicación de memoria (que podría ser cualquier cosa, pero probablemente 0 si esa ubicación de memoria en particular no se está utilizando).

Para mover (copiar) datos de un registro a otro debe usar la instrucción MOV. Puede combinar el movimiento con otras operaciones usando instrucciones como AND o ADD, porque el registro de destino puede ser diferente de los registros de origen. También puede aplicar un cambio o rotar con la misma instrucción.

Entonces, ¿está bien si dejo las dos líneas iniciales iguales siempre que cambie el código de operación en la tercera línea? Si bien técnicamente pueden ser ubicaciones de memoria, siempre que pueda agregarlas y guardar el valor en otro registro, estoy listo.
Sí. Los datos en R0 y R1 podrían representar ubicaciones de memoria, pero en este punto son solo datos.