[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):

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"
);
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
__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
}
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:
-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:

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 );
LIBCONTEXT_CALL_CONVENTION devrait a priori valoir __cdecl.

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