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

Ввод, сортировка и вывод массива целых чисел

24.12.2017, 19:25. Показов 3033. Ответов 1
Метки нет (Все метки)

Написать программу на языке Ассемблера, которая позволяет
ввести с клавиатуры массив и 8 целых чисел, упорядочить их по убы-
ванию и вывести на экран упорядоченный массив.
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
24.12.2017, 19:25
Ответы с готовыми решениями:

Ввод и вывод массива целых чисел Вычислить сумму модулей элементов массива,располроженных после первого отрицательного
Очень срочно,помогите пожалуйста,чем быстрее - тем лучше=) Ввод и вывод массива целых...

Ввод и вывод массива целых чисел Вычислить сумму модулей элементов массива,располроженных после первого отрицательного
Очень срочно,помогите пожалуйста,чем быстрее - тем лучше=) Ввод и вывод массива целых...

Ввод двух целых чисел, вывод их суммы
Дорогие форумчане, помогите разобраться почему программка не работает. Задача: ввод двух целых...

Лабораторная: Ввод-вывод чисел (целых, вещественных)
Помогите плис решить задание по информатике. Вот задание: 1. Создайте новый проект и сохраните...

1
Модератор
Эксперт по электронике
7894 / 4003 / 1545
Регистрация: 01.02.2015
Сообщений: 12,389
Записей в блоге: 2
24.12.2017, 19:51 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
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
LOCALS
 
.model small
 
.stack 100h
 
.data
        PromptA1        db      'A[', '$'
        PromptA2        db      ']=', '$'
        CrLf            db      0Dh, 0Ah, '$'
 
        A               dw      8 dup (0)
        SizeA           dw      ($-A)/2
 
        kbdBuffer       db      6, 0, 6 dup(0)
 
.code
 
main    proc
        mov     ax,     @data
        mov     ds,     ax
 
        ;ввод масива
        mov     cx,     [SizeA]
        lea     dx,     [A]
        call    InputArray
        ;сортировка массива
        call    QuickSort
        ;вывод массива
        call    ShowArray
 
        mov     ax,     4C00h
        int     21h
main    endp
 
;Ввод массива слов (word)
;cx - количество вводимых элементов
;ds:dx - адрес массива слов
InputArray      proc
        push    ax
        push    bx
        push    cx
        push    dx
        push    si
        push    di
 
        jcxz    @@Exit          ;если массив пустой - завершить
 
        mov     si,     1       ;индекс элемента массива
        mov     di,     dx      ;адрес текущего элемента массива
        @@ForI:
                ;вывод приглашения ввода элемента
                mov     ah,     09h
                lea     dx,     PromptA1
                int     21h
                mov     ax,     si
                call    Show_AX
                mov     ah,     09h
                lea     dx,     PromptA2
                int     21h
                ;ввод числа
                mov     ah, 0Ah ;ввод строки
                mov     dx, offset kbdBuffer
                int     21h
                mov     ah,09h  ;перевод строки (на новую строку)
                lea     dx, CrLf
                int     21h
 
                push    si
                lea     si, kbdBuffer+1 ; преобразование строки в число
                ;lea     di, Numer
                call    Str2Num
                pop     si
 
                ; проверка на ошибку
                jnc     @@NoError
 
                ; если есть ошибка ввода - повторить ввод
                jmp     @@ForI
 
                ; если нет ошибки ввода - сохранить число
                @@NoError:
                ;сохранение введённого числоа в массиве
                ;mov    [di],   ax
                ;переход к следующему элементу
                inc     si
                add     di,     2
        loop    @@ForI
@@Exit:
        pop     di
        pop     si
        pop     dx
        pop     cx
        pop     bx
        pop     ax
        ret
InputArray      endp
 
;Вывод массива слов (word)
;cx - количество выводимых элементов
;ds:dx - адрес массива слов
ShowArray       proc
        push    ax
        push    bx
        push    cx
        push    dx
        push    si
        push    di
 
        jcxz    @@Exit          ;если массив пустой - завершить
 
        mov     si,     1       ;индекс элемента массива
        mov     di,     dx      ;адрес текущего элемента массива
        @@ForI:
                mov     ax,     [di]
                call    Show_AX
                mov     ah,     02h
                mov     dl,     ' '
                int     21h
                ;переход к следующему элементу
                inc     si
                add     di,     2
        loop    @@ForI
@@Exit:
        pop     di
        pop     si
        pop     dx
        pop     cx
        pop     bx
        pop     ax
        ret
ShowArray       endp
 
; выводит знаковое 16-разрядное число из регистра 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
 
; преобразования строки в знаковое число
; на входе:
; ds:[si] - строка с числом
; ds:[di] - адрес числа
; на выходе
; ds:[di] - число
; CY - флаг переноса (при ошибке - установлен, иначе - сброшен)
Str2Num proc
        push    ax
        push    bx
        push    cx
        push    dx
        push    ds
        push    es
        push    si
 
        push    ds
        pop     es
 
        mov     cl, ds:[si]
        xor     ch, ch
 
        inc     si
 
        cmp     [si], byte ptr '-'
        jne     @@IsPositive
        inc     si
        dec     cx
@@IsPositive:
        jcxz    @@Error
 
        mov     bx, 10
        xor     ax, ax
 
@@Loop:
        mul     bx         ; умножаем ax на 10 ( dx:ax=ax*bx )
        mov     [di], ax   ; игнорируем старшее слово
        cmp     dx, 0      ; проверяем, результат на переполнение
        jnz     @@Error
 
        mov     al, [si]   ; Преобразуем следующий символ в число
        cmp     al, '0'
        jb      @@Error
        cmp     al, '9'
        ja      @@Error
        sub     al, '0'
        xor     ah, ah
        add     ax, [di]
        jc      @@Error    ; Если сумма больше 65535
        inc     si
 
        loop    @@Loop
 
        pop     si
        push    si
        or      ax, ax
        js      @@Error
        cmp     [si+1], byte ptr '-'
        jne     @@Positive
        neg     ax
        or      ax, ax
        jns     @@Error
@@Positive:
        mov     [di], ax
        clc
        pop     si
        pop     es
        pop     ds
        pop     dx
        pop     cx
        pop     bx
        pop     ax
        ret
@@Error:
        xor     ax, ax
        mov     [di], ax
        stc
        pop     si
        pop     es
        pop     ds
        pop     dx
        pop     cx
        pop     bx
        pop     ax
        ret
Str2Num endp
 
;Сортировка массива слов (word)
;Процедура-обёртка над процедурой QSort
;на входе:
;cx - количество элементов в массиве
;ds:dx - адрес массива слов
;на выходе:
;  неизменны все регистры
;  отсортированный массив
QuickSort       proc
        push    ax
        push    bx
        push    cx
        push    dx
        push    si
        push    di
        ;QSort(A, 0, N-1)
        mov     bx,     dx
        mov     si,     0
        mov     di,     cx
        dec     di
        shl     di,     1
        call    QSort
 
        pop     di
        pop     si
        pop     dx
        pop     cx
        pop     bx
        pop     ax
        ret
QuickSort       endp
 
;Быстрая сортировка
;на входе:
;  ds:bx - адрес массива
;  si    - адрес левой границы массива
;  di    - адрес правой границы массива
QSort   proc                    ;void QSort(int *a, int first, int last)
        push    ax              ;{
        push    bx
        push    cx
        push    dx
        push    si
        push    di
 
        cmp     si,     di      ;  if (first < last)
        jae     @@StopQSort     ;  {
        push    di
        push    si
        ;mov si, si             ;        int left = first,
        ;mov di, di             ;        int right = last,
        mov     dx,     di      ;        int middle = a[(left + right) / 2];
        mov     cx,     si
        shr     si,     1
        shr     di,     1
        sub     di,     si
        shr     di,     1
        add     si,     di
        shl     si,     1
        mov     ax,     [bx+si]
        mov     si,     cx
        mov     di,     dx
        @@DoWhile:              ;        do
                                ;        {
                                ;             while (a[left] < middle) left++;
                sub     si,     2
                @@WhileLeft:
                        add     si,     2
                        mov     cx,     [bx+si]
                        cmp     ax,     [bx+si]
                jg      @@WhileLeft
                                ;             while (a[right] > middle) right--;
                add     di,     2
                @@WhileRight:
                        sub     di,     2
                        mov     cx,     [bx+di]
                        cmp     ax,     [bx+di]
                jl      @@WhileRight
                                ;             if (left <= right)
                cmp     si,     di
                ja      @@BreakDoWhile
                                ;             {
                                ;                int tmp = a[left];
                                ;                a[left] = a[right];
                                ;                a[right] = tmp;
                mov     cx,     [bx+si]
                mov     dx,     [bx+di]
                mov     [bx+si],dx
                mov     [bx+di],cx
                                ;                left++;
                add     si,     2
                                ;                right--;
                sub     di,     2
                                ;            }
                                ;        } while (left <= right);
                cmp     si,     di
        jbe     @@DoWhile
        @@BreakDoWhile:
                                ;        QSort(a, first, right);
        mov     cx,     si
        pop     si
        call    QSort
                                ;        QSort(a, left, last);
        mov     si,     cx
        pop     di
        call    QSort
                                ;    }
                                ;  }
@@StopQSort:
        pop     di
        pop     si
        pop     dx
        pop     cx
        pop     bx
        pop     ax
        ret
QSort   endp                    ;}
 
end     main
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.12.2017, 19:51
Помогаю со студенческими работами здесь

Сортировка массива целых чисел A(n) по убыванию(используя метод обменная сортировка)
Помогите написать программу для сортировки массива целых чисел A(n) по убыванию(используя метод...

Ввод одномерного массива из N целых чисел
Задание: Моя реализация: long n1; m1:cout&lt;&lt;&quot;Vvedite n:&quot;&lt;&lt;endl; cin&gt;&gt;n1; if(n1&lt;1 ||...

Ввод с клавиатуры массива из 10 целых чисел
Написать программу, которая вводит с клавиатуры массив из 10 целых чисел, находит среди элементов...

Ввести массив целых чисел. Признаком конца ввода массива является ввод четырех чисел, дающих в среднем арифметическом 10
Ввести массив целых чисел, количество элементов которого заранее не известно. Признаком конца ввода...


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

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

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