Страницы

Поиск по вопросам

четверг, 9 января 2020 г.

Что означает .LC0: .long в ассемблере?

#c #ассемблер #gcc


Изучаю ассемблерный код одной программы на Си
вот её оригинал

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 что это означает?
    


Ответы

Ответ 1



Сумма 2.4+6.3 вычислена во время компиляции и сохранена (думаю, что в .rodata) по метке .LC0 в виде IEEE754 64-bit double. Вторая и третья команда пересылают её из константы в переменную (потому что прямого MOVSD память-память не бывает). В интеловом синтаксисе это movsd xmm0, QWORD PTR .LC0[rip] и movsd QWORD PTR flt_1[rip], xmm0 соответственно.

Комментариев нет:

Отправить комментарий