Как сравнить регистр с шестнадцатеричным - PullRequest
0 голосов
/ 09 февраля 2019

Я пишу программу на ассемблере, которая должна принять значение нажатия клавиши, сохранить его в регистре и посмотреть, что это за значение.

Мне удалось сохранить 0x00000002 после нажатия клавиши 2, в регистр, который я хотел сохранить, в котором он называется «r1».

Теперь я заблудился.Сейчас я пытаюсь сравнить это с некоторыми шестнадцатеричными числами, чтобы потом узнать, что это за значение, и использовать его в другой функции.Вот как выглядит мой код:

cmp r1, #0x30
beq savekey
cmp r1, #0x31
beq savekey
cmp r1, #0x32
beq savekey
cmp r1, #0x33
beq savekey
cmp r1, #0x34
beq savekey
cmp r1, #0x35
beq savekey
cmp r1, #0x36
beq savekey
cmp r1, #0x37
beq savekey
cmp r1, #0x38
beq savekey
cmp r1, #0x39
beq savekey

Ожидаемый результат этого, как я думал, будет заключаться в том, что он будет переходить к функции «ключ сохранения» всякий раз, когда он распознает, что это число.Однако этого никогда не происходит, и он просто пропускает их все.

Как я могу сделать сравнение между регистром и шестнадцатеричным разным, чтобы он работал правильно?И есть ли какой-нибудь более простой способ написать это, чтобы мне не приходилось писать регистр для каждой цифры?

Ответы [ 2 ]

0 голосов
/ 09 февраля 2019

Вы можете сделать проверку диапазона в ассемблере.В «С» это будет что-то вроде if(x >= '0' && x < ((int)'9')+1) savekey();.Эквивалентный ассемблер ARM будет выглядеть так:

  cmp r1, 0x30
  blo bad_value
  cmp r1, 0x3A
  bhs bad_value
  b   save_key

Вам нужно иметь ветку для плохого случая, если вы не используете временный регистр.Вы можете вычесть основание (0x30), обработать временное значение как unsigned и проверить на верхний регистр.Вот что-то вроде этого:

 sub r2, r1, 0x30         @ low values will wrap to a high unsigned value
 cmp r2, 10               @ in range (0-9)?
 blo save_key
 ; bad/error handling here.

Как уже отмечали другие, вашему значению ASCII уже может понадобиться это вычитание для преобразования в двоичное или машинное значение.

0 голосов
/ 09 февраля 2019

Я решил это, заменив, например, # 0x38 на # 8.Однако мне все еще интересно, как упростить код.

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