Обмен значений вещественных чисел - Assembler
Формулировка задачи:
Добрый вечер, возникла проблема в написании курсовой по теме "Быстрая сортировка с использованием ассемблерной вставки". Подскажите пожалуйста, как в ассемблерной вставке (синтаксис Intel) поменять значения двух вещественных переменных (тип double, например). Пробую использовать стек сопроцессора (FPU), когда подаю в функцию массив из int -- код работает, если подаю double -- молча отказывается менять. С чем это может быть связано и как от этого избавиться? Заранее спасибо.
Это моя функция для быстрой сортировки, проблема в этом месте:
case_1 : fld[esi]; fld[edi]; fstp[esi]; fstp[edi];
template <typename Type> bool quicksortA(vector<Type> &massive, int left, int right) { Type *first = &massive[0]; Type *i = 0; Type *j = 0; Type *l = &massive[left]; Type *r = &massive[right]; int size_type = sizeof(Type); Type *median = &massive[left + (right - left) / 2]; __asm { mov edi, l; mov esi, r; mov edx, size_type; mov ebx, median; start_main_cycle: cmp edi, esi; jge end_main_cycle start_first_cycle : fld[edi]; fld[ebx]; fcompp; fstsw ax; sahf; jc end_first_cycle jz end_first_cycle add edi, edx; jmp start_first_cycle end_first_cycle: start_second_cycle : fld[ebx]; fld[esi]; fcompp; fstsw ax; sahf; jc end_second_cycle jz end_second_cycle sub esi, edx; jmp start_second_cycle end_second_cycle: cmp edi, esi; jle case_1 je case_2 jg endif case_1 : fld[esi]; fld[edi]; fstp[esi]; fstp[edi]; case_2: add edi, edx sub esi, edx endif: jmp start_main_cycle; end_main_cycle: mov i, edi; mov j, esi; } if (i - first < right){ quicksortA(massive, i - first, right); } if (j - first > left){ quicksortA(massive, left, j - first); } return 1; }
Решение задачи: «Обмен значений вещественных чисел»
textual
Листинг программы
#include <stdio.h> void swap(double &a, double &b) { __asm { finit ; fld qword ptr a ; fld qword ptr b ; fstp qword ptr a ; fstp qword ptr b ; } } void main() { double a, b ; a = 1.0 ; b = 2.0 ; printf("a=%f b=%f\n", a, b) ; swap(a, b) ; printf("a=%f b=%f\n", a, b) ; }
Объяснение кода листинга программы
- Включение файла стандартного ввода/вывода
- Определение функции swap, принимающей два аргумента типа double по ссылке
- Ассемблерный блок кода, состоящий из следующих инструкций:
- finit - инициализация числовых моделей процессора
- fld qword ptr a - загрузка значения переменной a в ST(0)
- fld qword ptr b - загрузка значения переменной b в ST(0)
- fstp qword ptr a - сохранение значения ST(0) в переменной a
- fstp qword ptr b - сохранение значения ST(0) в переменной b
- Определение функции main
- Инициализация переменных a и b значением 1.0 и 2.0 соответственно
- Вывод значений переменных a и b на экран
- Вызов функции swap с передачей в нее переменных a и b по ссылке
- Вывод значений переменных a и b на экран после их обмена
- Конец программы