我正在用汇编语言编写一个程序,假定该程序获取按键的值,并将其存储在寄存器中,然后查看该值是什么。
按键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”。但是,这永远不会发生,只会跳过所有这些。
我该如何比较十六进制和不同的寄存器,使其正常工作?还有什么更简单的方式可以编写此代码,这样我就不必为每个数字都写一个案例了吗?
答案 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 或机器值。