Простое добавление чисел с плавающей запятой одинарной точности в x87 FPU

Я пишу небольшую программу на ассемблере, которая берет два числа одинарной точности с плавающей запятой, складывает их вместе и отображает результат. Однако я хотел бы сохранить результат в регистре для последующего использования. Чтобы помочь мне начать работу, я скомпилировал программу на С++ в программу на ассемблере и попытался отредактировать ее. Однако я не понимаю результатов, которые я получаю, а именно:

    movl    $0x49742408, %eax
    movl    %eax, 20(%esp)
    movl    $0x49f42405, %eax
    movl    %eax, 24(%esp)
    flds    20(%esp)
    fadds   24(%esp)
    fstps   28(%esp)
    flds    28(%esp)
    fstpl   4(%esp)
    movl    $.LC2, (%esp)
    call    printf
    movl    $0, %eax

Во-первых, правильно ли я понимаю, что s означает 32-разрядное, а l означает 64-разрядное? Во-вторых, почему он выталкивает 32-битное значение с плавающей запятой в 28(%esp) только для того, чтобы сохранить его обратно в стек регистров данных? Удаление этих двух строк приводит к менее точному результату, что странно. Наконец, он снова выталкивает стек регистров данных, но на этот раз 64-битное значение. Мне нужно 32-битное значение одинарной точности. Однако изменение l на s приводит к тому, что я получаю 0. Кто-нибудь знает, что именно происходит?


person spurra    schedule 29.11.2013    source источник


Ответы (1)


  1. Да, s — 32-битный (float), l — 64-битный (double).
  2. Конечно, вы не можете просто удалить его, тогда вам придется использовать fstpl 4(%esp). Я предполагаю, что вы смотрите на неоптимизированный код.
  3. printf ожидает аргументы в соответствии с соглашением о вызовах C, поэтому varargs автоматически повышается до double.
person Jester    schedule 29.11.2013
comment
2. Да, он неоптимизирован. Так почему же это делается? 3. Как мне изменить его на поплавок? - person spurra; 29.11.2013
comment
Как я уже сказал, printf обрабатывает только двойные числа в соответствии со стандартом C. Вы можете изменить его на число с плавающей запятой, но тогда вы не сможете использовать printf. - person Jester; 29.11.2013