Что составляет части базового блока? (например, ветви, цели, вход, выход)

#c #assembly #structure #mips #compiler-optimization

#c #сборка #структура #mips #оптимизация компилятора

Вопрос:

Следующий пример взят из организации и проектирования компьютера: интерфейс аппаратного / программного обеспечения: пятое издание. В книге автор описывает результирующий код MIPS, полученный в результате компиляции кода C, как «базовый блок», который они определяют как

последовательность инструкций без ветвей, за исключением, возможно, в конце, и без целей ветвей или меток ветвей, за исключением, возможно, в начале.

Итак, учитывая следующий код C и результирующий код MIPS, какая часть (части) кода MIPS является входом, выходом, ветвями или целями ветвей? Этот код, похоже, не соответствует определению, потому что перед концом цикла есть оператор перехода. Это помогло бы мне понять определение, если бы кто-нибудь мог предоставить другой пример базового блока или, что еще лучше, не-пример.

 while (save[i] == k)
      i  = 1;
 
 LOOP:   sll     $t1, $s3, 2
        add     $t1, $t1, $s6
        lw      $t0, 0($t1)
        bne     $t0, $s5, EXIT
        addi    $s3, $s3, 1
        j       LOOP
EXIT:
 

Комментарии:

1. Это можно легко оптимизировать в один базовый блок, используя a beq внизу как ветвь цикла без каких-либо других ветвей. (Например, цикл в стиле do{}while(), который является обычным для asm.) Также вы могли бы оптимизировать математику указателя только на приращение указателя, так lw $t0, ($t1) что / add $t1, $t1, 4 / beq $t0, $s5, LOOP . Выполнение приращения между загрузкой и переходом также заполняет интервал задержки загрузки, избегая остановки в классическом конвейере MIPS.

Ответ №1:

Это проще, если вы понимаете, для чего и как они используются. Они используются для анализа потока управления.

Базовый блок представляет собой серию инструкций, в которые управление программой не может входить и не может выходить. Т.е. Выполнение не может начинаться с середины базового блока, и после выполнения первой инструкции выполняются все инструкции в базовом блоке.

Итак, это схема управления в вашем примере:

 LOOP
 |
 |
 |   --------- 
  ->| Block 1 | <--- 
    | ------- |     |
    | sll     |     |
    | add     |     |
    | lw      |     |
    | bne     |     |
     ---------      |
       |            |
  -----             |
 |     |            |              
 |     /           |
 |   ---------      |
 |  | Block 2 |     |
 |  | ------- |     |
 |  | addi    |     |
 |  | j       |     |
 |   ---------      |
 |     |            |
 |      ------------ 
 |
 /
EXIT
 

Также следует отметить, что в исполняемом файле метки не существуют. Когда в инструкции по сборке указано перейти к метке, в двоичном формате это будет переход к адресу инструкции под этой меткой.