Almacenar instrucción de byte en ensamblaje RISC-V

Tengo un breve fragmento de ensamblaje RISC-V que tengo problemas para entender. No se si estoy interpretando mal las instrucciones, por mi interpretación parece que se va a tomar la sucursal (BNE) pero se da que no debe ser.

Dado el código comentado:

000001b8 <test_4>:
lui  sp,0xfffff     # -> load [sp]  = 0xfffff000
addi sp,sp,-96      # -> add -96 to [sp], resulting in [sp]  = 0xffffefa0 
sb   sp,2(ra)       # -> store 0xffffffff (sign extend [23:16] of [sp]) to memory
lh   a4,2(ra)       # -> load halfword from data memory to [a4]  = 0xffffffff 
lui  t2,0xfffff
addi t2,t2,-96      # -> [t2]  = 0xffffefa0 
li   gp,4 
bne  a4,t2,56c <fail> # -> guaranteed fail since 0xffffffff != 0xffffefa0? 

¡Cualquier ayuda sería muy apreciada!

Lo siento, sentí que los comentarios que agregué proporcionaron una explicación adecuada de lo que esperaba que hiciera cada instrucción. RISC-V es relativamente nuevo, pero comparte una parte bastante significativa de su conjunto de instrucciones con MIPS, que es bastante común y se enseña en muchos cursos universitarios. Creo que las instrucciones LUI, ADDI, SB, BNE y SH están incluidas en MIPS ISA. Me preguntaba si específicamente interpreté correctamente las instrucciones SB (almacenar byte) y LH (cargar media palabra); o si esas dos instrucciones cargan el valor 0xffffffff en la memoria. ¡Espero que esto sea mejor!
Específicamente, esperaba que alguien pudiera ver los comentarios de cada instrucción y ver si la interpretación de las instrucciones es incorrecta. Este fragmento de código se ensambló para el entero base ISA RV32i si eso ayuda. Si hay alguna información adicional que pueda proporcionar, házmelo saber.
¿Por qué dices "es dado que no debe ser"? Mi lectura es que seguir la rama se considera un error, y siempre fallará.

Respuestas (1)

Parece que no entiendes SB:

sb   sp,2(ra)       # -> store 0xffffffff (sign extend [23:16] of [sp]) to memory

Este comentario no es correcto. Esto almacena 0xa0 (los 8 bits inferiores de sp) en la memoria. La dirección es ra+2.

a4 tendrá el valor de 0xSSSSXXa0donde XXestá cualquier valor que se encuentre en el siguiente byte y SSSSes la extensión de signo del mismo. Si ese byte fuera 0xefentonces a4 puede tener el valor 0xffffefa0.