Как именно строки кода соотносятся друг с другом в ассемблерном коде, когда задействован переход? - PullRequest
0 голосов
/ 20 октября 2018

Хорошо, я понимаю, что означает mov, я понимаю, что такое регистры, я понимаю, что команда выполняет.Я даже понимаю, что самый левый шестнадцатеричный номер является номером инструкции.Например, в строке 7 шестнадцатеричное 7f - это инструкция jg.FINE.

Чего я не понимаю, КАК ТОЧНО эти факты складываются, и это невероятно расстраивает.

Что я знаю до сих пор:

Как, например, в строке 1 0d добавляет в строку 804839c?Нет, он переходит на строку 17, потому что 0d - это инструкция ПОСЛЕ строки 1. Если вы добавите 0d к адресу 804839e, вы получите 80483a7.ХОРОШО.

Означает ли это, что все инструкции для следующей строки относятся ко второму 2-битному шестнадцатеричному?

Означает ли это, что крайний левый шестнадцатеричный символ - это инструкция текущей строки?

Мне просто нужно немного больше указаний, я настолько близок к тому, чтобы понять это, что я почти могу попробовать это.

1 804839c: 7e 0d      jle   80483ab <silly+0x17>
2 804839e: 89 d0      mov   %edx,%eax
3 80483a0: d1 f8      sar   %eax
4 80483a2: 29 c2      sub   %eax,%edx
5 80483a4: 8d 14 52   lea   (%edx,%edx,2),%edx
6 80483a7: 85 d2      test  %edx,%edx
7 80483a9: 7f f3      jg    804839e <silly+0xa>
8 80483ab: 89 d0      mov   %edx,%eax 

Ответы [ 2 ]

0 голосов
/ 24 ноября 2018

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

0 голосов
/ 22 октября 2018

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

Но здесь важно помнить, что счетчик программ (то, что вы добавляете смещение)к) - местоположение инструкции после прыжка.Я всегда помню это, думая, что ЦП уже переместил счетчик программ в следующее место в ожидании получения следующей инструкции (2) .

Это важно.В соответствии с вашим примером кода (ненужные данные удалены):

1   804839c: 7e 0d      jle   80483ab <silly+0x17>
2   804839e: 89 d0      mov   %edx, %eax
3-7                     blah  blah, blah
8   80483ab: 89 d0      mov   %edx, %eax 

Смещение 0d добавляется к расположению второй строки 804839e, чтобы получить цель перехода по восьмой строке 80483ab.


(1) Не все инструкции по переходу являются относительными.Просто вы выбрали краткую форму для вашего вопроса, код операции 7e.Вы также можете выбрать ближайшую форму 0f 8e.Я не думаю, что существуют варианты условных переходов в далекой форме, вместо этого вы эмулируете их, изменяя смысл сравнения, например:

jle  farPoint    -->          jg   noJump
blah blah, blah               jmp  farPoint
                      noJump: blah blah, blah

(2) Потому что так было в те дни, когда я начал резать необработанный код для процессоров.С сегодняшним конвейером, спекулятивным исполнением и т. Д. Я не уверен.

...