Реализация ассемблерной вставки [закрыт]

117
11 июня 2019, 16:30

Найти сумму положительных элементов массива A = {a [i]}, что удовлетворяют условию: b <= a [i] <= d. Написал код но не могу понять почему оно не работает :

#include "pch.h"
#include <iostream>
#include <Windows.h>
using namespace std;
int main() {
    SetConsoleOutputCP(1251);
    const int N = 10;
    float a[N], s = 0, b = 4, c = 15;
    cout << "Введіть елементи масива: " << endl;
    for (int i = 0; i < N; i++)
        cin >> a[i];
    _asm {
        mov ecx, N; внесення кылькості ітерацій цикла
        lea ebx, a; внесення в ebx адреса масива а
        m1 : ; мітка циклу
             finit; очищення регістрів співпроцесора
             fld dword ptr[ebx]; внесення вибраного елемента масива в st(0)
             fcom b;
        jl m2;
        fcom c;
        jg m2;
             ftst; порівняння даного елемента з 0
             fstsw AX; збереження значень регістра SR в ax
             sahf; завантаження флагів SF, ZF, AF, PF, CF
             JPE m2; перехід по мітці якщо число вище або дорівнює 0
                 fld s; st(1) = s
             fld dword ptr[ebx]; внесення вибраного елемента масива в st(0)
             fadd st(0), st(1);
            fst s; s = st(0)
            m2:; мітка переходу
            add ebx, 4; перехід до наступного елемента масива
            loop m1; цикл
    }
    float S = 0;
    for (int i = 0; i < N; i++) {
        if (a[i] > 0) { S = S + a[i]; }
    }
    cout << "Добуток  усіх додатних елементів масиву, обрахована за допомогою FPU: " << s << endl;
    cout << "Добуток  усіх додатних елементів масиву, обрахована за допомогою C++: " << S << endl;
    system("pause");
}

Подскажите пожалуйста как сделать чтобы оно работало .

Answer 1
__asm {
    lea ebx, a - 4
    mov ecx, N
    fldz 
    fld b 
    fld c
L1: fld dword ptr[4 * ecx + ebx]
    fcomi st(0), st(2)
    jb L2
    fcomi st(0), st(1)
    ja L2
    fadd st(3), st(0)
L2: fstp st(0)
    loop L1
    fstp st(0)
    fstp st(0)
    fstp s
}
READ ALSO
Стандартная консоль в CLion

Стандартная консоль в CLion

Как сделать запуск программы из CLion в стандартную консоль OS, а не в встроенную в CLion?

139
Как использовать общую память для двух процессов С линукс

Как использовать общую память для двух процессов С линукс

Нужно сделать общим для нескольких процессов массив структурРешил сделать так: один из процессов выделяет общий блок памяти с помощью shmget,...

152
Как переводится instantiation?

Как переводится instantiation?

Видел множество вариантов: инстанциация, инстанцирование, инстанцианирование и тп

158
Java Spring соединение из докер-контейнера с БД

Java Spring соединение из докер-контейнера с БД

Хочу запустить свой сервис, написанный на спринге, в докер-контейнереСервис работает с RethinkDB, который уже запущен в контейнере

108