Hi Markus, Your code works by pure luck as it doesn't respect the ABI of neither platforms.
If you really want to follow this path, make sure you first undestand the ABI used by your platform and generate code that follows it. For example, your code uses ebx, a callee saved reg, without saving it at prologue and restoring at epilogue. You can start by taking a look at the wikipedia entry http://en.wikipedia.org/wiki/Application_binary_interface and then dig further in the calling convention part of it - this is specially important for windows. Good luck, Rodrigo On Mon, Oct 6, 2008 at 6:59 PM, Markus Johnsson < [EMAIL PROTECTED]> wrote: > Hi, > > I've been experimenting with x86 assembly coding and execution from within > C#, and was happy to get some code (see below) to work. However, when I > tried it on Windows and .NET it failed with an AccessViolationException. > Should I expect it to fail on mono too in a future release? Is there a > better way to do this (i.e. executing x86 code without using a C > library)? Using mono the code below compiles and runs fine on both Windows > (mono 2.0) and Linux (mono svn). > > cheers > Markus > > > using System; > using System.Text; > using System.Runtime.InteropServices; > > class X86AssemblyExec { > [UnmanagedFunctionPointer(CallingConvention.Cdecl)] > private delegate int TheDelegate(); > > public static void Main(string[] args) { > // x86 assembly: > // mov eax 8 B8 08 00 00 00 > // mov ebx 9 BB 09 00 00 00 > // add eax ebx 01 d8 > // ret C3 > > // opcode > byte [] code = new byte[14]; > code[0] = (byte) 0xB8; > code[1] = (byte) 0x08; > code[2] = (byte) 0x00; > code[3] = (byte) 0x00; > code[4] = (byte) 0x00; > > code[5] = (byte) 0xBB; > code[6] = (byte) 0x09; > code[7] = (byte) 0x00; > code[8] = (byte) 0x00; > code[9] = (byte) 0x00; > > code[10] = (byte)0x01; > code[11] = (byte)0xd8; > > code[12] = (byte)0xC3; > > code[13] = 0; > > unsafe { > fixed (void *ptr = code) { > > // create the delegate > TheDelegate del = (TheDelegate) > Marshal.GetDelegateForFunctionPointer( > new IntPtr(ptr), typeof(TheDelegate)); > > // call the function > int x = del(); > > // outputs 17 > Console.WriteLine(x); > } > } > } > } > > > _______________________________________________ > Mono-list maillist - [email protected] > http://lists.ximian.com/mailman/listinfo/mono-list > >
_______________________________________________ Mono-list maillist - [email protected] http://lists.ximian.com/mailman/listinfo/mono-list
