ARM汇编代码和SVC编号

时间:2014-06-11 11:44:32

标签: assembly arm thumb

在ARM汇编代码中我可以看到类似这样的东西...... (特别是在shellcode中)

svc 0x0090003f
svc 0x001ff3bf
swi 0x0900ff0b

我知道'svc(或swi)'是'supervisor call',比如英特尔的'int 0x80'或'SYSENTER'。但是,我怎么能解释'svc'数字?我在哪里可以获得它的信息列表?拇指'svc'指令怎么样?

手臂使用说明书似乎没有解释这些......

有人能帮助我吗? 提前谢谢。

3 个答案:

答案 0 :(得分:1)

SVC值存储在ESR寄存器的16位低位中

ARMv8 Architecture Reference D12.2.36“ ESR_EL1,异常综合症寄存器(EL1)”表示,如果EC位为0b010101,则ISS字段记录为“针对HVC或SVC指令执行的异常的ISS编码”

该节然后说低16位是imm16,如果您查看SVC定义,则是给16位自变量的名称。

最后,您在问题上显示的SVC调用在ARMv8 GNU GAS中无效,因为它们大于16位。例如:

SVC 0xABCDE

正确组装失败:

Error: immediate value out of range 0 to 65535 at operand 1 -- `svc 0xABCDE

可运行的示例

这是一个极简的aarch64裸机可运行示例,该示例执行SVC并在处理程序中打印出所有寄存器,包括ESR https://github.com/cirosantilli/linux-kernel-module-cheat/tree/b1bfd46efebabcba4f1ab1cbddf99611550e2dc2#arm-svc-instruction

答案 1 :(得分:0)

6.2.8。 SVC处理程序

异常处理程序可能必须确定发生异常时处理器是处于ARM状态还是Thumb状态。

特别是,SVC处理程序可能必须读取处理器状态。这是通过检查SPSR T位来完成的。此位设置为Thumb状态,清除为ARM状态。

ARM和Thumb指令集都有SVC指令。从Thumb状态调用SVC时,必须考虑以下事项:

指令地址为lr-2,而不是lr-4。

指令本身是16位,因此需要半字加载,见图6.3。

SVC编号保持8位而不是ARM状态的24位。

http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0203j/Cacdfeci.html

了解详情

答案 2 :(得分:0)

从6.2.8开始。 SVC处理程序

每当遇到任何svc / swi时,控制权就会转移到svc处理程序。在SVC处理程序中,这些数字将用于标识需要调用哪些子例程,因此这些是处理程序将获取并进行相应处理的索引值。

示例6.11。 C函数中的SVC处理程序

void C_SVC_handler (unsigned number)
{
    switch (number)
    {
        case 0 :                 /* SVC number 0 code */
            ...
            break;
        case 1 :                 /* SVC number 1 code */
            ...
            break;
        ...
        default :                /* Unknown SVC - report error */
    }
}

参考- 6.2.8。 SVC处理程序