Ben voilà, tout est dans le titre. J'ai une fonction qui marche en mode debug, pas en mode release. La voilà:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
 
if (TEST() == 0x12345678) MessageBox(NULL, "Erreur", "", MB_OK);
 
unsigned long TEST(void) {
  unsigned long a;
 
  a = 0x12345678;
  _asm {
    mov a,esi
  }
 
  return a;
}
En fait, lorsqu'on regarde le code assembleur généré, le compilateur fait comme si ebp et esp étaient égaux (ce qui n'est pas le cas):

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
push esi
push ecx
mov [esp], 0x12345678
mov [ebp+0x00],esi
mov eax,[esp]
pop edx
pop esi
ret
Il semblerait donc que ce soit un problème de convention d'appel. Mais j'ai essayé de la déclarer en pascal, stdcall, cdecl, etc... Rien n'y fait. Quelqu'un aurait-il une idée ?