NASM - The Netwide Assembler
NASM Forum => Programming with NASM => Topic started by: markallyn on March 03, 2017, 02:39:05 PM
-
Hello everyone,
I would like to call the C Math Library functions from NASM, for example, calling the log function from NASM. I declare log as an extern function, but how do I pass parameters to the log function prior to the call? And in what register does the result get returned? The C function signature is log(double) and returns a C double.
Of course I could resort to the FPU to do the work, but that requires 5 or 6 assembly instructions to compute a natural log whereas going to the C math library may be fewer lines (if I could figure out how to do it).
I've looked all over the internet for answers to this, but to no avail.
Thanks,
Mark Allyn
-
Hi Mark,
At least in Linux using 64 bit NASM you can call the log function from C
math lib passing the argument in RDI and getting the result in RAX:
; double asm64_C_log(double)
;
; calculate the (natural) logarithm of op
;
; in:
;
; rdi: op
;
; returns:
;
; rax: log(op)
global asm64_C_log
extern log
asm64_C_log:
call log
ret
If you call this function from C you'll get the same result as calling log
in C.
Jordi
-
OP should be more specific on things like 1) Platform (win or linux) 2) architecture (32 or 64-bit) in order to get instant help from members.
Assuming it for Win64, calling LOG from C should be something like this;
global main
extern printf
extern log
section .data
s db '%f',0
x dq 2.7
section .code
main:
sub rsp,0x28 ;align stack and shadow space
movq xmm0,[x] ;argument in XMM0
call log ;return to XMM0
movq rdx,xmm0
mov rcx,s
mov rax,0
call printf
add rsp,0x28
ret
Also applies to calling any other routines from C math.
-
Hello Stressful,
You're right about my not being sufficiently specific. As a matter of fact, I'm running 32 bit linux and compiling therefore an elf32 file, not win64. Apologies are in order.
As a matter of fact, I later worked out how to do what I wanted to achieve. Here is the solution for the call to the libm log function:
;math.s. A NASM program that calls several functions in the C math library <math.h>
SEGMENT .data
input dq 25.0
SEGMENT .bss
double resq 1
SEGMENT .text
global _start
extern log
extern sqrt
_start:
nop
finit
fld qword [input]
fstp qword [double]
lea esi, [double]
sub esp, 8
lea edi, [esp]
mov ecx, 8
rep movsb
call log
fstp qword [esp]
add esp, 4
mov eax, 1
mov ebx, 0
int 0x80
There are probably a half dozen better solutions, but this has the virtue of my being able to understand what's happening.
Regards,
Mark Allyn