Я сделал процедуру 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
Я понятия не имею, что не является неправильно с моим кодом, почему он не печатает правильное значение?
Большое спасибо, код работает отлично. Было бы очень сложно узнать это требование printf. – AR89