Если вы не понимаете код операции, вы далеки от понимания этого.Вам нужно начать с документации по набору инструкций.что для x86 много, это не очень хорошая документация, но все же коды операций довольно ясны.С такими наборами команд несложно найти веб-страницу с диаграммой кодов операций, а затем нажать на нее, чтобы найти остальную часть определения инструкции.
Довольно типично, что относительный адрес основан на байте послеИнструкция.Если вы работали в команде над новым процессором, то вы просто спустились бы к одному из кубиков фишек и спросили (так как это еще не было бы хорошо задокументировано), но поскольку это старый дизайн, есть инструменты, которые будутпросто дайте свой ответ, не спрашивая никого.
попробуйте это
a0: jle a0
a1: jle a1
a2: jle a2
a3: jle a3
a4: jle a4
b0: jle b1
b1: jle b2
b2: jle b3
b3: jle b4
b4: jle b5
b5: nop
c0: jle c0
c1: jle c0
c2: jle c0
c3: jle c0
c4: jle c0
d0: jle d4
d1: jle d4
d2: jle d4
d3: jle d4
d4: jle d4
собрать и разобрать
0000000000000000 <a0>:
0: 7e fe jle 0 <a0>
0000000000000002 <a1>:
2: 7e fe jle 2 <a1>
0000000000000004 <a2>:
4: 7e fe jle 4 <a2>
0000000000000006 <a3>:
6: 7e fe jle 6 <a3>
0000000000000008 <a4>:
8: 7e fe jle 8 <a4>
000000000000000a <b0>:
a: 7e 00 jle c <b1>
000000000000000c <b1>:
c: 7e 00 jle e <b2>
000000000000000e <b2>:
e: 7e 00 jle 10 <b3>
0000000000000010 <b3>:
10: 7e 00 jle 12 <b4>
0000000000000012 <b4>:
12: 7e 00 jle 14 <b5>
0000000000000014 <b5>:
14: 90 nop
0000000000000015 <c0>:
15: 7e fe jle 15 <c0>
0000000000000017 <c1>:
17: 7e fc jle 15 <c0>
0000000000000019 <c2>:
19: 7e fa jle 15 <c0>
000000000000001b <c3>:
1b: 7e f8 jle 15 <c0>
000000000000001d <c4>:
1d: 7e f6 jle 15 <c0>
000000000000001f <d0>:
1f: 7e 06 jle 27 <d4>
0000000000000021 <d1>:
21: 7e 04 jle 27 <d4>
0000000000000023 <d2>:
23: 7e 02 jle 27 <d4>
0000000000000025 <d3>:
25: 7e 00 jle 27 <d4>
0000000000000027 <d4>:
27: 7e fe jle 27 <d4>
без необходимости смотреть документацию, это выглядит довольно ясночто 0x7E - это код операции, а байт после - относительное смещение ПК.0xFE для первых элементов подразумевает, что это смещение со знаком и относительно байта после инструкции.Остальные эксперименты подтверждают, что.
Не означает, что вы должны предполагать, что все инструкции перехода / перехода работают таким образом для этого набора команд, вы можете проводить аналогичные эксперименты с инструментами, которые, как известно, создают рабочий код.
Это одна из областей, в которой отсутствует документация по процессору, и обычно вам необходимо: 1) поговорить с инженерами-разработчиками, если вы можете 2) посмотреть на конструкцию чипа (исходный код) 3) документацию 4) поэкспериментировать с существующими инструментами 5) поэкспериментировать саппаратное обеспечение
Большинство людей не имеют доступа к 1 и 2. Часто 3 и 4 доступны, если на самом деле у вас есть один из этих процессоров и обычно для получения 5 у вас есть 3, и вы, вероятно, имеете доступ к 4, но иногдане.Но опять же документация часто оставляет относительный адрес неизвестным, обычно это байт после инструкции, но, как и в ARM, это фиксированное смещение от адреса инструкции, иллюзия конкретного конвейера.
804839c: 7e 0d jle 80483ab <silly+0x17>
804839c - это адрес инструкции jle yes.80483ab - это адрес, на который он будет переходить, если условие выполнено.ab-9c = 0xf = 0xD + 2. 2 - размер инструкции, 0xD - смещение / немедленное в инструкции.
Я бы предположил другие условные ветви этой формы (обратите внимание на jg позже вВаш код) - это байт кода операции и байт смещения со знаком.Но вы всегда должны проверять, прежде чем создавать свой собственный ассемблер или дизассемблер или симулятор.Начните с документов и подтвердите с помощью любых найденных инструментов, которые, как известно, работают на этой платформе.