Страницы

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

пятница, 7 июня 2019 г.

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

Изучаю ассемблерный код одной программы на Си вот её оригинал
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 что это означает?


Ответ

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

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

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