【问题标题】:ARM7 TDMI undefined instruction exception manual generationARM7 TDMI未定义指令异常手动生成
【发布时间】:2012-08-07 18:33:53
【问题描述】:

我正在尝试测试一些在 ARM7 TDMI 处理器上运行的异常处理代码。我想手动创建一个指令操作码,它将生成“未定义指令”异常。到目前为止,我已经这样做了:

void createUndefinedException()
{    
    static const int instr = 0x26889912; // bad opcode
    ((void(*)(void))instr)();
}

我之所以得到上面的操作码,是因为我今天在网上找到了一个reference page,它在最底部讨论了未定义的指令操作码。

以上代码生成的是预取中止异常,而不是未定义的指令异常。

有人知道如何轻松创建这个吗?

我只是想验证我对这个异常的处理是否能够正常工作。

【问题讨论】:

    标签: exception exception-handling arm opcode


    【解决方案1】:

    创建一个 asm 文件

    .globl test_function
    test_function:
    .word 0x26889912
    bx lr
    

    组装起来

    arm-none-linux-gnueabi-as fun.s -o fun.o
    

    从你的 C 代码调用它

    extern void test_function ( void );
    
    ...
    
    test_function();
    

    然后将其添加到您要链接的对象列表中

    arm-none-linux-gnueabi-gcc myprogram.c fun.o -o myprogram
    

    并运行它。

    【讨论】:

    • 即使当我尝试跳转到该值时,该值导致预取中止,但在尝试将其作为操作码执行时,它不会导致未定义的指令异常。所以,我又回来在 ARM7 上寻找一个真正未定义的操作码。如果我能找到正确的操作码,我有适当的机制。
    • 来自 ARM ARM:架构上未定义:cond01111111xxxxxxxxxxxx1111xxxx 所以尝试类似 0xE7FFFFFF
    • 另一条未定义指令:cond00110x00xxxxxxxxxxxxxxxxxxxx so 0xE30FFFFF
    【解决方案2】:

    你需要从int的地址中创建一个函数:

    typedef void (*Exception)(void)
    static unsigned long illegalOpcode=0x26889912;
    Exception e=(Exception)&illegalOpcode;
    e();
    

    【讨论】:

      猜你喜欢
      • 2013-03-04
      • 1970-01-01
      • 2019-10-14
      • 2014-06-21
      • 2015-07-26
      • 2013-04-11
      • 2016-01-15
      • 2021-12-08
      • 1970-01-01
      相关资源
      最近更新 更多