На этот вопрос я пытался найти ответ на stackoverflow , но внятного ответа не получил. Изучаю ассемблерный код одной программы на Си вот её кусок i3 = 1 + 2; flt_1 = 2.4 + 6.3; i2 = 5; А в ассемблере это выглядит таким образом: movl $3, i3(%rip) movsd .LC0(%rip), %xmm0 movsd %xmm0, flt_1(%rip) movl $5, i2(%rip) Понимаю,что это AT&T синтаксис и вижу регистры для чисел с плавающей точкой. Но не понимаю, почему у переменной стоит в скобках регистр.Просто это похоже на аналогию смещения -16(%rbp).Так ли это? Не понимаю, почему вдруг появилась метка с всё теми же скобками, если перейти по ней , видно следующее: .LC0: .long 1717986918 .long 1075930726 .align 8 Что это означает ? И ещё один вопрос:EDX:EAX что это означает? Ещё один вопрос возник: Не могу понять,что будет делать эта команда leal (%rax,%rdx),%ecx К чему эти скобки,что происходит внутри них.Похоже ли это на ivector4[ i ] = i*2; , ассемблерный код которого выглядит так ivector4(%eax,%eax)? В чём суть той команды lea со скобками и самих этих скобок в lea и ivector ?
.LC0 очевидно метка для адресации относительно rip, .long это DWORD, то же самое что dd 1717986918. Сишные типы в ассемблере, кому-то такое в голову пришло. Почему здесь метка и rip:
leal (%rax,%rdx),%ecx = lea ecx,[eax+edx] ivector4(%eax,%eax) lea <>,[eax + eax], аналог lea <>,[eax*2] Это по-моему не совсем ассемблер, а описание конкретных форматов инструкций тупо макросами или что там у них.