Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.63/8: Рейтинг темы: голосов - 8, средняя оценка - 4.63
0 / 0 / 2
Регистрация: 25.05.2016
Сообщений: 20

Обработка массива через _asm

28.12.2016, 14:10. Показов 1602. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть задача: создать массив и найти произведение квадратов всех отрицательных чисел в массиве, при условии что а[i]<=c. Вся прелесть в том, что обработка вводимых элементов должна вестись в _asm вставке, такие дела. Кода на текущую задачу нет (лично свою задачу понять не могу) зато есть код на задание найти последние L элементов массива (чуть понятнее), но к сожалению все равно не рабочий. Прошу помочь с тем что есть, и по возможности помочь с основной задачей. Собсно, код
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
#include "stdafx.h"
#include <iostream> 
 
using namespace std;
 
int main()
{
    setlocale(LC_ALL, "Russian");
 
    int P;//добуток 
    const int N = 5;//кол-во элементов в массиве 
    int A[N];//массив 
    int L;//кол-во последних элементов 
    try {
        cout << "Введите элемент ["<<i<<"]: ";
        if (!(cin >> A[i]) || cin.fail() || sizeof(A[i]) > sizeof(int))//проверка на кооректность ввода и допустимость значения 
            throw 1; //генериуем исключение 
    
    cout << "Введите L:";
    if (!(cin >> L) || cin.fail())//проверка на кооректность ввода 
        throw 1;
}
 
catch (int)
{
    cout << "Error!" << endl;
    system("pause");
    exit(2);
}
 
_asm {
    finit
        lea EAX, A;
    add EAX, 16;
    mov EBX, 1;
    mov ECX, L;
label1:
    mov EDX, [EAX]
        cmp EDX, 0;
    jge label2;
    add EDX, EDX
        label2 :
    sub EAX, 4;
    loop label1
        mov P, EBX;
}
for (int i = 0; i < N; i++)
    cout << A[i] << " ";//вывод элементов массива 
 
cout << "\nСумма останніх L елементів = " << P << endl;
 
system("pause");
}
Добавлено через 15 часов 14 минут
Чутка переработал старый код, и вроде бы работает. Помощь товарищу это, конечно, хорошо, но самому без кода оставаться не весело. Можете, помочь пожалуйста?
Код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#include "stdafx.h"
#include<iostream> 
#include<Windows.h> 
using namespace std;
int main() {
    system("chcp 1251");
    const long N = 10;//размер массива 
    long a[N], D = 0, L, c[N], k = 0;
    for (int i = 0; i < N; i++) {//заполнение массива 
        cout << "a[" << i + 1 << "]=";
        cin >> a[i];
    }
    cout << "Введите L: ";
    cin >> L;
    for (int i = 0; i < L; i++) {
        c[i] = a[N - L + i];
        cout << c[i] << endl;
    }
    long n = L;
    _asm {
        mov ECX, n;
        lea EBX, c;
    m1:;
        finit;
        fld dword ptr[EBX];
        fcom k;
        fstsw AX;
        sahf;
        jb m2;
        fld dword ptr[EBX];
        fadd D;
        fstp D;
    m2:;//метка m2 
        add EBX, 4;
        loop m1;//цикл 
    }
    cout << "Сумма последних положительных елементов массива " << " = " << D << endl;//вывод результата 
    system("pause");//задержка екрана 
    return 0;
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
28.12.2016, 14:10
Ответы с готовыми решениями:

Delphi и ASM - не работает вызов функции Invoke через asm
В Delphi не работает вызов функции Invoke через asm. часть кода: asm invoke CloseHandle,ebx; invoke ExitProcess,0; ...

Обращение к элементу массива через ASM(Assembler)
Здравствуйте! Мне нужно написать программу, которая бы просто складывала бы все элементы массива, умноженные на 2(т.е. прибавлять каждый...

Обработка строк [asm+pas]
Дан текст не более 255 символов. Составить словарь уникальных символов. Программа состоит из двух модулей. Основной - паскаль, тут вроде...

6
1394 / 1023 / 325
Регистрация: 28.07.2012
Сообщений: 2,813
28.12.2016, 14:41
Цитата Сообщение от protofun Посмотреть сообщение
Прошу помочь с тем что есть, и по возможности помочь с основной задачей.
Ну, вариант для самых ленивых: написать самый простейший вариант решения на C++, а затем посмотреть на получившийся ассемблерный код (В VS это делается совсем просто) и выдрать оттуда соотвствующий код на асме.
0
0 / 0 / 2
Регистрация: 25.05.2016
Сообщений: 20
28.12.2016, 19:06  [ТС]
В качестве кода для разбора я сделал вот это:
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include "stdafx.h"
#include<iostream> 
using namespace std;
int main() {
    const int N = 10;
    long a[N], c = 0, i = 0, S = 0, D[N];
    for (int i = 0; i < N; i++) {
        cout << "a[" << i + 1 << "]=";
        cin >> a[i];
        D[i] = 0;
    }
    for (int i = 0; i < N; i++) {
        if (a[i] < c) {
            D[i] = a[i] * a[i] + 0;
        }
    }
    for (int i = 0; i<N; i++)
        S += D[i];
    if (S == 0) {
        cout << "no minus!" << endl;
    }
    else {
        cout << S << endl;
    }
    system("pause");
    return 0;
}

В ассемблер вывелось вот это:
http://pastebin.com/AKVkVs6u
Как из этой стены извлечь то что нужно? Я не силен в реверсивной инженерии
0
1394 / 1023 / 325
Регистрация: 28.07.2012
Сообщений: 2,813
28.12.2016, 20:20
protofun, делай самый простейший пример без всего лишнего. Тебе же не надо на ассемблере рожать ввод/вывод данных.
Типа:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
int main() {
    int N = 10;
    int *a = new int[N];
    int prod = 1;
    int i = 0;
    while (i < N) {
        if (a[i] < 0)
            prod *= a[i] * a[i];
        ++i;
    }
 
    return 0;
}
Запускаешь это нечто в режиме отладки и переходишь к диассемблированному коду. Получишь отображений кода C++ на ассемблер - от этого и пляшешь. Единственное, что нужно будет переделать - это заменить jump'ы.
0
0 / 0 / 2
Регистрация: 25.05.2016
Сообщений: 20
28.12.2016, 21:39  [ТС]
А как при этом организовать ввод из клавиатуры, с последующим выводом числа?
0
1394 / 1023 / 325
Регистрация: 28.07.2012
Сообщений: 2,813
28.12.2016, 22:04
protofun, на ассемблере? А вот хз, я его не знаю, так что тебе стоит обратиться в соответствующий раздел форума.

Добавлено через 19 минут
Если нет, то я предполагал так:
Вытакскиваешь ассемблерный код, соответствующий циклу сверху, делаешь из него ассемблерную вставку, добавляешь до и после нее ввод и вывод.
0
1719 / 568 / 187
Регистрация: 12.03.2016
Сообщений: 2,169
29.12.2016, 19:25
Может как то так.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
#include "stdafx.h"
#include <iostream>
 
int main()
{
    setlocale(0, "");
    long N;
    long C;
    long summ,proizv;
    std::cout << "Введите размерность массива = "; std::cin >> N;
    
    long *a = new long[N];
    
    for (int i = 0; i < N; i++)
    {
        std::cout << "Введите a [" << i << "]" << "="; std::cin >> a[i];
    }
    std::cout << "Введите значение С = "; std::cin >> C;
    _asm
    {
        mov     ecx, N
        mov     ebx, 1
        mov     edx, 0
        mov     esi, dword ptr a
next :
        mov     eax, dword ptr [esi]
        cmp     eax,0
        jg      go_1
        cmp     eax,C
        jg      go_1
 
        imul    eax,eax
        imul    eax,ebx
        mov     ebx,eax
        add     edx,1
go_1:
        add     esi, 4
        loop    next
 
        mov     proizv,ebx
        mov     summ,edx
    }
 
    if (summ > 0)
        std::cout << "Результат = " << proizv;
    else
        std::cout << "Элементов удовлетворяющих условиям - нет";
    
    system("pause");
    return 0;
}
вроде считает как надо
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
29.12.2016, 19:25
Помогаю со студенческими работами здесь

обработка инкрементального энкодера на прерываниях (asm)
Приветствую сообщество. Пытаюсь нарулить на ассемблере код обработки энкодера, оно вроде функционирует, но с большими глюками. ...

Заполнение массива с клавиатуры через процедуры и последующая обработка
Добрый вечер, прошу помочь с заполнением массива знаковыми целыми числами, размером слово. sseg segment stack 'stack' ...

Многопоточная обработка большого массива через ThreadPool с возможностью остановки
Добрый день! Возникла такая задача. В массиве 200 тыс. строк. Их нужно обработать с помощью довольно быстрой функции с максимальной...

Прикол с целочисленным делением в ASM через PASCAL
Доброго времени суток, столкнулся с проблемой: в технаре дали задание: написать на ассемблере прогу, которая высчитывает значение по...

Обращение к регистрам через адреса (ASM, AVR Studio)
Здравствуйте, есть такой вопрос: к примеру у меня в SRAM хранятся реальные адреса регистров общего назначения (POH). Допустим, я сохраню в...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru