#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 соответственно.
Комментариев нет:
Отправить комментарий