[Mono-list] Assembly code execution from C#
Markus Johnsson
markus.johnsson.84 at gmail.com
Tue Oct 7 02:25:46 EDT 2008
Hi Rodrigo,
Thank you for a helpful answer. Will explore further later this week.
Markus
2008/10/7 Rodrigo Kumpera <kumpera at gmail.com>
> 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 <
> markus.johnsson.84 at gmail.com> 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 - Mono-list at lists.ximian.com
>> http://lists.ximian.com/mailman/listinfo/mono-list
>>
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.ximian.com/pipermail/mono-list/attachments/20081007/9dc7dc35/attachment.html
More information about the Mono-list
mailing list