Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #define _CRT_SECURE_NO_WARNING
- #include <stdio.h>
- #include <locale.h>
- #define SIZE 8 // Количество элементов в массиве A
- short int A[SIZE]; // Массив A
- short int B[SIZE]; // Массив B
- short int* C[SIZE]; // Массив C
- char k = 0; // Счетчик попадающих в заданный диапазон элементов
- short int sum = 0; // Сумма элементов попадающих в заданный диапазон
- void asm_solve() { // функция с ассемблерной вставкой
- __asm {
- lea esi, A // Кладем в двойное слово ESI адрес первого элемента из А
- lea edi, B // В EDI адрес первого из В
- lea ebx, C // Аналогично в ЕВХ первого из С
- mov ch, k // В байтовый регистр СН кладем начальное значение счетчика
- mov cl, SIZE // В CL кладем размер массива
- BEGIN : // Метка начала
- mov al, [esi] // кладем в байтовый регистр AL значение текущего элемента A
- mov dx, ax // переносим al в регистр dh
- add dx, 3 // добавляем к dl 3, чтобы проверить подходит ли текущий элемент по левой границе
- cmp dx, 0 // сравниваем с 0
- jns AA // если подошло то переходим в метку AA
- jmp FIN // если нет то переходим в метку FIN
- AA : // метка AA
- mov dx, ax // переносим al в dl
- sub dx, 4 // вычитаем из dl 4 чтобы проверить подходит ли текущий элемент по правой границе диапазона
- cmp dx, 0 // сравниваем с 0
- je CUR // если равно 0 то переходим в метку CUR
- js CUR // если меньше то тоже переходим в CUR
- jmp FIN // иначе переходим в FIN
- CUR : // метка CUR
- mov ax, [esi] // переносим текущий элемент из A в al
- mov[edi], ax // переносим al в текущий элемент из B
- mov[ebx], edi // кладем в С смещение
- add edi, 2 // двигаемся дальше по В
- add ebx, 4 // двигаемс дальше по С
- add ch, 1 // увеличиваем счетчик подходящих элементов
- FIN: // метка М
- add esi, 2 // идем дальше по А
- dec cl // Вычитаем 1 из счетчика цикла
- cmp cl, 0 // Сравниваем его с 0
- jne BEGIN // Если он еще не достиг 0, то переходим обратно на метку начала BEGIN
- mov k, ch // сохраняем кол-во элементов в В
- mov cl, 0 // счетчик количества пройденных элементов в B
- lea edi, B
- mov dx, 0 // заводим счетчик суммы подходящих элементов
- //mov dh, 0
- //mov dl, 0
- jmp CNTSUM
- CNTSUM:
- add dx, [edi] // добавляем al к регистру dh
- add edi, 2
- inc cl
- cmp ch, cl
- je FF
- jne CNTSUM
- FF:
- mov sum, dx // сохраняем сумму подходящих элементов
- }
- }
- int main() {
- char x1;
- double p = 0;
- setlocale(LC_ALL, "rus");
- START:
- printf("Желаете запустить программу? (1 или 0)\n");
- char str[40];
- gets(str);
- if (strlen(str) > 1) { printf("1 или 0\n"); goto START; }
- if (str[0] == '0') { return 0; }
- if (str[0] == '1') { goto INPUT; }
- INPUT: printf("Ведите массив A из 16 элементов\n");
- printf("Задайте элементы массива A: \n");
- for (int i = 0; i < SIZE; i++) {
- scanf_s("%lf", &p);
- if ((p <= 127) && (p >= -128)) { A[i] = p; }
- else { printf("not a char\n"); goto INPUT; }
- }
- asm_solve(); // запуск функции с ассемблерной вставкой
- // вывод ответа
- puts("\nМассив А:");
- for (int i = 0; i < SIZE; i++) {
- printf("%hd ", A[i]);
- }
- puts("\nМассив B:");
- for (int i = 0; i < k; i++) {
- printf("%hd\t%p\n", B[i], B + i);
- }
- puts("\nМассив C:");
- for (int i = 0; i < k; i++) {
- printf("%p\n", C[i]);
- }
- printf("\nКоличество элементов в В: %d\n", k);
- printf("Сумма элементов в В: %d\n", sum);
- goto START;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement