Инструкция push f_0
помещает в стек адрес f_0, а не 5,5 в памяти, поэтому процедура printf возьмет адрес плюс сохраненный ebp (следующие 4 байта в стеке) и интерпретирует биты.как двойной и распечатать его.Как видите, это очень большое число.
Вам нужно загрузить 8 байтов из f_0
и нажать их.что-то вроде
move eax, f_0
push dword ptr [eax+4]
push dword ptr [eax]
edit
Вам нужно нажать 8 байтов, так как значения fp64 равны 8 байтов.fp64 - это все, что printf знает, как печатать. Фактически, fp64 - это все, что C знает, как передавать функции или работать с ними.Значение fp32 может быть загружено только из памяти и сохранено в памяти, но всегда неявно преобразуется в fp64 (или больше) перед использованием.Если вы хотите загрузить значение fp32, преобразовать его в fp64 и поместить его в стек, вы можете использовать
fld dword ptr [f_0]
sub esp, 8
fstp qword ptr [esp]
Это фактически загружает значение fp32 и преобразует его в fp80 (внутренний формат x87),затем преобразует это значение fp80 в fp64 и сохраняет его в стеке.