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 4 // Количество элементов в массиве A
- char A[SIZE]; // Массив A
- char B[SIZE]; // Массив B
- char* C[SIZE]; // Массив C
- char k = 0; // Счетчик попадающих в заданный диапазон элементов
- char sum = 0; // Сумма элементов попадающих в заданный диапазон
- void asm_solve() { // функция с ассемблерной вставкой
- __asm {
- lea esi, A // Кладем в двойное слово esi адрес первого элемента из А
- lea edi, B // В edi адрес первого из В
- lea ebx, C // Аналогично в ebx первого из С
- mov bh, sum // В bl кладем сумму подходящих элементов
- mov ch, k // В байтовый регистр ch кладем начальное значение счетчика подходящих элементов
- mov cl, SIZE // В cl кладем размер массива
- BEGIN : mov al, [esi] // Метка начала: кладем в байтовый регистр al значение текущего элемента элемента A
- mov dl, al // Кладем в байтовый регистр dl значение al
- add dl, 3 // Добавляем к dl 3 чтобы сравнить ее положение относительно левой границы заданного диапазона
- cmp dl, 0 // сравниваем с 0
- jns RHS // если dl подошло по левой границе то переходим в метку RHS
- jmp NXT // иначе переходим в метку NXT
- RHS :
- mov dl, al // Кладем в байтовый регистр dl значение al
- sub dl, 4 // Вычитаем из dl 4 чтобы сравнить ее положение относительно правой границы заданного диапазона
- cmp dl, 0 // сравниваем dl с 0
- je CHANGE // если dl подошло по правой границе то переходим в метку CHANGE
- js CHANGE // если dl подошло по правой границе то переходим в метку CHANGE
- jmp NXT // иначе переходим в метку NXT
- CHANGE : // метка CHANGE
- mov al, [esi] // кладем в al текущий элемент из A
- mov[edi], al // кладем al в текущий элемент из B
- //lea eax, [edi]
- //mov[C + ebx*4], eax
- mov[ebx], edi // кладем в текущий элемент из С смещение
- add bh, [edi] // добавляем al к счетчику суммы подходящих элементов
- inc edi // двигаемся дальше по В
- add ebx, 4 // двигаемс дальше по С
- add ch, 1 // увеличиваем счетчик количества подходящих элементов
- NXT : // метка NXT
- inc esi // идем дальше по А
- dec cl // Вычитаем 1 из счетчика цикла
- cmp cl, 0 // Сравниваем его с 0
- jne BEGIN // Если он еще не достиг 0, то переходим обратно на метку начала BEGIN
- mov k, ch // сохраняем кол-во элементов в В
- mov sum, bh // сохраняем сумму элементов из B
- }
- }
- 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