2015-05-25 3 views
3

Я сделал процедуру nasm, которая вычисляет эвклидовое расстояние между двумя векторами определенного размера. Эта функция nasm вызывается из файла C, который получает результат функции. Я тестировал, и он работает, возвращаемое значение верное, я могу распечатать его при любой проблеме. Моя проблема в том, когда я пытаюсь напечатать результат внутри файла nasm. Это код NASM:Nasm, не печатая правильное значение

extern printf 

%macro print_dist2 1 

section .data 
.str db %1,0     ; %1 is macro call first actual parameter 
section .text 

push dword [dist] 
push dword .str 
push dword fmt2 
call printf 
add esp, 12      ; pop stack 3 * 4 bytes 

%endmacro 




section .data   

dist: dd 258      

fmt2: db "%s, dist: %g",10,0  ; format string for printf 

section .bss    


section .text   

global distanza 

x equ 8 
y equ 12 
dim equ 16 
ris equ 20 


distanza: 
    ; ------------------------------------------------------------ 
    ; Function entrance sequence 
    ; ------------------------------------------------------------ 
    push ebp  
    mov ebp, esp  
    push ebx  
    push esi 
    push edi 
    ; ------------------------------------------------------------ 
    ; read the parameters from the current stack frame 
    ; ------------------------------------------------------------ 



    mov eax, [ebp+x] ; address of x 
    mov ebx, [ebp+y] ; address of y 
    mov ecx, [ebp+dim] ; size of the vectors (it's the same) 
. 
. 
. omitted calculations. 
. 

    sqrtss xmm1, xmm1 
    movss [dist], xmm1 ; move the result to dist 
    fld  dword [dist] ; mov in st0, that will be used by the C file 

    print_dist2 "distanza" 

    ; ------------------------------------------------------------ 
    ; Function exit sequence 
    ; ------------------------------------------------------------ 

    pop edi  
    pop esi 
    pop ebx 
    mov esp, ebp  
    pop ebp  
    ret   

Это файл C:

float a[] = {6.1f, 9.5f, 12.6f}; 
float b[] = {25.1f, 34.1f, 9.6f}; 
dim = 3; 

float dist = distanza(a, b, dim); 

printf("d(x,y) = %f\n", dist); 

Это выход:

distanza, dist: 5.46877e-315 
d(x,y) = 31.227551 

: C, код печати правильное значение, то NASM не делает. Если изменить формат строки кода NASM:

fmt2: db "%s, dist: %f",10,0 

Я использовал% F вместо% г, выход NASM это один:

distanza, dist: 0.000000 

Я понятия не имею, что не является неправильно с моим кодом, почему он не печатает правильное значение?

ответ

3

Ваш dist является одним 32-битным поплавком, но printf нуждается в двойном 64-битном поплавке. Его необходимо преобразовать:

%macro print_dist2 1 

section .data 
.str db %1,0     ; %1 is macro call first actual parameter 
section .text 

sub esp, 8      ; Space for a 64-bit double floating point number 
fld dword [dist]    ; Load a 32-bit single floating point number 
fstp qword [esp]    ; Store it as 64-bit floating point number 
push dword .str 
push dword fmt2 
call printf 
add esp, 16      ; pop stack 4 * 4 bytes 

%endmacro 
+0

Большое спасибо, код работает отлично. Было бы очень сложно узнать это требование printf. – AR89

Смежные вопросы