Форум программистов, компьютерный форум, киберфорум
Assembler: Windows/protected mode
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.64/11: Рейтинг темы: голосов - 11, средняя оценка - 4.64
650 / 210 / 20
Регистрация: 20.05.2016
Сообщений: 873
Записей в блоге: 15
1

Перевести код С++ в код на Ассемблере (Ассемблерная вставка для С++)

19.04.2017, 17:10. Просмотров 1911. Ответов 20
Метки нет (Все метки)

Приветствую знатоков!
Трудоемко ли перевести код функции Func под ассемблерную вставку (в Visual Studio через __asm (?))
Код на С++ прилагаю. Будет ли прирост производительности?
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
 unsigned long long n=0; //глобальные переменные
    unsigned long long an=0;
    unsigned long long lim=0;
    unsigned int k=1;
    vector<unsigned long long> a;
    int threadsN; 
 
    void Func(int start)
    {
        unsigned long long m = n;
        for (unsigned long long x = start; x <= lim; x = x + threadsN)
        {
            unsigned long long ax = a[x];
            unsigned long long r = an - ax - 1;
            while (a[m] > r) m--;
            unsigned long long z = x * 12599/10000;
 
            for (unsigned long long y = x; y <= m; y++)
            {
                unsigned long long z3 = ax + a[y] + 1;
 
                for (unsigned long long az = a[z]; az <= z3; z++, az = a[z])
                {
                    if (az == z3) printf("%u  %llu  %llu  %llu\n", k++,x,y,z);
                }
            }
        }
 
    }
Благодарю.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
19.04.2017, 17:10
Ответы с готовыми решениями:

Ассемблерная вставка в MVS для нахождения максимального элемента массива
Написал такую вот штуку: // 1st_lab.cpp: определяет точку входа для консольного приложения. //...

Переписать код на ассемблере
#include &lt;stdio.h&gt; #include &lt;math.h&gt; #include &lt;conio.h&gt; #define My_PI 3.1415927 const float ...

Ассемблерная вставка в код на C++
Здравствуйте, есть задание написать функцию в с++ со вставкой ассемблера с MASM32. Можно ли это...

Ассемблерная вставка из 10 строк в код с++
Доброго времени суток, уважаемые товарищи! В проекте на с++, который передали мне, требуется...

20
Модератор
Эксперт по электронике
7355 / 3581 / 1414
Регистрация: 01.02.2015
Сообщений: 11,185
Записей в блоге: 1
19.04.2017, 23:03 2
Если вопрос
Цитата Сообщение от bedvit Посмотреть сообщение
Будет ли прирост производительности?
То ответ - незначительный.
Т.к. современные компиляторы (особенно от MicroSoft и в большей степени от Intel) оптимизируют код до неузнаваемости. И в реалии могут не создавать переменные в памяти, используя регистры. Т.е. то, на чём можно было получить ускорение раньше.

Прирост может получиться при использовании расширенных команд процессора SIMD - для обработки массивов одной командой - т.е. удалением циклов.

Но наибольший прирост даёт изменение алгоритма.

Обработка целочисленного массива: заполнение по формуле, вычисление суммы, изменение элементов по правилу.

Ну и вообще, поискать по разделу AVX, SSE и прочее.
0
1714 / 605 / 187
Регистрация: 12.03.2016
Сообщений: 2,187
20.04.2017, 00:48 3
Цитата Сообщение от ФедосеевПавел Посмотреть сообщение
Но наибольший прирост даёт изменение алгоритма.
Здесь на мой взгляд алгоритм очень оптимальный. Делал его в лоб, получилась голимая шняга. А вообще ТС не мешало бы дать ссылку на раздел C++ где эта тема разбиралась, это намного упростило понимание проблемы.

