Я читал по следующей серии статей: http://www.altdevblogaday.com/2011/11/09/a-low-level-curriculum-for-c-and-cOSX 64 бит C++ РАЗБОРКОЙ построчно
разобранном код, показанный и разобрали код, я умея производить во время работы один и тот же код меняться весьма значительно, и я не хватает понимания, чтобы объяснить различия.
Есть ли кто-нибудь, кто может пройти через него по строкам и, возможно, объяснить, что он делает на каждом шагу? Я получаю чувство от поиска вокруг, я сделал, что первые несколько строк имеют какое-то отношение к указателям на кадры, в моем дизассемблированном коде также есть несколько лишних строк, которые гарантируют, что регистры пустые, прежде чем помещать в них новые значения (отсутствует из кода в статье)
Я запускаю это на OSX (оригинальный автор использует Windows), используя компилятор g ++ из XCode 4. Я действительно не знаю, как погода или нет, эти отклонения связаны с ОС, (возможно, 32 бит или 64 бит) или сам компилятор. Это может быть даже код, который я предполагаю - мой обернут внутри объявления основной функции, тогда как исходный код не упоминает об этом.
Мой код:
int main(int argc, const char * argv[])
{
int x = 1;
int y = 2;
int z = 0;
z = x + y;
}
Мой разобранном код:
0x100000f40: pushq %rbp
0x100000f41: movq %rsp, %rbp
0x100000f44: movl $0, %eax
0x100000f49: movl %edi, -4(%rbp)
0x100000f4c: movq %rsi, -16(%rbp)
0x100000f50: movl $1, -20(%rbp)
0x100000f57: movl $2, -24(%rbp)
0x100000f5e: movl $0, -28(%rbp)
0x100000f65: movl -20(%rbp), %edi
0x100000f68: addl -24(%rbp), %edi
0x100000f6b: movl %edi, -28(%rbp)
0x100000f6e: popq %rbp
0x100000f6f: ret
разобранном код из оригинальной статьи:
mov dword ptr [ebp-8],1
mov dword ptr [ebp-14h],2
mov dword ptr [ebp-20h],0
mov eax, dword ptr [ebp-8]
add eax, dword ptr [ebp-14h]
mov dword ptr [ebp-20h],eax
Полная линия пробоем линии будет очень поучительно но любая помощь в понимании этого будет оценена по достоинству.
Спасибо за это - определенно прояснили некоторые вещи, которые я не понял! Тот факт, что это другой синтаксис, в целом объясняет многое, а также вашу точку зрения на разные смещения. – GeoffK
Оригинальная статья кажется хорошо. На x86 «argc» и «argv» будут нажаты вызывающим и, следовательно, будут иметь * положительные * смещения относительно «ebp» (ebp + 0 - старый BP, ebp + 4 - обратный адрес, ebp + 8 - первый аргумент ...). В x86_64 OSX первые два аргумента передаются в 'rdi' (' edi' в этом случае, потому что это int) и 'rsi'. Похоже, что он был скомпилирован с '-O0', поэтому аргументы немедленно сохраняются в стеке. –
Извините за то, что вы не поняли это, но как бы включить эти оптимизации? Было бы неплохо запустить его с/без и сравнить – GeoffK