Почему бы вам просто не спросить проверенный и отлаженный набор инструментов, а затем сравнить это с документацией?
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 для хранения нулей? Вы не делаете, вы эффективно упаковываете смещения в немедленное. Некоторые (фиксированной длины) наборы инструкций этого не делают, но, как правило, имеют причину не участвовать в проекте.
В общем случае отлаженный ассемблер, если у вас есть доступ к нему, собирается предоставить более полезную информацию, чем справочник по набору команд, это основано на опыте изучения многих наборов команд. Если вы первый, кто пишет ассемблер для какого-либо процессора, это означает, что вы работаете там или имеете прямой доступ к конструкторам процессора, и вы можете просто спросить их, не стоит ли полагаться на еще не написанное руководство, которое они напишет после того, как чип будет записан на пленку, что слишком поздно, поскольку вам / ей нужен ассемблер для проверки дизайна Так что электронные письма, скайпы и наиболее важные обсуждения доски с инструкциями по кодированию. У вас также может быть доступ к исходному коду чипа и / или к симулятору, чтобы вы могли запустить свой код, увидеть, как он выполняется в симе (изучить формы сигналов) и увидеть, куда он ветвится (куда он извлекается), изменить немедленный, посмотреть в том месте, где это происходит.
Обычно вы всегда должны иметь доступ к ресурсу с ответом, который может помочь объяснить руководство, в котором отсутствуют некоторые детали. Конечно, иногда вы получаете хорошее руководство ... (и вы все равно должны это проверить с помощью ресурса).