Разница между ldrsh, ldrh, strh и strsh - PullRequest
0 голосов
/ 10 июня 2018

Я не уверен, когда использовать ldrsh vs ldrsh и strh vs strsh

Я знаю, что один для неподписанного, а другой для подписанного, но как мы узнаем, когда нам нужно сохранить его подписанным илиunsigned?

Например,

short a[5];
short *ptr;

*(a+3) = a[1];
ldrsh    r3, [fp, -12]
strh     r3, [fp, -8]

Это фрагмент кода сборки ARM из моей рабочей таблицы.Я просто не понимаю, почему мы использовали ldrsh для одной инструкции и strh для другой.

1 Ответ

0 голосов
/ 15 июня 2018

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

Чтобы сохранить половину слова, вы всегда будете использовать инструкцию strh, которая просто берет младшие 16 битреестр и хранит их.Инструкции strsh не существует, так как не требуется специфической для знака обработки, чтобы просто взять младшие 16 бит.

Поскольку ваш код загружает 16-битное значение и сразу же сохраняет его как 16-битное значение,ldrh инструкция тоже сделала бы эту работу.В этом случае это не имеет значения.Но если вы хотите сделать какую-либо арифметику для значения между ними, вам определенно нужно, чтобы ldrsh выполнил правильное расширение знака.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...