ARM7 TDMI генерация руководств по исключению неопределенных инструкций

Я пытаюсь протестировать некоторый код обработки исключений, работающий на процессоре ARM7 TDMI. Я хочу вручную создать код операции инструкции, который будет генерировать исключение «Неопределенная инструкция». До сих пор я сделал это:

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

Я пришел к указанному выше коду операции из-за справочной страницы, которую нашел сегодня на сеть, которая говорит о неопределенных кодах операций инструкций в самом низу.

Приведенный выше код генерирует исключение прерывания предварительной выборки вместо исключения неопределенной инструкции.

У кого-нибудь есть идея, как это легко создать?

Я просто хочу убедиться, что моя обработка этого исключения будет работать правильно.


person user1582781    schedule 07.08.2012    source источник


Ответы (2)


создать ассемблерный файл

.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

и запустить его.

person old_timer    schedule 07.08.2012
comment
Несмотря на то, что это значение вызывало прерывание предварительной выборки, когда я пытался перейти к нему, оно не вызывает исключения неопределенной инструкции при попытке выполнить его как код операции. Итак, я вернулся к поиску действительно неопределенного опкода на ARM7. У меня есть механизм, если я просто найду правильный код операции. - person user1582781; 08.08.2012
comment
от ARM ARM: архитектурно undefined: cond01111111xxxxxxxxxxxx1111xxxx, поэтому попробуйте что-то вроде 0xE7FFFFFF - person old_timer; 08.08.2012
comment
еще одна неопределенная инструкция: cond00110x00xxxxxxxxxxxxxxxxxxxxx, поэтому 0xE30FFFFF - person old_timer; 08.08.2012

Вам нужно создать функцию из адреса int:

typedef void (*Exception)(void)
static unsigned long illegalOpcode=0x26889912;
Exception e=(Exception)&illegalOpcode;
e();
person Andrew Buettner    schedule 05.09.2014