Что я делаю не так?
Во-первых: убедитесь, что вы используете правильное соглашение о вызовах (стек, регистры, слева направо, справа налево и т. д.). Если ваша программа действительно печатает число с плавающей запятой, хотя это не то, что вам нужно, то, по крайней мере, строка формата передается правильно (или вам очень повезло, и printf
нашел адрес строки формата справа место, даже если вы не указали его адрес).
Второе: число, которое вы пытаетесь напечатать... это число с плавающей запятой или двойное число? rs
определено для хранения значения quadword (64 бита), но числа с плавающей запятой — 32 бита. Итак, если первый пункт был проверен и все в порядке, я предлагаю вам использовать формат "%lf"
вместо "%f"
.
Кстати: почему вы ставите RAX = 0
? Что это значит относительно звонка printf
?
ОБНОВЛЕНИЕ: Это может вам помочь. Разборка дурацкой программы (f.c
):
#include <stdio.h>
main()
{
float x;
x = 1.6;
printf ("%f\n", x);
}
$ gcc -c -S f.c
$ less f.s
.file "f.c"
.section .rodata
.LC1:
.string "%f\n"
.text
.globl main
.type main, @function
main:
.LFB0:
.cfi_startproc
pushq %rbp
.cfi_def_cfa_offset 16
movq %rsp, %rbp
.cfi_offset 6, -16
.cfi_def_cfa_register 6
subq $16, %rsp
movl $0x3fcccccd, %eax
movl %eax, -4(%rbp)
movss -4(%rbp), %xmm0
cvtps2pd %xmm0, %xmm0
movl $.LC1, %eax
movq %rax, %rdi
movl $1, %eax
call printf
leave
person
mcleod_ideafix
schedule
15.12.2013