sh
lyszt.net cubre sh y otras instrucciones RISC-V con más detalle.
Formato de codificación
Descripción
sh escribe una media palabra, 16 bits o 2 bytes, en memoria. Coincide con las cargas lh y lhu y almacena el tamaño más estrecho donde sw almacena la palabra completa. La forma se muestra a continuación. Toma el valor del registro fuente rs2 y escribe sus 16 bits más bajos en la dirección del registro base rs1 más el desplazamiento. La disposición coincide con sw, con el registro fuente nombrado primero.
sh rs2, offset(rs1)
Un registro contiene 32 bits y solo se almacenan 16, por lo que sh conserva los 16 más bajos y descarta los 16 superiores. Los almacenamientos no tienen elección entre con signo o sin signo. Esa elección pertenece a las cargas, donde un valor estrecho debe ampliarse para llenar un registro y los bits faltantes necesitan una regla. Un almacenamiento estrecha el valor, y conservar los bits bajos es el único comportamiento que tiene sentido. Si el registro contiene un valor demasiado grande para 16 bits, los bits extra se pierden sin advertencia, así que verifica el rango antes de almacenar.
El manual de RISC-V dice que sh almacena los 16 bits bajos del registro rs2 en memoria en la dirección de rs1 más el desplazamiento de 12 bits con extensión de signo. Los almacenamientos de media palabra en direcciones pares están naturalmente alineados y nunca generan un error de alineación. Un almacenamiento a una dirección que no está naturalmente alineada se comporta como defina el entorno de ejecución, y el manual dice que puede ejecutarse extremadamente lento.
sh escribe todos los formatos de 16 bits que lh y lhu leen de vuelta, como muestras de audio, datos de píxeles de 16 bits y arreglos de media palabra. Un patrón común es leer, modificar y escribir. Carga una media palabra con lhu, ajústala en el registro y vuelve a almacenarla con sh. Solo cambian los 2 bytes objetivo y los bytes a su alrededor permanecen como estaban. Las medias palabras están a 2 bytes de distancia, por lo que los bucles mueven la dirección en 2.
Ejemplo
la t0, slot li t1, -5 sh t1, 0(t0) # memory at slot now holds the low 16 bits of -5
