[Ce post a été édité tel quel sur le forum Visual Studio, mais n'ayant reçu aucune réponse, je le poste ici...]
Bonjour,
je suis en train de compiler KiCAD (http://kicad-pcb.org/) sous Visual Studio 2015 (je sais, normalement il est préférable de passer par MingW).
J'ai utilisé CMake, etc.
J'y suis presque sauf qu'une partie est en assembleur et il n'est pas prévu de code pour VS. Le code en question est le suivant au standard assembleur AT&T (originalement pour gcc et x86):
que j'ai traduit en assembleur 'Visual" qui n'accepte que le standard INTEL:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59 __asm ( ".text\n" ".p2align 4,,15\n" ".globl _jump_fcontext\n" ".def _jump_fcontext; .scl 2; .type 32; .endef\n" "_jump_fcontext:\n" " mov 0x10(%esp),%ecx\n" " push %ebp\n" " push %ebx\n" " push %esi\n" " push %edi\n" " mov %fs:0x18,%edx\n" " mov (%edx),%eax\n" " push %eax\n" " mov 0x4(%edx),%eax\n" " push %eax\n" " mov 0x8(%edx),%eax\n" " push %eax\n" " mov 0xe0c(%edx),%eax\n" " push %eax\n" " mov 0x10(%edx),%eax\n" " push %eax\n" " lea -0x8(%esp),%esp\n" " test %ecx,%ecx\n" " je nxt1\n" " stmxcsr (%esp)\n" " fnstcw 0x4(%esp)\n" "nxt1:\n" " mov 0x30(%esp),%eax\n" " mov %esp,(%eax)\n" " mov 0x34(%esp),%edx\n" " mov 0x38(%esp),%eax\n" " mov %edx,%esp\n" " test %ecx,%ecx\n" " je nxt2\n" " ldmxcsr (%esp)\n" " fldcw 0x4(%esp)\n" "nxt2:\n" " lea 0x8(%esp),%esp\n" " mov %fs:0x18,%edx\n" " pop %ecx\n" " mov %ecx,0x10(%edx)\n" " pop %ecx\n" " mov %ecx,0xe0c(%edx)\n" " pop %ecx\n" " mov %ecx,0x8(%edx)\n" " pop %ecx\n" " mov %ecx,0x4(%edx)\n" " pop %ecx\n" " mov %ecx,(%edx)\n" " pop %edi\n" " pop %esi\n" " pop %ebx\n" " pop %ebp\n" " pop %edx\n" " mov %eax,0x4(%esp)\n" " jmp *%edx\n" );
Mais n'étant pas du tout expert d'assembleur "moderne" (j'ai pratiqué du 6502 et du 68000 il y a longtemps, très longtemps, probablement dans une galaxie lointaine...) j'ai quelques questions:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41 __asm { mov eax, [0x4 + esp] lea eax, [eax - 0x8] and eax, 0xfffffff0 lea eax, [eax - 0x3c] mov ecx, [esp + 0x4] mov[0x14 + eax], ecx mov edx, [0x8 + esp] neg edx lea ecx, [ecx + edx * 1] mov[0x10 + eax], ecx mov[0xc + eax], ecx mov ecx, [0xc + esp] mov[0x2c + eax], ecx stmxcsr[eax] fnstcw[0x4 + eax] mov ecx, finish mov[0x30 + eax], ecx mov ecx, fs:0x0 walk : mov edx, [ecx] inc edx je found dec edx xchg ecx, edx jmp walk found : mov ecx, [0x4 + ecx] mov[0x3c + eax], ecx mov ecx, 0xffffffff mov[0x38 + eax], ecx lea ecx, [0x38 + eax] mov[0x18 + eax], ecx ret finish : xor eax, eax mov[esp], eax call _exit hlt }
-Visual n'accepte pas de directive __asm isolée, il est nécessaire de l'inclure dans le corps d'une fonction. J'ai d'ailleurs le prototype de ladite fonction dans le *.h correspondant:
où LIBCONTEXT_CALL_CONVENTION devrait a priori valoir __cdecl.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 intptr_t LIBCONTEXT_CALL_CONVENTION jump_fcontext( fcontext_t* ofc, fcontext_t nfc, intptr_t vp, bool preserve_fpu = true );
Je sais qu'il y a aussi la possibilité d'écrire ce code directement dans un fichier *.asm, mais il faut "décorer" la fonction avec un header, et d'autres paramètres dont je ne suis pas sûr de bien maîtriser.
Quelqu'un pourrait-il me dire comment faire?
Merci d'avance. G13
Partager