Почему эта простая программа выводит так много персонажей?

StackOverflow https://stackoverflow.com/questions/3693692

  •  02-10-2019
  •  | 
  •  

Вопрос

Вот мой короткая Сборка программы:

; This code has been generated by the 7Basic
; compiler <http://launchpad.net/7basic>

extern printf

; Initialized data

      SECTION .data
f_0 dd 5.5
printf_f: db "%f",10,0

      SECTION .text

; Code

global main
  main:
push ebp
mov ebp,esp

push dword [f_0]
push printf_f
call printf
add esp,8

mov esp,ebp
pop ebp
mov eax,0
ret

Что такое программа предполагаемый Для этого печатается 5,5, но он печатает:

-4101885043414705786563701568963176764603483495211119243453355953219830430011006780068899468997203661787555969981250050126586203424320244681571103387315766489883301796219461838644670607029711305942610787622864198879363376953745160639821663444829839767678538571371627347101810056161000273217639447052410683392.000000

Что на земле я делаю не так? Код нажимает два аргумента printf() А потом называть это. Ничего сложного.


Обновлять: Я немного преждевременно думал, что я исправил это. Я обновил код.

Это было полезно?

Решение

Инструкция 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]

редактировать

Вам необходимо нажать на 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 и сохраняет его в стеке.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top