为什么以下ARM代码在R0
之后将0
设置为SWI
?
.equ SWI_CheckButton, 0x203
.global _start
.text
_start:
mov R0, #1
swi SWI_CheckButton
我正在尝试修改一个采用
形式的程序FunctionA:
swi SWI_CheckButton
cmp R0, #1
beq label1
cmp R0, #2
beq lablel2
...
cmp R0, #9
beq label9
label1:
...
label9:
@do work
bal FunctionA
这会在label9
中搞砸了,因为我希望它记住按下的最后一个键,但是swi SWI_CheckButton
将R0
重置为0
(我想如果没有按下任何内容) )。
问题是swi 0x203
将R0
重置为0
,那么我会在哪里找到执行相同操作但不重置swi
的{{1}}?
答案 0 :(得分:1)
我的猜测是SWI有一个返回值(可能为零表示 false ?)
您需要将所需的值存储在另一个寄存器中,并在通话后将其恢复。如果您没有备用寄存器,则必须将其保存到堆栈中。
答案 1 :(得分:0)
我最终found an example获得了该SWI。搜索SWI_CheckBlue
。所发生的是被按下的键的代码由R0中的SWI例程返回。如果返回时R0为零,则表示在调用SWI时没有按下任何键。
你可能需要循环,直到它出现非零。