SWI将R0设置为0

时间:2012-03-20 01:01:44

标签: assembly arm

为什么以下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_CheckButtonR0重置为0(我想如果没有按下任何内容) )。

问题是swi 0x203R0重置为0,那么我会在哪里找到执行相同操作但不重置swi的{​​{1}}?

2 个答案:

答案 0 :(得分:1)

我的猜测是SWI有一个返回值(可能为零表示 false ?)

您需要将所需的值存储在另一个寄存器中,并在通话后将其恢复。如果您没有备用寄存器,则必须将其保存到堆栈中。

答案 1 :(得分:0)

我最终found an example获得了该SWI。搜索SWI_CheckBlue。所发生的是被按下的键的代码由R0中的SWI例程返回。如果返回时R0为零,则表示在调用SWI时没有按下任何键。

你可能需要循环,直到它出现非零。