Моя программа Windows, скомпилированная с использованием Visual Studio 2017, выполняет следующие действия:
- вызывает подпрограмму с аргументом по умолчанию со значением 35.05.
- инициализирует виртуальную машину Java через Cinterface
- снова вызывает процедуру, которая имеет аргумент по умолчанию со значением 35.05.
При первом вызове аргумент по умолчанию получает правильное значение 35.05.Во втором вызове это значение является мусором.
Я посмотрел на сгенерированную сборку и во время первого вызова с аргументом по умолчанию 35.05 копируется в xmm8
из ячейки памяти и копируется в стек (это5-й параметр) и выполняется вызов:
0033d 48 8b 01 mov rax, QWORD PTR [rcx]
00340 41 b8 14 00 00
00 mov r8d, 20 // a default argument
00346 f3 44 0f 10 05
00 00 00 00 movss xmm8, DWORD PTR __real@420c3333 // this is 35.05
0034f f3 44 0f 11 44
24 28 movss DWORD PTR [rsp+40], xmm8
00356 48 c7 44 24 20
1e 00 00 00 mov QWORD PTR [rsp+32], 30 // a default argument
0035f 45 8d 48 05 lea r9d, QWORD PTR [r8+5]
00363 b2 0f mov dl, 15 // a default argument
00365 ff 90 08 01 00
00 call QWORD PTR [rax+264]
Затем выполняется вызов для инициализации JVM.
Затем для следующего вызова снова используется xmm8
для копирования значенияв стек:
00ce8 48 8b 01 mov rax, QWORD PTR [rcx]
00ceb 41 b8 14 00 00
00 mov r8d, 20
00cf1 f3 44 0f 11 44
24 28 movss DWORD PTR [rsp+40], xmm8
00cf8 48 c7 44 24 20
1e 00 00 00 mov QWORD PTR [rsp+32], 30
00d01 45 8d 48 05 lea r9d, QWORD PTR [r8+5]
00d05 b2 0f mov dl, 15
00d07 ff 90 08 01 00
00 call QWORD PTR [rax+264]
Но теперь xmm8
перезаписано.
Если я отключу вызов для инициализации JVM, то значение будет сохранено.
Вопрос в том, кто здесь не прав?JVM не сохраняет значение, или компилятор Microsoft ошибочно полагает, что значение xmm8
будет сохранено.