, поэтому вы находитесь внутри цикла for или while. Использование break; выведет вас за пределы цикла. Как и в, это закончится. Продолжать; скажет ей запустить следующую итерацию.
Нет смысла использовать continue в инструкции if, но break; Полезно. В переключателе ... случае, всегда используйте break; для завершения дела, поэтому он не выполняет другого случая.
Q1. sub rsp, 32
blockquote>Это выделяемое пространство, которое используется для хранения некоторых данных. Хотя он выделяет 32 байта, код использует только первые 16 байтов этого выделенного пространства, qword в [rbp-8] (0: edi) и qword в [rbp-16] (rdi).
Q2. lea rax, [rip + L_.str] и mov rdi, rax
blockquote>Леа получает адрес строки, хранящейся в сегменте «код». Он перемещен в rdi, который используется в качестве одного из параметров для printf.
Q3. mov dword ptr [rbp - 4], 0 ... mov dword ptr [rbp - 8], edi
blockquote>В нем хранится 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]
blockquote>Оптимизация выключена? Он сохраняет 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]
blockquote>Это загрузка rsi с содержимым
argv[1]
, как 2-й аргумент дляprintf
. (По той же причине, по которой второй аргумент main был в rsi).Соглашение о вызовах x86-64 System V также является причиной обнуления AL перед вызовом функции varargs без аргументов FP.
Q5. mov dword ptr [rbp - 20], eax
blockquote>Оптимизация выключена? Он хранит возвращаемое значение из printf, но никогда не использует его.