Подтвердить что ты не робот

Почему регистратор ARM PC указывает на инструкцию после следующего запуска?

В соответствии с IC ARM.

В состоянии ARM значение ПК - это адрес текущей команды плюс 8 байтов.

В состоянии Thumb:

  • Для инструкций B, BL, CBNZ и CBZ значение ПК - это адрес текущей команды плюс 4 байта.
  • Для всех других инструкций, в которых используются метки, значение ПК является адресом текущей команды плюс 4 байта, бит [1] результата очищается до 0, чтобы сделать его выравниванием по словам.

Просто говоря, значение регистра ПК указывает на инструкцию после следующей инструкции. Это то, чего я не понимаю. Обычно (особенно в x86) регистр счетчика программ используется для указания адреса следующей команды, которая должна быть выполнена.

Итак, каковы предпосылки, лежащие в основе этого? Условное выполнение, возможно?

4b9b3361

Ответ 1

Это неприятный бит утечки абстракции.

Оригинальная конструкция ARM имела трехступенчатый конвейер (fetch-decode-execute). Чтобы упростить дизайн, они решили, что ПК будет считан как значение, находящееся в настоящее время на адресных линиях выборки команд, а не на текущей исполняемой инструкции от 2 циклов назад. Поскольку большинство адресов, относящихся к PC, вычисляются во время соединения, проще, чтобы ассемблер/компоновщик компенсировал это смещение в 2 команды, чем для того, чтобы сконструировать всю логику для "исправления" регистра ПК.

Конечно, это все твердо на "вещи, которые имели смысл 30 лет назад". Теперь представьте, что нужно, чтобы сохранить значимую ценность в этом регистре на сегодняшний день на конвейерах с более чем 15 этапами, несколькими выпусками, вне очереди, и вы можете понять, почему в эти дни сложно найти проектировщика ЦП, который думает об экспонировании ПК как регистр - хорошая идея.

Тем не менее, с другой стороны, по крайней мере, это не так ужасно, как задержка слотов. Вместо этого, вопреки тому, что вы предполагаете, выполнение каждой команды условно было действительно просто еще одной оптимизацией вокруг этого смещения предварительной выборки. Вместо того, чтобы всегда требовать задержек в потоке флеша при разветвлении условного кода (или все еще выполняющего все, что осталось в трубе, как сумасшедший), вы можете полностью исключить короткие ветки; трубопровод остается занятым, и декодированные инструкции могут просто выполняться как NOP, когда флаги не соответствуют *. Опять же, в наши дни у нас есть эффективные отраслевые предсказатели, и это в конечном итоге становится скорее помехой, чем помощью, но в 1985 году это было круто.

* ... набор команд с наибольшим количеством NOP на планете.

Ответ 2

, что true...

один пример приведен ниже: C:

int f,g,y;//global variables
int sum(int a, int b){
     return (a+b);
}
int main(void){
    f = 2;
    g = 3;
    y = sum(f, g);
    return y;
}

скомпилировать для сборки:

    00008390 <sum>:
int sum(int a, int b) {
return (a + b);
}
    8390: e0800001 add r0, r0, r1
    8394: e12fff1e bx lr
    00008398 <main>:
int f, g, y; // global variables
int sum(int a, int b);
int main(void) {
    8398: e92d4008 push {r3, lr}
f = 2;
    839c: e3a00002 mov r0, #2
    83a0: e59f301c ldr r3, [pc, #28] ; 83c4 <main+0x2c> 
    83a4: e5830000 str r0, [r3]
g = 3;
    83a8: e3a01003 mov r1, #3
    83ac: e59f3014 ldr r3, [pc, #20] ; 83c8 <main+0x30>
    83b0: e5831000 str r1, [r3]
y = sum(f,g);
    83b4: ebfffff5 bl 8390 <sum>
    83b8: e59f300c ldr r3, [pc, #12] ; 83cc <main+0x34>
    83bc: e5830000 str r0, [r3]
return y;
}
83c0: e8bd8008 pop {r3, pc}
83c4: 00010570 .word 0x00010570
83c8: 00010574 .word 0x00010574
83cc: 00010578 .word 0x00010578

см. выше значение LDR PC - здесь используется для загрузки переменной f, g, y адреса в r3.

    83a0: e59f301c ldr r3, [pc, #28];83c4 main+0x2c
    PC=0x83c4-28=0x83a8-0x1C = 0x83a8

Значение ПК - это только текущая инструкция по выполнению следующей следующей инструкции. поскольку ARM использует инструкцию 32bits, но использует адрес байта, поэтому + 8 означает 8bytes, длину двух инструкций.

так что подключенная ARM archi 5-канальная линия linefetch, декодирование, выполнение, память, обратная запись

Конвейер этапа ARM 5

регистр ПК добавляется по 4 каждый такт, поэтому, когда команда запускается, чтобы выполнить - текущая инструкция, регистрация ПК уже пропустила 2 часа! теперь это + 8. Это на самом деле означает: ПК указывает команду "выборка", текущая инструкция означает "выполнить" команду, поэтому ПК означает следующее, следующего за исполнением.

BTW: рис. из книги Харриса по цифровому дизайну и компьютерной архитектуре ARM Edition