[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