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