Обмен значений вещественных чисел - 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) ;
}

Объяснение кода листинга программы

  1. Включение файла стандартного ввода/вывода
  2. Определение функции swap, принимающей два аргумента типа double по ссылке
  3. Ассемблерный блок кода, состоящий из следующих инструкций:
    • 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
  4. Определение функции main
  5. Инициализация переменных a и b значением 1.0 и 2.0 соответственно
  6. Вывод значений переменных a и b на экран
  7. Вызов функции swap с передачей в нее переменных a и b по ссылке
  8. Вывод значений переменных a и b на экран после их обмена
  9. Конец программы

Оцени полезность:

6   голосов , оценка 4 из 5
Похожие ответы