Как рассчитывается максимальный диапазон одиночного перехода инструкций MIPS? - PullRequest
0 голосов
/ 25 апреля 2018

Я изучаю компьютерную архитектуру (архитектуру MIPS) и читаю следующие утверждения:

1. Инструкции ветвления имеют 16-битное поле со смещением со знаком, которое позволяет переходить по адресу + или -128kBytes (+ 0x1FFFC TO -0X20000) из текущего местоположения.

2. Инструкция перехода указывает адрес в пределах текущей области 256 МБ (0x0FFFFFFC), указанной счетчиком программы, самые старшие 4 бита.

Я понимаю концепцию диапазона перехода, описанную выше, но как три числа 0x0FFFFFFC, 0x1FFFC и 0X20000 рассчитываются с использованием "диапазона 256 МБ" и "диапазона + -128 КБ"?

Спасибо!

1 Ответ

0 голосов
/ 25 апреля 2018

Почему бы вам просто не спросить проверенный и отлаженный набор инструментов, а затем сравнить это с документацией?

so.s

four:
nop
nop
nop
j one
nop
j two
nop
j three
nop
j four
nop
nop
nop
nop
nop
one:
nop
two:
nop
nop
three:
nop

сборка и разборка

mips-elf-as so.s -o so.o
mips-elf-objdump -D so.o

so.o:     file format elf32-bigmips


Disassembly of section .text:

00000000 <four>:
    ...
   8:   0800000f    j   3c <one>
   c:   00000000    nop
  10:   08000010    j   40 <two>
  14:   00000000    nop
  18:   08000012    j   48 <three>
  1c:   00000000    nop
  20:   08000000    j   0 <four>
  24:   00000000    nop
    ...

0000003c <one>:
  3c:   00000000    nop

00000040 <two>:
    ...

00000048 <three>:
  48:   00000000    nop

ссылка на какой-то адрес и дизассемблирование

00001000 <_ftext>:
    ...
    1008:   0800040f    j   103c <one>
    100c:   00000000    nop
    1010:   08000410    j   1040 <two>
    1014:   00000000    nop
    1018:   08000412    j   1048 <three>
    101c:   00000000    nop
    1020:   08000400    j   1000 <_ftext>
    1024:   00000000    nop
    ...

0000103c <one>:
    103c:   00000000    nop

00001040 <two>:
    ...

00001048 <three>:
    1048:   00000000    nop

так что прыжки супер легки, как насчет ветки?

four:
nop
nop
nop
beq $10,$11,one
nop
beq $10,$11,four
nop
nop
nop
one:
nop

сборка и разборка

00000000 <four>:
    ...
   8:   114b0006    beq $10,$11,24 <one>
   c:   00000000    nop
  10:   114bfffb    beq $10,$11,0 <four>
  14:   00000000    nop
    ...

00000024 <one>:
  24:   00000000    nop

Здесь помогает некоторый опыт, вначале идущий вперед 0x24 - 0x8 = 0x1C. Это фиксированные 32-битные инструкции, поэтому маловероятно, что им нужно тратить два бита и обрезать диапазон, поэтому 0x1C >> 2 = 7. Кодировка имеет 6. Хорошо, также вероятно, что они думают с точки зрения ПК. инкрементный или другой способ посмотреть на это - 6 (+1) инструкций впереди. 0xC, 0x10, 0x14, 0x18, 0x1c, 0x20, 0x24. Так что это означало бы идти назад (0x00 - (0x10 + 4)) >> 2 = (0x00-0x14) >> 2 = 0xFFFF ... FFFFEC >> 2 = 0xFF ... FFFB и, конечно же, это то, что мы получаем.

Так что для филиалов вы берете

((destination - (current address + 4))/4)&0xFFFF = 
(((destination - current address)/4) + 1)&0xFFFF

Для немедленных прыжков = {pc [31:28], пункт назначения [28: 2]}

Вы должны быть в состоянии определить диапазоны из этой информации.

Ключом к кодировке, являющейся инструкцией, является фиксированный 32-битный код, выровненный по 32-битным границам, поэтому два lsbit всегда являются нулями вместе с соответствующей им математикой, так зачем уменьшать ваш диапазон на 4 для хранения нулей? Вы не делаете, вы эффективно упаковываете смещения в немедленное. Некоторые (фиксированной длины) наборы инструкций этого не делают, но, как правило, имеют причину не участвовать в проекте.

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

Обычно вы всегда должны иметь доступ к ресурсу с ответом, который может помочь объяснить руководство, в котором отсутствуют некоторые детали. Конечно, иногда вы получаете хорошее руководство ... (и вы все равно должны это проверить с помощью ресурса).

...