Цитата Сообщение от ФедосеевПавел Посмотреть сообщение
SIMD - для обработки массивов одной командой - т.е. удалением циклов.
Как они могут удалять цикл я так и не понял. Скорее служить для обработки векторных или скалярных вычислений для уменьшения количества итераций в цикле и то, при необходимых условиях.
Цитата Сообщение от ФедосеевПавел Посмотреть сообщение
Ну и вообще, поискать по разделу AVX, SSE и прочее.
Как раз здесь и есть куча циклов без которых никак, иначе весь оптимальный алгоритм напрочь рушится.
Пробовал как и обещал ТС перевести это все на AVX (с горяча, когда еще не разбирался в алгоритме), но с таким количеством циклов и проверок приходится все делать через такие костыли что вся прелесть AVX махом улетучивается. Становится еще хуже, да и программа увеличится до неизвестных размеров.
bedvit, Вы же не зря компилировали ее (прога в C#) в "Сборка Debug x64" и получили самый быстрый результат. То же самое получается (чуть быстрее работает) если компилировать прогу c++ в "Release x64". Только в плюсах она получается в 32 кило, а у Вас в 7. Лазить по ним отладчиком что бы узнать в чем разница и что там компилятор напихал вряд ли кто будет.
Единственное что при отладке, как и советовал nmcf, пробежался по дизассемблированному коду. Как и ожидалось компилятор использовал 64 битные регистры (не FPU, mmx, sse и т.д), а именно 64 разрядные, так как посчитал, что для переменных long long это будет самый оптимальный вариант. Единственное чтобы предложил - это написать данную функцию на ассемблере для 64 регистров и присоединить получившийся объектник к проекту. (Читал, что использовать 64 битные регистры в ассемблерных вставках нельзя, но сам еще не сталкивался). Но думаю, как и сказал ФедосеевПавел, прирост в производительности будет незначительный. Да и объектник в проект C#, наверное вставить можно. Если да, то сравнивать эти два языка на данном примере вообще будет лишено смысла.
3
650 / 210 / 20
Регистрация: 20.05.2016
Сообщений: 873
Записей в блоге: 15
20.04.2017, 10:52  [ТС] 4
мановар, благодарю за проделанную работу!
Ссылка на тему проекта. В текущей теме нет цели сравнивать языки, здесь ТС хотелось бы понять эффективность ассемблерной вставки на конкретном примере, заодно и получить новые знания в этом направлении.
Ассемблерную вставку вставить в С++ - можно, в С# - нельзя, но можно подключить неуправляемую dll (ИМХО)
Цитата Сообщение от мановар Посмотреть сообщение
использовать 64 битные регистры в ассемблерных вставках нельзя
это печально, надо почитать.
Какой профит тогда от ассемблерных вставок? если можно на С++ указать компилятору на макс. оптимизацию в настройках проекта, а в С# работать через небезопасный код (unsafe) .

Добавлено через 11 минут
ФедосеевПавел, а компилятор Microsoft Visual Studio 2017 для С++ насколько хорошо оптимизирует код, в сравнении с вами описанными (возможно у вас есть информация)? судя по результатам мановар, используются 64 разрядные регистры, но в не оптимальном виде?
0
196 / 88 / 15
Регистрация: 10.07.2016
Сообщений: 146
20.04.2017, 16:51 5
Какая-то мелкая программулинка и если указанные выше компиляторы выдают 7 и даже 32 кб, остаётся только громко улыбнуться таким оптимизациям
0
1714 / 605 / 187
Регистрация: 12.03.2016
Сообщений: 2,187
20.04.2017, 19:36 6
Цитата Сообщение от Ol44 Посмотреть сообщение
остаётся только громко улыбнуться таким оптимизациям
Дык все уж от Майкрософт давно ржут.
0
650 / 210 / 20
Регистрация: 20.05.2016
Сообщений: 873
Записей в блоге: 15
21.04.2017, 10:08  [ТС] 7
Выходит ассемблер здесь мало может помочь в оптимизации (в виде вставки), работы много, толку мало?
0
Модератор
Эксперт по электронике
7355 / 3581 / 1414
Регистрация: 01.02.2015
Сообщений: 11,185
Записей в блоге: 1
21.04.2017, 22:14 8
А я правильно понимаю, что в тексте a[i] - это отсортированный массив кубов целых чисел. Может быть организовать поиск в нём не последовательным просмотром (строка 15), а бинарным поиском. Помню, на задаче "ожерелье" при помощи перебора - это кардинально сокращало время.

Добавлено через 2 минуты
А на размер итогового exe не смотрите. Сам код в этом файле может занимать не очень много места (при маленьких программах).

Добавлено через 6 минут
Да и в строках 22-25 вижу последовательный перебор - опять напрашивается двоичный поиск.

Причём, если можно до начала поиска оценить левую и правую границы - можно это использовать.
1
4$M f0r3v3r XD
5818 / 1754 / 192
Регистрация: 14.12.2014
Сообщений: 3,295
Записей в блоге: 11
22.04.2017, 13:30 9
bedvit, хорошо бы посмотреть листинг получаемого кода на ассемблере, тогда, вероятно, будет проще найти места, которые можно оптимизировать.
Например, вот это: unsigned long long z = x * 12599/10000; наверняка можно оптимизировать через замену на unsigned long long z = x * 82570/65536; (или unsigned long long z = x * 82570 >> 16;). Да, именно 82570, а не 82569, так будет даже точнее.

Слишком сильно не углублялся, но можно попытаться сам алгоритм ещё оптимизировать (хорошо, если бы ты его описал словами).
Можно попытаться сделать так, чтобы потоки, выполняющие вычисления, выполняли обращения как можно к более смежным участкам памяти (для оптимизации использования кэша).

Добавлено через 9 минут
Кстати, участок деления на асме можно написать ещё точнее и с меньшим кол-вом сдвигов (т.е. быстрее):
Assembler
1
2
3
4
mov eax,2705659852
mul X
shld edx,eax,1
mov Y,edx  // а если бы edx использовался как Y, можно было бы эту инструкцию и не выполнять
главное, чтобы это не нарушило общую оптимизацию, ведь компилятор может использовать eax и edx для оптимизации переменных, а мы распоряжаемся ими по-своему...

Добавлено через 3 минуты
А ещё быстрее будет, если между mov и mul, а также между mul и shld + между shld и mov будет что-то вставлено, не меняющее eax и edx, тогда эти инструкции могут быть спарены с другими. Скажем, разбавить этот код предыдущими строками (ax = , r = , while...)
1
650 / 210 / 20
Регистрация: 20.05.2016
Сообщений: 873
Записей в блоге: 15
24.04.2017, 13:13  [ТС] 10
ФедосеевПавел, все правильно понимаете.
Для лучшего понимания, поясню для чего всё это
Первичная задача - рассчитать переменные для решения уравнения x ^ 3 + y ^ 3 = z ^ 3 - 1
в задаваемом диапазоне (натуральные числа).
Реализация: Мах. границу диапазона вводит пользователь - только натуральные числа (минимальная всегда 1). Далее строится массив (вектор) степеней этих чисел (до макс.границы). Далее в отдельных потоках (зависит от количества лог. ядер ЦП), запускается числодробилка -Func(), которая из этого массива/вектора подбирает варианты когда они удовлетворяют уравнению и выводит в консоль (в main() переменные не возвращаются, но есть глобальные переменные - общие для потоков)
Ветка с зеркальными вариантами х,у обрезается. Обрезаются итерации - которые заведомо не дадут нужного результата.
Каждый поток считает с шагом по массиву/вектору числа самих потоков - threadsN (очень хорошо и равномерно парраллелится).
вот алгоритм на С++
Кликните здесь для просмотра всего текста
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
54
55
56
57
58
59
60
61
62
//поиск переменных для решения уравнения x^3 + y^3 = z^3 - 1
#include "stdafx.h"
#include <string>
#include <vector>
#include <iostream>
#include <thread>
#include <stdio.h>
using namespace std;
        unsigned long long n=0;
    unsigned long long an=0;
    unsigned long long lim=0;
    unsigned int k=1;
    vector<unsigned long long> a;
    int threadsN; //задать количество потоков
 
    void Func(int start)
    {
        unsigned long long m = n;
        for (unsigned long long x = start; x <= lim; x = x + threadsN)
        {
            unsigned long long ax = a[x];
            unsigned long long r = an - ax - 1;
            while (a[m] > r) m--;
            unsigned long long z = x * 12599/10000;
 
            for (unsigned long long y = x; y <= m; y++)
            {
                unsigned long long z3 = ax + a[y] + 1;
 
                for (unsigned long long az = a[z]; az <= z3; z++, az = a[z])
                {
                    if (az == z3) printf("%u  %llu  %llu  %llu\n", k++,x,y,z);
                }
            }
        }
    }
 
int main()
{
    string s;
    threadsN = thread::hardware_concurrency();
    wcout << wstring(L"Enter the maximum value of the variables for equation (x ^ 3 + y ^ 3 = z ^ 3 - 1), followed by <Enter>:\n") << endl;
    getline(cin, s);
    n = stoll(s);
    unsigned int start_time = clock(); // начальное время
    an = n * n * n;
    
    a = vector<unsigned long long>(n + 1);
    lim = static_cast<unsigned long long>(pow((an - 1) / 2, 1.0 / 3));
 
    for (unsigned long long j = 1; j <= n; j++) a[j] = j * j * j;
 
    vector<thread> thr(threadsN);
    for (int i = 1; i <= threadsN; i++) thr[i-1] = thread(Func, i);
    for (int i = 1; i <= threadsN; i++) thr[i-1].join();
    
    unsigned int end_time = clock(); // конечное время
    unsigned int search_time = end_time - start_time; // искомое время
    printf("Time, sec (min): %f (%f)\n", search_time / 1000.0, search_time / 60000.0);
    system("pause");
    return 0;
    }

т.к. 99% вычислений - это числодробилка (функция Func), то её и решил оптимизировать с помощью ассемблерной вставки (пишу в visual studio)
Цитата Сообщение от Jin X Посмотреть сообщение
листинг получаемого кода на ассемблере
, мало знаний на данный момент, как это сделать в студии (?).
unsigned long long z = x * 12599/10000 - отсекает заведомо лишние ветви вычислений (сжимая область поиска в массиве/векторе).
Jin X, по причине своих небольших знаний в данном направлении, понял в вашем сообщении не всё , но главное понял - то, что оптимизировать можно - и уже за это вам спасибо!
Осталось понять, что можно оптимизировать, если посмотреть на первоначальную цель, и полный алгоритм.

Добавлено через 20 минут
Могу написать комментарии построчно к коду.
0
4$M f0r3v3r XD
5818 / 1754 / 192
Регистрация: 14.12.2014
Сообщений: 3,295
Записей в блоге: 11
24.04.2017, 20:06 11
Цитата Сообщение от bedvit Посмотреть сообщение
Могу написать комментарии построчно к коду.
Мы, конечно, можем попробовать что-то оптимизировать, но я не уверен, что прирост будет ощутимый.
Компилятор в VS проводит оптимизацию довольно чётко и обойти его в подобных задачах не так просто. Можно элементарно проваливаться, не учтя что-то, что он учёл
Скажем, замена деления (12599/10000) заметно скорость не увеличит, т.к. это самый внешний цикл, он выполняется относительно малое кол-во раз.

Оптимизировать тут можно, скорее, алгоритм. Например, придумать такой вариант, когда можно использовать SSE2, чтобы работать сразу с несколькими числами параллельно. Или сделать так, чтобы память использовалась небольшими участками (может, и сейчас так, не знаю, надо углубляться в алгоритм). Т.е. у нас массив, скажем, из 100 000 чисел. Если мы будет обращаться к нему хаотично, то очень часто будут возникать промахи процессорного кэша (т.к. весь массив в 800 Кб просто не уместится в него... по крайней мере, в L1 и L2). А если обработать сначала 1000 элементов (и больше к ним никогда не возвращаться!), затем ещё 1000 и т.д. (причём, всеми потоками, а не каждым обращаться к разной памяти... ну или раздробить на меньшие блоки, по 256 чисел... хотя для 32 Кб кэша 4 потока по 1000 чисел - это 32000 + ещё немного на всякие переменные и другие приложения, возможно, и хватит, но я бы сделал поменьше, тем более, можем попасться 8-ядерник с 32 Кб кэшем... по 200-400 нормально), то в кэш загрузятся сначала первые 1000 чисел (и при многократном использовании эти 1000 чисел будут читаться из массива гораздо быстрее, чем при хаотичном обращении ко всему массиву... под хаотичном я подразумеваю и последовательное), затем следующие 1000. И работа будет идти быстрее.
По-другому ещё объясню. Если прочитать большой массив последовательно 1000 раз подряд, это будет медленнее, чем прочитать каждое число 1000 раз подряд, а потом переходить к следующему числу. Ну или читать порциями: сначала 1000 чисел 1000 раз подряд, затем следующие 1000 чисел 1000 раз подряд. Это будет быстрее, чем читать весь массив последовательно 1000 раз подряд

По алгоритмам можно кинуть тему в Алгоритмы, например...

Но самый большой прирост скорости будет от перехода на 64 бита (если сейчас прога работает на 32-х). Ну и от перехода с конфигурации Debug на Release (если вдруг...).
Остальное существенного прироста не даст.
1
650 / 210 / 20
Регистрация: 20.05.2016
Сообщений: 873
Записей в блоге: 15
25.04.2017, 13:19  [ТС] 12
Решил глянуть файл ассемблерного кода, который компилятор студии сделал.
25 тыс. строк (с машинным кодом - 35 тыс.строк). Не профессионалу (как мне) полжизни разгребать.
Какие-то куски опознаю, какие-то нет.
Цитата Сообщение от Jin X Посмотреть сообщение
на 64 бита
- так точно unsigned long long - это и есть int64 без знаковый, что бы больший диапазон влез. Понятное дело Release, оптимизация в С++ компиляторе - максимальная.
На данном алгоритме максимальная граница диапазона (2^64)^(1/3)-1 = 2 642 245
Посчитал, получил - 93 решения.
Кликните здесь для просмотра всего текста
1689
271138144
3135138172
4372426505
5426486577
6242720729
7566823904
87918121010
923612071210
1057522922304
11193828203097
12267632303753
13112456105625
14219659846081
15194367026756
16185186758703
1719431164611664
1876761190312884
1933181680616849
20108661732818649
2130862158821609
2234532496524987
23173282763029737
2446073684036864
25281823121237513
26102303788738134
27257653385738239
28312123456641545
2972514940949461
30341994621251762
3165605902259049
32152186619866465
33291966616768010
34541015650369709
35328826947971852
36512936416573627
37173847824478529
3889998997090000
39584628738395356
407526394904108608
418450789559109747
4299800104383128692
4311978131736131769
4481404130119139974
4586103153422161976
4693066152526163297
4715551186588186624
48146996204290227033
49105570237095243876
5019772257010257049
51152526249972267625
52120039275616283006
5357055339590340126
5424695345702345744
55113208342719346788
56289511331954393316
57315750340623414082
58151499434305440365
59293999403346449846
6030374455580455625
6136863589776589824
62257118664572677161
63197144708282713337
6444216751638751689
65309874746831764206
66283896815498826809
67658625743413886447
68375703902654923848
6952487944730944784
7031199910525401061600
7138655910766641093024
726173011728321172889
739262719516901183258
7434264812401191248778
7559581512245161269838
7629424112983451303363
7797129811593521352601
787199914399401440000
7994290213091081455241
80115078213886721613673
81107793615689781722969
8266457217177101750249
838334817502661750329
84155784617244422073025
859583121082382108304
8627003621746792176066
8758533521983742212120
88172444219088522294713
8971738323459152368067
9080286323425192373543
91146092621852472384230
9212638424189022419017
9310950225185002518569

Размер массива/вектора - 2 642 245 элементов.
Количество итераций - 346 331 120 300
Время выполнения 15,9 мин.
ПК:
Кликните здесь для просмотра всего текста

Тип ЦП QuadCore Intel Core i7-3770, 3700 MHz (37 x 100)
Системная память 8156 МБ (DDR3-1333 DDR3 SDRAM)


Добавлено через 1 час 34 минуты
8 логических ядер - 8 потоков.
0
4$M f0r3v3r XD
5818 / 1754 / 192
Регистрация: 14.12.2014
Сообщений: 3,295
Записей в блоге: 11
25.04.2017, 13:49 13
Ну, может, тогда просто забить это всё в массив и выдавать результат в нужном диапазоне?
Это будет самая лучшая оптимизация скорости
0
650 / 210 / 20
Регистрация: 20.05.2016
Сообщений: 873
Записей в блоге: 15
25.04.2017, 16:12  [ТС] 14
Цитата Сообщение от Jin X Посмотреть сообщение
просто забить это всё в массив и выдавать результат в нужном диапазоне

Так же хотел запилить вычисления числа "Пи", до миллионного знака, но .exe весить стал неприлично много.

Не по теме:

Из студента я давно вырос, эх... были времена (и учился по совершенно другому направлению), собственно по тому направлению и работаю, посему программирую редко. А задачка эта на форуме приглянулась, решил решить :)


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

Добавлено через 11 минут
Можно конечно и дальше считать, но тогда нужно подключать длинную арифметику. Есть и библиотеки mpir, но это сразу снизит скорость вычисления, да и никто не оценит.
0
4$M f0r3v3r XD
5818 / 1754 / 192
Регистрация: 14.12.2014
Сообщений: 3,295
Записей в блоге: 11
25.04.2017, 18:09 15
Дальше замучаешься ждать просто...

Цитата Сообщение от bedvit Посмотреть сообщение
Так же хотел запилить вычисления числа "Пи", до миллионного знака, но .exe весить стал неприлично много.
Загрузить в интернет и качать оттуда, типа вычисляет
А вообще, млн знаков можно в ≈400 Кб (с небольшим) запросто засунуть. Если каждые 3 цифры запихивать в 10 бит (число от 0 до 1023) или 12 цифр в 40 бит (равно 5 байт). Будет сжатие даже лучше, чем у 7z и rar5

Добавлено через 27 минут
У меня есть число Пи до 1 млрд знаков после запятой, числа Фи и e с точностью до 500 млн+1 знаков (вычислено с помощью Wolfram Mathematica 9.0). Если что, обращайтесь!
0
1714 / 605 / 187
Регистрация: 12.03.2016
Сообщений: 2,187
25.04.2017, 18:23 16
Цитата Сообщение от Jin X Посмотреть сообщение
У меня есть число Пи до 1 млрд знаков после запятой,
1 011 196 691 знаков — братья Чудновские, США, 1989 г. (IBM 3090, на базе формулы С. Рамануджана)
0
4$M f0r3v3r XD
5818 / 1754 / 192
Регистрация: 14.12.2014
Сообщений: 3,295
Записей в блоге: 11
25.04.2017, 19:29 17
мановар, ну вот... как теперь жить дальше?
Скажи, что это неправда!
0
650 / 210 / 20
Регистрация: 20.05.2016
Сообщений: 873
Записей в блоге: 15
25.04.2017, 19:42  [ТС] 18
мановар, Jin X, к сожалению так:
19 октября 2011 года Александр Йи и Сигэру Кондо рассчитали последовательность с точностью в 10 триллионов цифр после запятой персональном ПК!
см.здесь
Кликните здесь для просмотра всего текста
НА персональном ПК - два шестиядерных процессора Intel Xeon X5680 (3,33 ГГц). Также были установлены 96 гигабайт оперативной памяти и 30 жестких дисков общим объемом 59 терабайт. Для нового рекорда пришлось добавить 10 жестких дисков.
Оригинал новости находится в интернет-журнале «iScience» (iScience.ru): http://iscience.ru/2011/10/20/... ya-%CF%80/


Не по теме:

Голландский математик Брауэр в первой половине XX века привёл в качестве примера бессмысленной задачи поиск в десятичном разложении ПИ последовательности 0123456789 — по его мнению, нужная для этого точность никогда не будет достигнута. В конце XX века эта последовательность была обнаружена, она начинается с 17 387 594 880-го знака после запятой. Википедия

1
1714 / 605 / 187
Регистрация: 12.03.2016
Сообщений: 2,187
25.04.2017, 19:46 19
Цитата Сообщение от Jin X Посмотреть сообщение
ну вот... как теперь жить дальше?
Копить на процессоры, оперативку и жесткачи. И вперед, к новым рекордам.
0
650 / 210 / 20
Регистрация: 20.05.2016
Сообщений: 873
Записей в блоге: 15
25.04.2017, 20:24  [ТС] 20
А так же купить кондей и готовится к счетам за свет ))
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
25.04.2017, 20:24

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Ассемблерная вставка и аналогичный код на С++ (массив)
Начали изучать на заочке ассемблер (до С++ ещё не дошли), лекций не было, сразу практика....

Ассемблерная вставка, нужен код зажатого shift-а
Есть счётчик считающий нажатие клавиш,надо что бы при зажатом шифте,счётчик уменьшался.Подскажите...

help; вставка на ассемблере в код паскаля
Плохо еще разбираюсь с низкоуровневым программированием, поэтому не очень то и получается,...

Перевести ассемблерный код TASM в программный код для архитектуры ARM
Необходимо программный код перевести в программный код языка ассемблер для архитектуры ARM,...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.