Форум программистов, компьютерный форум, киберфорум
Assembler для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.78/9: Рейтинг темы: голосов - 9, средняя оценка - 4.78
0 / 0 / 0
Регистрация: 08.01.2017
Сообщений: 39
Записей в блоге: 1
1

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

13.01.2017, 08:22. Показов 1681. Ответов 8
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Составьте программу, которая обрабатывает целочисленный массив из нескольких (например, 10) элементов следующим образом:

заполняет массив некоторыми числами (согласно пункту a соответствующего варианта задания);
выводит сформированный массив на экран;
подсчитывает и выводит на экран сумму элементов массива;
изменяет элементы массива по некоторому правилу (согласно пункту b варианта задания);
выводит полученный массив на экран;
подсчитывает и выводит на экран новую сумму элементов массива.
Заполнение, изменение и подсчет суммы элементов массива необходимо оформить в виде отдельных подпрограмм.

а)арифметическая прогрессия: a0 = 18, d = 43
б)элементы, кратные четырём, уменьшить в четыре раза
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
13.01.2017, 08:22
Ответы с готовыми решениями:

Вычисление суммы неповторяющихся элементов одномерного целочисленного массива A(M)
Составьте программу вычисления суммы неповторяющихся элементов одномерного целочисленного массива...

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

Вычисление суммы элементов массива по формуле
Программа на языке Паскаль АБС Даны х1,х2,…,х10. Определеить S=\sum_{i=1}^{10}\left(x_i-2...

Обработка элементов целочисленного массива
Помогите, пожалуйста! Дан массив целых чисел, состоящий из 20 элементов, заполнить его с...

8
Модератор
Эксперт по электронике
8518 / 4372 / 1648
Регистрация: 01.02.2015
Сообщений: 13,583
Записей в блоге: 9
14.01.2017, 00:02 2
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
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
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
LOCALS
 
.model small
 
.stack 100h
 
.data
 
        ; массив
        N               equ     10              ; длина массива
        Array           dw      N dup (0)       ; массив
        ; параметры арифметической прогрессии для заполения массива
        a0              equ     18
        d               equ     43
        ; сумма элементов массива
        Sum             dw      0
 
        ; сообщения
        msgArray        db      'Array: ', '$'
        msgDelimiter    db      ' ', '$'
        msgSum          db      'Summa: ', '$'
        msgCrLf         db      0Dh, 0Ah, '$'
 
.code
 
;заполняет массив Array числами арифметической прогрессии
;Array[i]:=a0+d*i
FillArray       proc
        push    ax
        push    cx
        push    si
 
        mov     cx,     N
        lea     si,     Array
        mov     ax,     a0
@@For:
        mov     [si],   ax
        add     ax,     d
        add     si,     2
        loop    @@For
 
        pop     si
        pop     cx
        pop     ax
        ret
FillArray       endp
 
;выводит содержимое массива Array на экран
ShowArray       proc
        push    ax
        push    cx
        push    dx
        push    si
 
        mov     ah,     09h
        lea     dx,     msgArray
        int     21h
 
        mov     cx,     N
        lea     si,     Array
@@For:
        mov     ax,     word ptr [si]
        call    Show_AX
 
        mov     ah,     09h
        lea     dx,     msgDelimiter
        int     21h
 
        add     si,     2
        loop    @@For
 
        mov     ah,     09h
        lea     dx,     msgCrLf
        int     21h
 
        pop     si
        pop     dx
        pop     cx
        pop     ax
        ret
ShowArray       endp
 
;вычисляет сумму массива Array
;выход
; ax - сумма элементов массива
SumArray        proc
        push    cx
        push    si
 
        mov     cx,     N
        lea     si,     Array
        mov     ax,     0
@@For:
        add     ax,     word ptr [si]
        add     si,     2
        loop    @@For
 
        pop     si
        pop     cx
        ret
SumArray        endp
 
;обработка массива Array
;элементы, кратные четырём, уменьшить в четыре раза
ProcessArray    proc
        push    ax
        push    cx
        push    si
 
        mov     cx,     N
        lea     si,     Array
@@For:
        test    word ptr [si],  0003h
        jnz     @@Next
        sar     word ptr [si],  1
        sar     word ptr [si],  1
@@Next:
        add     si,     2
        loop    @@For
 
        pop     si
        pop     cx
        pop     ax
        ret
ProcessArray    endp
 
; выводит число из регистра AX на экран
; входные данные:
; ax - число для отображения
Show_AX proc
        push    ax
        push    bx
        push    cx
        push    dx
        push    di
 
        mov     cx, 10
        xor     di, di          ; di - кол. цифр в числе
 
        ; если число в ax отрицательное, то
        ;1) напечатать '-'
        ;2) сделать ax положительным
        or      ax, ax
        jns     @@Conv
        push    ax
        mov     dx, '-'
        mov     ah, 2           ; ah - функция вывода символа на экран
        int     21h
        pop     ax
 
        neg     ax
 
@@Conv:
        xor     dx, dx
        div     cx              ; dl = num mod 10
        add     dl, '0'         ; перевод в символьный формат
        inc     di
        push    dx              ; складываем в стэк
        or      ax, ax
        jnz     @@Conv
        ; выводим из стэка на экран
@@Show:
        pop     dx              ; dl = очередной символ
        mov     ah, 2           ; ah - функция вывода символа на экран
        int     21h
        dec     di              ; повторяем пока di<>0
        jnz     @@Show
 
        pop     di
        pop     dx
        pop     cx
        pop     bx
        pop     ax
        ret
Show_AX endp
 
main    proc
        mov     ax,     @data
        mov     ds,     ax
 
        ; заполнение массива
        call    FillArray
        ; вывод массива на экран
        call    ShowArray
        ; вычисление суммы элеметов массива
        call    SumArray
        mov     Sum,    ax
        ; вывод сообщеия о значении суммы
        mov     ah,     09h
        lea     dx,     msgSum
        int     21h
        mov     ax,     Sum
        call    Show_AX
        mov     ah,     09h
        lea     dx,     msgCrLf
        int     21h
 
        ; обработка массива
        call    ProcessArray
        ; вывод массива на экран
        call    ShowArray
        ; вычисление суммы элеметов массива
        call    SumArray
        mov     Sum,    ax
        ; вывод сообщеия о значении суммы
        mov     ah,     09h
        lea     dx,     msgSum
        int     21h
        mov     ax,     Sum
        call    Show_AX
        mov     ah,     09h
        lea     dx,     msgCrLf
        int     21h
 
        mov     ax,     4C00h
        int     21h
main    endp
 
end     main
0
Заблокирован
15.01.2017, 02:17 3
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
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
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
EXTERN printf: PROC
EXTERN ExitProcess: PROC
 
.data
num_fmt db "%d ",0
sum_msg db 10,"Sum of array elements: %d",10,0
 
.const
a0  dd 18
d   dd 43
count dd 10
shr_ar dd 4 dup (3)
 
.code
 
main proc
    push rbp
    sub rsp, 280
    lea rbp, [rsp+32]
 
    mov rcx, rbp
    call fill_array
    mov rcx, rbp
    call print_array
    mov rcx, rbp
    call sum
    mov rcx, rbp
    call process_array
    mov rcx, rbp
    call print_array
    mov rcx, rbp
    call sum
 
    lea rsp, [rbp+248]
    pop rbp
    call ExitProcess
main endp
 
fill_array proc
    mov eax, a0
    mov rdx, rcx
    movsxd rcx, count
f_l:
    mov [rdx], eax
    add eax, d
    add rdx, 4
    loop f_l
 
    ret
fill_array endp
 
sum proc
    sub rsp, 32
    movq mm0, [rcx]
    mov rdx, 1
s_l:
    paddd mm0, [rcx + 8*rdx]
    inc rdx
    cmp rdx, 5
    jl s_l
    phaddd mm0, mm1
 
    lea rcx, sum_msg
    movd rdx, mm0
    call printf
 
    add rsp, 32
    ret
sum endp
 
print_array proc
    push rbx
    push rdi
    sub rsp, 32
 
    mov rdi, rcx ; array address
    xor rbx, rbx ; index
p_l:
    lea rcx, num_fmt
    movsxd rdx, dword ptr [rdi + 4 * rbx]
    call printf
    inc rbx
    cmp rbx, 10
    jl p_l
 
    add rsp, 32
    pop rdi
    pop rbx
    ret
print_array endp
 
process_array proc
    sub rsp, 32
    mov rax, rcx
    mov rcx, 2
 
u_l:
    movdqu xmm0, xmmword ptr [rax]
    vpand xmm1, xmm0, shr_ar
    pcmpeqd xmm1, xmm2
    psrld xmm0, 2
    vmaskmovps [rax], xmm1, xmm0
    add rax, 16
    loop u_l
 
; remainder
    vmovq xmm0, qword ptr [rax]
    vpand xmm1, xmm0, shr_ar
    pcmpeqd xmm1, xmm2
    vmovq xmm2, xmm1
    psrld xmm0, 2
    vmaskmovps [rax], xmm2, xmm0
 
    add rsp, 32
    ret
process_array endp
 
end
Код
18 61 104 147 190 233 276 319 362 405
Sum of array elements: 2115
18 61 26 147 190 233 69 319 362 405
Sum of array elements: 1830
0
Модератор
Эксперт по электронике
8518 / 4372 / 1648
Регистрация: 01.02.2015
Сообщений: 13,583
Записей в блоге: 9
15.01.2017, 09:31 4
nimazzzy, это masm64?
Где-то здесь на форуме попадалось подобие исследования быстродействия наборов команд при обработке массива: x86, MMX, XMM, AVX. Там AVX победил. В названии темы присутствует "AVX".
0
1718 / 567 / 187
Регистрация: 12.03.2016
Сообщений: 2,169
15.01.2017, 10:35 5
Цитата Сообщение от ФедосеевПавел Посмотреть сообщение
В названии темы присутствует "AVX".
В названии темы вообще не упоминаются никакие регистры. И при чем здесь AVX? MMX, XMM, 64-разрядные регистры общего назначения есть, YMM не вижу.
0
Модератор
Эксперт по электронике
8518 / 4372 / 1648
Регистрация: 01.02.2015
Сообщений: 13,583
Записей в блоге: 9
15.01.2017, 10:41 6
Я имел в виду другую тему, в которой был проведён опыт с использованием разных наборов команд.

В текущей теме всё просто - обычный x86 + DOS.
0
Заблокирован
15.01.2017, 11:52 7
Цитата Сообщение от ФедосеевПавел Посмотреть сообщение
nimazzzy, это masm64?
Да.
Цитата Сообщение от ФедосеевПавел Посмотреть сообщение
Где-то здесь на форуме попадалось подобие исследования быстродействия наборов команд при обработке массива: x86, MMX, XMM, AVX. Там AVX победил.
Это не удивительно
Цитата Сообщение от мановар Посмотреть сообщение
И при чем здесь AVX? MMX, XMM, 64-разрядные регистры общего назначения есть, YMM не вижу.
Да, все верно, с точки зрения использования avx на полную, здесь его нет. Элементов в массиве слишком уж мало, если загрузить в ymm, считай, уже больше половины массива. Но перемещение данных по маске - vmaskmovps - инструкция avx, на процессоре, который его не поддерживает, не заработает. К сожалению, уже даже avx2 мой проц не умеет. Обновляться надо.
0
Модератор
Эксперт по электронике
8518 / 4372 / 1648
Регистрация: 01.02.2015
Сообщений: 13,583
Записей в блоге: 9
15.01.2017, 14:55 8
Я прочитал, что Intel выпускает freeware эмулятор команд именно для проверки правильности программ с использованием этих всех наборов - Intel® Software Development Emulator (Intel® SDE)
https://software.intel.com/en-... t-emulator

И вот рассказ на хабре о нём
https://habrahabr.ru/post/99367/
0
0 / 0 / 0
Регистрация: 08.01.2017
Сообщений: 39
Записей в блоге: 1
16.01.2017, 10:32  [ТС] 9
спасибо всем, очень помогли
0
16.01.2017, 10:32
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.01.2017, 10:32
Помогаю со студенческими работами здесь

Вычисление суммы чисел по формуле без массива
Даны натуральное число n, действительные числа a1,a2,…,an. Постарайтесь обойтись без массивов – в...

Вычисление НОК элементов целочисленного массива
составьте программу вычисления НОК элементов целочисленного массива А(n), что расположены перед...

Вычисление чётных элементов целочисленного массива. Замена наибольшего элемента массива
Добрый вечер, прошу прощения что беспокою вас по столь лёгкой для вас теме, но у меня не получается...

Вычисление по формуле. X - сумма всех элементов массива; Y - произведение положительных элементов массива
Составить программу для вычисления по формуле X - сумма всех элементов массива; Y -...

Подсчёт суммы всех отрицательных элементов заданного целочисленного массива
Добрый вечер! Помогите с задачей из ЕГЭ Опишите на русском языке или на одном из языков...

Заполнение элементов массива по формуле
Найти элементы вещественного массиваY(всего 6 элементов) по формуле: Yi=0.1*tg 0.1i. элементы...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru