1. Calling a euphoria func from asm
- Posted by Alexander Toresson <toressonodakra at swipnet.se> Jul 06, 2004
- 498 views
I've been trying to call a function written in euphoria from some asm code, though I've had little success. I'm first trying to call a func with no arguments, and I'll expand it later. Here's the code:
include machine.e include dll.e include asm.e atom caller, hiproc function HelloWorld(integer a) puts(1, "Hello World!\n") return 0 end function hiproc = call_back(routine_id("HelloWorld")) caller = get_asm("pushad\n" & "call near #" & sprintf("%x", hiproc) & "\n" & "popad\n" & "ret") call(caller) if wait_key() then end if
As far as I know, nothing should be pushed when calling a function which doesn't have any arguments. I've looked up the calling convention and I've not found any info about something that should be pushed in this case. An interesting thing is that if you change "call(caller)" to "call(hiproc)" you'll get the "Hello World" printed, though the program crashes after that. Maybe because of that call() doesn't save any registers? Regards, Alexander Toresson Shhh! Be vewy quiet! I'm hunting wuntime ewwows!
2. Re: Calling a euphoria func from asm
- Posted by Matt Lewis <matthewwalkerlewis at yahoo.com> Jul 06, 2004
- 464 views
Alexander Toresson wrote: > > I've been trying to call a function written in euphoria from some asm > code, though I've had little success. I'm first trying to call a func > with no arguments, and I'll expand it later. Here's the code: <snip> > As far as I know, nothing should be pushed when calling a function which > doesn't have any arguments. I've looked up the calling convention and > I've not found any info about something that should be pushed in this > case. An interesting thing is that if you change "call(caller)" to > "call(hiproc)" you'll get the "Hello World" printed, though the program > crashes after that. Maybe because of that call() doesn't save any > registers? A standard call_back() like you've done results in a stdcall function. This means that the callee will clean up the stack. So what's happening here is that the Eu routine is poping the return address rather than the value passed for the routine's parameter, and the result is a machine crash. I'm not sure why call(caller) doesn't work, but I suspect that the problem is that you're not using an immediate addressing mode (or whatever). I've usually used pointers to routines. I've written a lib that uses asm to call routines by reference. You can get it from: http://www.rapideuphoria.com/fptr.zip I don't claim that it's great asm, but it works. Matt Lewis
3. Re: Calling a euphoria func from asm
- Posted by Al Getz <Xaxo at aol.com> Jul 07, 2004
- 534 views
Hello there, I've modified Matt's original file to provide a stdcall() without having to reverse the params if it's any help. It's a free file included with the WinClass Library, i think it's "stdcall.e". It's a stand alone file so you can use it by itself without using any WinClass stuff. Take care, Al And, good luck with your Euphoria programming! My bumper sticker: "I brake for LED's"