Помехи при компиляции кода ассемблера C ++ — исполнение изменено

Я пишу некоторый код на ассемблере и использую его в коде c ++ / g ++, работающем под linux-64bit (gcc версия 4.4.1 [gcc-4_4-branch revision 150839] (SUSE Linux)). Ассемблерный код выполняется без ошибок, но окружающий код c ++ дает разные результаты (без сбоев, только в 4 раза медленнее и немного другой результат вычислений), в зависимости от реализации / пропуска ассемблерного кода (то есть уменьшенного фрагмента кода).

Я удалил все лишнее, и фрагмент кода ниже — это все, что реализовано прямо сейчас. Только push и pops и хранение xmmx, не более того. КСТАТИ. если я только сохраню и восстановлю xmmx во фрагменте, без push / pop’ов rbx, rsi, rdi, rbp, то код c ++ снова работает нормально. Соглашение о вызовах требует, чтобы rbx, rdi, rsi и rbp оставались неизменными, поэтому они сохраняются. Если я добавлю другие регистры (rax, rcx, rdx, … с дополнительным нажатием & pops), результат тот же — код c ++ больше не работает должным образом. К сожалению, мне нужны эти регистры в (здесь: опущен) ассемблерном коде.

Отладка сборки вокруг реализованного фрагмента кода не показала очевидной причины. Предположим, что в целом это код, скомпилированный по-разному, но не такой простой для сравнения (Полный код состоит из нескольких десятков тысяч строк). Должно быть, я упускаю что-то очевидное или должен что-то учитывать при компиляции.

Какие-либо предложения ? Спасибо

extern "C" void store_xmmx();
extern "C" void restore_xmmx();
//
void xmmx_manipulation_cpp_not_working()
{
// cpp-Code before Assembly, same as in working function
//
store_xmmx();
// assembly code here, but removed from source for debugging
// cpp still executes differently with simple pushes and pops
restore_xmmx();
//
// cpp-Code after Assembly, same as in working function
};
void xmmx_manipulation_cpp_working()
{
// cpp-Code before Assembly, same as in not working function
//
// store_xmmx();
// assembly code
// restore_xmmx();
//
// cpp-Code after Assembly, same as in not working function
};
//
//Assembly Code:
//
align 16
global store_xmmx
store_xmmx:
pop  r8
push rbp
push rsi
push rdi
push rbx
sub     rsp,200h
fxsave  [rsp]
push r8
ret
align 16
global restore_xmmx
restore_xmmx:
pop  r8
fxrstor [rsp]
fwait
add  rsp,200h
pop  rbx
pop  rdi
pop  rsi
pop  rbp
push r8
ret

1

Решение

Задача ещё не решена.

Другие решения


По вопросам рекламы ammmcru@yandex.ru
Adblock
detector