Я хотел бы знать, может ли кто-нибудь помочь мне с проблемой, с которой я сталкиваюсь при изучении одного из слайдов лекций вводного урока по сборке, который я хожу в школе. У меня проблема не в понимании сборки, а в том, как именно исходный код C упорядочен на основе сборки. Я опубликую фрагмент, о котором я говорю, и, возможно, он будет более понятен, о чем я говорю.
C Источник:
int arith(int x, int y, int z)
{
int t1 = x+y;
int t2 = z+t1;
int t3 = x+4;
int t4 = y * 48;
int t5 = t3 + t4;
int rval = t2 * t5;
return rval;
}
Сборка дана:
arith:
pushl %ebp
movl %esp,%ebp
movl 8(%ebp),%eax
movl 12(%ebp),%edx
leal (%edx,%eax),%ecx
leal (%edx,%edx,2),%edx
sall $4,%edx
addl 16(%ebp),%ecx
leal 4(%edx,%eax),%eax
imull %ecx,%eax
movl %ebp,%esp
popl %ebp
ret
Я просто не понимаю, как я могу различить, например, что добавление z + t1
( z + x + y
) указан во второй строке (в источнике), когда в сборке он идет после y * 48
в коде сборки или, например, что x + 4
- это 3-я строка, когда в сборке она даже не является отдельной строкой, это как бы смешано с последним оператором leal
. Для меня это имеет смысл, когда у меня есть источник, но я должен быть в состоянии воспроизвести источник для теста, и я понимаю, что компилятор оптимизирует вещи, но если у кого-то есть способ подумать о обратном проектировании, который мог бы мне помочь Я был бы очень признателен, если бы они могли провести меня через свой мыслительный процесс.
Спасибо.