Инструкция ldrsh
загружает половину слова, то есть 16 бит (h
в ldrsh
), и расширяет знак (s
в ldrsh
) в 32-битном регистре.Инструкция ldrh
будет расширять загруженные 16 битов до 32 бит.Причина, по которой вы получаете поведение с расширением знака, заключается в том, что тип short
является типом со знаком.
Чтобы сохранить половину слова, вы всегда будете использовать инструкцию strh
, которая просто берет младшие 16 битреестр и хранит их.Инструкции strsh
не существует, так как не требуется специфической для знака обработки, чтобы просто взять младшие 16 бит.
Поскольку ваш код загружает 16-битное значение и сразу же сохраняет его как 16-битное значение,ldrh
инструкция тоже сделала бы эту работу.В этом случае это не имеет значения.Но если вы хотите сделать какую-либо арифметику для значения между ними, вам определенно нужно, чтобы ldrsh
выполнил правильное расширение знака.