Сегодня, разбирая некоторые бинарники, которые я собрал ранее (clang x86_64), я наткнулся на кое-что [на первый взгляд] бесполезное.
_baz: ## @baz
.cfi_startproc
## BB#0:
pushq %rax ; What?
Ltmp7:
.cfi_def_cfa_offset 16
leaq (%rsp), %rax
movq %rsi, (%rax)
xorl %edx, %edx
movq %rax, %rsi
callq _something
movq %rax, %rdi
callq _something_else
movl (%rax), %eax
popq %rcx ; What?
retq
.cfi_endproc
Я вижу, что rax
сохраняется, а затем восстанавливается в rcx
, и я не вижу смысла делать это, так как rax
— это рабочий регистр (который, кажется, не нуждается в сохранении здесь), а rcx
(еще один рабочий регистр, также для 4-й аргумент, переданный регистром), кажется, здесь никогда не используется.
eax
, предположительно, чтобы вернуть его, поэтому залезть туда было бы плохо. Хотя он мог бы использоватьrcx
оба раза - person harold   schedule 19.08.2017rsp
был выровнен перед вызовом, т. е. он смещен на +-8 в начале из-за обратного адреса и нуждается в исправлении, если будут выполняться дальнейшие вызовы. - person Ped7g   schedule 20.08.2017push
кажется лучше, чем арифметика RSP на процессорах Intel, которые имеют специальную аппаратную поддержку для оптимизации использования стека. stackoverflow.com/a/37774474/597607 - person Bo Persson   schedule 20.08.2017#
— это символ комментария в синтаксисе x86 GAS (даже в режиме-masm=intel
).;
работает так же, как и в C, разделяя инструкции/директивы, даже если они находятся в одной строке. - person Peter Cordes   schedule 21.08.2017