Выделение памяти и адресация в сборке

, поэтому вы находитесь внутри цикла for или while. Использование break; выведет вас за пределы цикла. Как и в, это закончится. Продолжать; скажет ей запустить следующую итерацию.

Нет смысла использовать continue в инструкции if, но break; Полезно. В переключателе ... случае, всегда используйте break; для завершения дела, поэтому он не выполняет другого случая.

0
задан D Kar 17 January 2019 в 05:01
поделиться

1 ответ

Q1. sub rsp, 32

Это выделяемое пространство, которое используется для хранения некоторых данных. Хотя он выделяет 32 байта, код использует только первые 16 байтов этого выделенного пространства, qword в [rbp-8] (0: edi) и qword в [rbp-16] (rdi).

Q2. lea rax, [rip + L_.str] и mov rdi, rax

Леа получает адрес строки, хранящейся в сегменте «код». Он перемещен в rdi, который используется в качестве одного из параметров для printf.

Q3. mov dword ptr [rbp - 4], 0 ... mov dword ptr [rbp - 8], edi

В нем хранится 64-разрядное значение с прямым порядком байтов, состоящее из 0: edi в [rbp - 8]. Я не уверен, почему он это делает, так как он никогда не загружается из этого слова позже.

Обычно неоптимизированный код хранит свои аргументы регистра в памяти, где отладочная информация может указывать отладчикам, где их искать и изменять, но неясно, почему clang ноль расширяет argc в edi до 64 бит) .

Скорее всего, 0 dword - это нечто отдельное, потому что, если компилятор действительно хотел хранить расширение с нулем argc, компиляторы будут расширяться с нуля в регистрах с 32-битным mov, как mov ecx, edi ]; mov [rbp-8], rcx. Возможно, этот дополнительный ноль является временным возвращаемым значением, которое он позже решает не использовать из-за явного return 0; вместо неявного падения с конца main? (main особенный, и я думаю, что clang создает внутреннюю временную переменную для возвращаемого значения.)

Q4 mov qword ptr [rbp - 16], rsi ... mov rsi, qword ptr [rbp - 16]

Оптимизация выключена? Он сохраняет rsi, затем загружает rsi из [rbp - 16]. rsi содержит вашу функцию argv arg (== &argv[0]). x86-64 System V ABI передает целочисленные значения / указатели в RDI, RSI, RDX, RCX, R8, R9, затем в стек .

... mov rsi, qword ptr [rsi + 8]

Это загрузка rsi с содержимым argv[1], как 2-й аргумент для printf. (По той же причине, по которой второй аргумент main был в rsi).

Соглашение о вызовах x86-64 System V также является причиной обнуления AL перед вызовом функции varargs без аргументов FP.

Q5. mov dword ptr [rbp - 20], eax

Оптимизация выключена? Он хранит возвращаемое значение из printf, но никогда не использует его.

0
ответ дан Peter Cordes 17 January 2019 в 05:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: