0 / 0 / 0
Регистрация: 19.03.2013
Сообщений: 10
1

Написать прогу в с++ на ассемблере

11.06.2016, 14:12. Показов 1134. Ответов 8
Метки нет (Все метки)

Всем привет, дорогие форумчане. Давно я не заходил сюда, да и аккаунт уже старый (первый) не вспомнил.
Задачка вообще простая, но с ассемблером вообще не знаком.
Даны два одномерных массива одинаковой размерности. Массивы заполнить случайными числами. Сформировать третий массив следующим образом: если сумма двух соответствующих элементов больше заданного пользователем числа записать в массив 1, если меньше -0. Подсчитать количество 1 и 0 в итоговом массиве.

По логике понимаю как все устроено, но вот с самим кодом на асм никак не разберусь, не поможете?
Может быть и за отдельную человеческую плату
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
11.06.2016, 14:12
Ответы с готовыми решениями:

Изменить прогу на ассемблере (всего лишь пару строк)
прога запрашивает строку (например edede) и меняет все символы d на 7 выводит в окне результат...

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

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

Как написать в ассемблере 18:3+7 ?
Помогите решить в ассемблере 18:3+7

8
Прощай, Мир!
1672 / 829 / 252
Регистрация: 26.05.2012
Сообщений: 3,057
11.06.2016, 20:15 2
Цитата Сообщение от eraction Посмотреть сообщение
за отдельную человеческую плату
пиши мне на мыло
0
Эксперт Hardware
Эксперт Hardware
5407 / 1948 / 358
Регистрация: 29.07.2014
Сообщений: 2,864
Записей в блоге: 4
11.06.2016, 20:51 3
Как я понял нужна вставка что-ли? Что она конкретно должна делать? Всё из перечисленного, или массив создаёшь снаружи? И какой размер элементов массива: b/w/dw
"Человеческую плату" только приветствую. Можем обсудить в личке.
0
0 / 0 / 0
Регистрация: 19.03.2013
Сообщений: 10
11.06.2016, 21:08  [ТС] 4
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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
#include <iostream>
#include <time.h>
#include <conio.h>
#include <stdio.h>
 
void main () {
    setlocale(LC_ALL,"Rus");
srand(time(NULL));
    int a[10] = {0};
    int b[10] = {0};
    int d[10] = {0};
    int z[10] = {0};
    int c;
    int summ = 0;
    int summ2 = 0;
    printf("Введите число: ");
    //std::cin >> c; 
    for(int i=0; i<10; i++)
    {
        a[i] = 0 + rand()%100;
        b[i] = 0 + rand()%100;
    }
    printf("\nМассив #1: ");
    for (int i = 0; i<10; i++)
    {
        printf("%i\, ", a[i]);
    }
        printf("\nМассив #2: ");
    for (int i = 0; i<10; i++)
    {
        printf("%i\, ", b[i]);
    }
 
    _asm
    {
        
        lea EAX, a      //читаем адрес для переменной массива а
        lea EBX, b      //читаем адрес для переменной массива b
        mov ESI, 0      //шаг увеличения адреса на 4
        mov ECX, 10     //кол-во итераций
    for1:               //первый цикл
        mov EDX, [EAX+ESI]  //увеличение адреса на 4 для переменной a массива
        mov EDI, [EBX+ESI]  //увеличение адреса на 4 для переменной b массива
        add EDI, EDX        //сложение элементов массива
        cmp EDI, 50     //сравнение суммы с числом
    jc lb1              //если сумма меньше, прыгает.
        add summ, 1
        mov EDX, 1      //ЗАПИСЬ В РЕЗУЛЬТАТ 1
        push EDX        //записывает результат в стэк
    jmp end         //прыгаем на end
 
    lb1:            //метка
        add summ2, 1
        mov EDX, 0      //запись в результат 0
        push EDX        //записывает результат в стэк
    end:                //прыгнули
        add ESI, 4      // +4 к шаг увеличения адреса
    loop for1       //возвращение к шапке цикла
        lea EAX, d      //читаем адрес переменной массива d
        mov ESI, 0      //esi =0
        mov ECX, 10     //ecx =10
    for2:           //шапка второго цикла. цикл записи данных в массив
        pop EDI         //чтение из стека
        mov [EAX+ESI], EDI
        add ESI, 4      //перемещение на следующий элемент массива
    loop for2       //возвращение в шапку 2 цикла
    //////////////////////////
        lea EAX, d      //читаем адрес для переменной массива а
        mov ESI, 0      //шаг увеличения адреса на 4
        mov ECX, 10     //кол-во итераций
    for3:               //первый цикл
        mov EDX, [EAX+ESI]  //увеличение адреса на 4 для переменной a массива
        push EDX        //записывает результат в стэк
        add ESI, 4      // +4 к шаг увеличения адреса
    loop for3       //возвращение к шапке цикла
    /////////////////////////
        lea EAX, z      //читаем адрес переменной массива d
        mov ESI, 0      //esi =0
        mov ECX, 10     //ecx =10
    for4:           //шапка второго цикла. цикл записи данных в массив
        pop EDI         //чтение из стека
        mov [EAX+ESI], EDI
        add ESI, 4      //перемещение на следующий элемент массива
    loop for4       //возвращение в шапку 2 цикла
    //////////////////////
 
    }
 
    printf("\nМассив #3: ");
    for (int i = 0; i<10; i++){
        printf("%i\, ", z[i]);
    }
    printf("\nВсего единиц:%i", summ);
    printf(  "\nВсего нулей:%i\n",summ2);
 
    system("pause");
}
на самом деле уже работает, но не замудренно ли?
0
Эксперт Hardware
Эксперт Hardware
5407 / 1948 / 358
Регистрация: 29.07.2014
Сообщений: 2,864
Записей в блоге: 4
11.06.2016, 22:26 5
eraction, вот тебе ещё вариант:
Assembler
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
A   dd   10 dup(?)          ; массив 1
B   dd   10 dup(?)          ; массив 2
C   dd   10 dup(?)          ; массив под результ (0,1)
 
  _asm {
 
       lea   esi,A     ;<---; вычисляем адреса
       lea   edx,B          ;
       lea   edi,C          ;
       mov   ecx,10         ; длина массива
 
kLoop: lodsd           ;<---; берём значение из адреса ESI
       mov   ebx,1          ; EBX = что записывать в результат(С)
       add   eax,[edx]      ; А + В
       cmp   eax,50         ;
       jb    okey           ; ОК, если сумма меньше 50
       xor   ebx,ebx        ; иначе: EBX = 0
okey:  xchg  eax,ebx        ;
       stosd                ; запись значения по адресу EDI
       add   edx,4          ; сл.элемент в массиве(В)
       loop  kLoop          ; на повтор..
 
       xor   eax,eax   ;<---; считаем нули в массиве(С)
       xor   ebx,ebx        ; счётчик найденых
       mov   ecx,10         ; повторов
       lea   edi,C          ; адрес источника
fLoop: repne scasd          ; поиск!
       jcxz  next           ; выйти, если СХ=0
       inc   ebx            ; считаем нули..
       jmp   fLoop          ;
 
next:  mov   eax,10         ;
       sub   eax,ebx        ; EAX = кол-во единиц
       }                    ; EBX = кол-во нулей
1
0 / 0 / 0
Регистрация: 19.03.2013
Сообщений: 10
12.06.2016, 17:30  [ТС] 6
не получается вывести на консоль с++ подсчитанные нули и единицы, все перепробовал уже.
как вывести eax и ebx на с++ консоль?
0
0 / 0 / 0
Регистрация: 15.05.2016
Сообщений: 5
12.06.2016, 17:32 7
Я ведь вообще в этом не смыслю..((
0
Эксперт Hardware
Эксперт Hardware
5407 / 1948 / 358
Регистрация: 29.07.2014
Сообщений: 2,864
Записей в блоге: 4
12.06.2016, 19:01 8
Лучший ответ Сообщение было отмечено eraction как решение

Решение

Цитата Сообщение от eraction Посмотреть сообщение
как вывести eax и ebx на с++ консоль?
..отправь их в переменные и выводи (как ты выводишь) через PRINTF:
Assembler
1
2
3
4
5
6
next:  mov   eax,10         ;
       sub   eax,ebx        ; EAX = кол-во единиц
                            ; EBX = кол-во нулей
       mov   [summ],eax     ; сохраняем их в переменных
       mov   [summ2],ebx    ;
       }                    ; конец ASM-вставки
0
0 / 0 / 0
Регистрация: 19.03.2013
Сообщений: 10
13.06.2016, 23:55  [ТС] 9
спасибо, тему клоз
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
13.06.2016, 23:55
Помогаю со студенческими работами здесь

Написать простую программу на ассемблере
Задано числа Д, М, Р в різних форматах (db, dw, dd), де Д – день народження, М – місяць народження,...

Требуется написать программу на ассемблере
Задание такое: Даны два одномерных массива одинаковой размерности. Массивы заполнить случайными...

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

Измеритель ФЧХ на БПФ написать на ассемблере (TMS320VС5402)
1. Модуль ЦОС на базе процессора TMS320VС5402 2. Память программ 32К (16К х 16), память данных...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru