Unexpected behavior when misusing inline assembly

Noah nesanter at knox.edu
Tue Nov 12 10:22:45 PST 2013


When running the following code:

__gshared void* return_ptr;
__gshared void* injected_fn = &fn;

void main() {
     buffer(7);
     printf("End main\n");
}

void buffer() {
     test(x);
     printf("End buffer\n");
}

void test() {
     printf("This is a test!\n");
     inject();
     printf("End of the test!\n");
}

void fn() {
     printf("Hello, world!\n");
     asm {
         mov RAX, return_ptr;
         mov [RBP+8], RAX;
     }
}

void inject() {
     asm {
         naked;
         push RAX;
         mov RAX, [RBP+8];
         mov return_ptr, RAX;
         mov RAX, injected_fn;
         mov [RBP+8], RAX;
         pop RAX;
         ret;
     }
}

The program behaves as expected, that is, the program prints
This is a test!
End of the test!
Hello, world!
End buffer
End main

However, if I call test directly from main, it results in a 
segfault.
If I call inject directly from main, it works.
And, oddly, if I add any amount of inline assembler to main, and 
call test there, it works.

Could anyone explain to me what's going on?


More information about the Digitalmars-d-learn mailing list