Я пишу небольшую программу на ассемблере, которая берет два числа одинарной точности с плавающей запятой, складывает их вместе и отображает результат. Однако я хотел бы сохранить результат в регистре для последующего использования. Чтобы помочь мне начать работу, я скомпилировал программу на С++ в программу на ассемблере и попытался отредактировать ее. Однако я не понимаю результатов, которые я получаю, а именно:
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. Кто-нибудь знает, что именно происходит?