如何将寄存器与十六进制进行比较

时间:2019-02-09 12:24:17

标签: assembly arm

我正在用汇编语言编写一个程序,假定该程序获取按键的值,并将其存储在寄存器中,然后查看该值是什么。

按键2后,我设法将0x00000002保存到我要保存的寄存器中,该寄存器称为“ 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

我认为的预期结果是,只要它认识到它是一个数字,它将进入函数“ savekey”。但是,这永远不会发生,只会跳过所有这些。

我该如何比较十六进制和不同的寄存器,使其正常工作?还有什么更简单的方式可以编写此代码,这样我就不必为每个数字都写一个案例了吗?

2 个答案:

答案 0 :(得分:1)

我通过将#0x38替换为#8来解决了这个问题。但是,我仍然想知道如何简化代码。

答案 1 :(得分:1)

您可以在汇编器中进行范围检查。在“ C”中,这类似于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值可能已经需要减去以转换为 binary 或机器值。