Я пытаюсь интерпретировать построчно, что делает этот ассемблерный код, но я был очень сбит с толку, когда мне представили эту таблицу переходов, которая находится в ассемблере. Это взято из вопроса 3.63 упражнения учебника, но нет объяснения - поэтому и спрашиваю здесь. Цель состоит в том, чтобы перепроектировать предоставленный листинг сборки и написать код C, который мог бы его сгенерировать (почувствуйте тело оператора switch). Пожалуйста помоги :(
Учебник: Рэндал Э. Брайант, Дэвид Р. О'Халларон - Компьютерные системы. Перспектива программиста [3-е изд.] (2016, Пирсон)
qn 3.63
long switch_prob(long x, long n) {
long result = x;
switch(n) {
/* Fill in code here */
}
return result;
}
Я не уверен, как его «расшифровать» или как узнать, куда он указывает.
0000000000400590 <switch_prob>:
400590: 48 83 ee 3c sub $0x3c,%rsi
400594: 48 83 fe 05 cmp $0x5,%rsi
400598: 77 29 ja 4005c3 <switch_prob+0x33>
40059a: ff 24 f5 f8 06 40 00 jmpq *0x4006f8(,%rsi,8)
4005a1: 48 8d 04 fd 00 00 00 lea 0x0(,%rdi,8),%rax
4005a8: 00
4005a9: c3 retq
4005aa: 48 89 f8 mov %rdi,%rax
4005ad: 48 c1 f8 03 sar $0x3,%rax
4005b1: c3 retq
4005b2: 48 89 f8 mov %rdi,%rax
4005b5: 48 c1 e0 04 shl $0x4,%rax
4005b9: 48 29 f8 sub %rdi,%rax
4005bc: 48 89 c7 mov %rax,%rdi
4005bf: 48 0f af ff imul %rdi,%rdi
4005c3: 48 8d 47 4b lea 0x4b(%rdi),%rax
4005c7: c3 retq
Таблица переходов находится в другой области памяти. Из косвенного перехода в строке 5 видно, что таблица переходов начинается с адреса 0x4006f8. Используя отладчик GDB, мы можем проверить шесть 8-байтовых слов памяти, составляющих таблицу переходов, с помощью команды x/6gx 0x4006f8. GDB выводит следующее:
(GDB) x /6gx 0x4006f8
0x4006f8: 0x000000004005A1 0x00000000004005C3
0x400708: 0x00000000004005A1 0x000000004005AA
0x000000004005A1 0x000000004005AA
Я понимаю, что эта строка 40059a: ff 24 f5 f8 06 40 00 jmpq *0x4006f8(,%rsi,8)
переходит к таблице, но я не знаю, как
1)интерпретировать таблицу переходов [чему соответствует каждый адрес, что означает/удерживает каждое из 6 значений
]
2) провести реинжиниринг, чтобы получить разные варианты оператора switch.
Любая помощь приветствуется, спасибо :)
goto table[rsi-0x3c]
. Тебе этого намека достаточно? - person Jester   schedule 27.05.2021case
- person 0___________   schedule 27.05.2021