3 / 3 / 1
Регистрация: 23.09.2019
Сообщений: 107
1

Сортировка двумерного массива по возрастанию построчно

02.12.2020, 13:31. Показов 1289. Ответов 9
Метки tasm (Все метки)

Author24 — интернет-сервис помощи студентам
Доброго времени суток! Столкнулся с такой проблемой, на которую мне не хватает собственного ума.
Написал код(видимо, очень хреновый) сортировки массива. Сортирует, вопросов нет. Только первые два элемента каждой строки, а в остальные столбцы записываются значения второй строки. Не могу понять, где я не прав. Надеюсь, поймёте вы.

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
mSort macro matrix, row, col, resMatrix
local rowLoop, colLoop, perm, next
  push ax ; Сохранение регистров, используемых в макросе, в стек
  push bx
  push cx
  push di
  push si
  push dx
 
  xor di, di ; Обнуляем смещение по строкам
  xor dx, dx 
  mov cx, row
rowLoop: ; Внешний цикл, проходящий по строкам
  push cx
  xor si, si ; Обнуляем смещение по столбцам
  mov cx, col
  sub cx, 1
colLoop: ; Внутренний цикл, проходящий по столбцам
  mov ax, col
  mul di ; Устанавливаем смещение по строкам
  add ax, si ; Устанавливаем смешение по столбцам
  mov bx, ax
  
  xor ax, ax
  mov ax, matrix[bx+2]
  cmp ax, matrix[bx]
  jl perm
  jg next
 
perm:
  mov resMatrix[bx], ax 
  mov dx, matrix[bx]
  mov resMatrix[bx+2], dx 
  xor dx, dx 
  xor ax, ax 
 
 
next:
  add si, 2 
  loop colLoop
 
  add di, 2 ; Переходим к следующей строке  
  pop cx
  loop rowLoop
 
  pop dx ; Перенос сохранённых значений обратно в регистры
  pop si
  pop di
  pop cx
  pop bx
  pop ax
endm mSort
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
02.12.2020, 13:31
Ответы с готовыми решениями:

Передача двумерного динамического массива в функцию построчно и сортировка
Всем доброго времени суток! Собственно сабж: есть двумерный динамический массив, который надо...

Сортировка двумерного массива по возрастанию
Как сортировать двумерный массив по возрастанию (полностью, а не только строки или столбцы)? То...

Сортировка двумерного массива по возрастанию
Помогите, пожалуйста с задачей.:-[ Необходимо отсортировать двумерный массив по возрастанию (не...

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

9
Модератор
Эксперт по электронике
8475 / 4334 / 1642
Регистрация: 01.02.2015
Сообщений: 13,455
Записей в блоге: 8
02.12.2020, 17:15 2
К этому макросу ещё и тестовый код нужен.

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

Запускаете
Windows Batch file
1
td myasm.exe
Соглашаетесь с отсутствием символьной отладочной информацией.
Нажимаете F7 и F8 для пошагового выполнения или F9 для выполнения до конца или до точки останова, которую ставите F5 или F2 (не помню точно).
Для просмотра дампа мышкой вызываете контекстное меню на дампе памяти, выбираете GoTo, вводите ds:0000 и наблюдаете свой сегмент данных.
0
3 / 3 / 1
Регистрация: 23.09.2019
Сообщений: 107
02.12.2020, 17:43  [ТС] 3
Цитата Сообщение от ФедосеевПавел Посмотреть сообщение
Попробуйте выполнить программу в отладчике по шагам
Задумывался над этим, но глядя на количество строк в коде, меня охватывал страх и неуверенность


Цитата Сообщение от ФедосеевПавел Посмотреть сообщение
К этому макросу ещё и тестовый код нужен
Могу даже сделать вот так:

(Начало нужного этой теме макроса на 178 строке)

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
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
.MODEL small
.STACK 100h
.486 ; Включает сборку инструкций для процессора 80386
.DATA
    endl db 13, 10, '$'
    tab db 09, '$'
    space db ' $'
    inputRows db 'Enter the number of rows: $'
    inputColumns db 'Enter the number of columns: $'
    inputElements db 'Enter matrix elements element by element: ', 13, 10, '$'
    inputMin db 'Enter the minimum number: $'
    inputMax db 'Enter the maximum number: $'
 
    menuInstruction db 'To control the menu, press the', 13, 10, 'corresponding key on the keyboard', 13, 10, '$'
    menu1 db '1. Display matrix', 13, 10, '$'
    menu2 db '2. Enter matrix from keyboard', 13, 10, '$'
    menu3 db '3. View transposed matrix', 13, 10, '$'
    menu4 db '4. Find the sum of the elements between [min..max] in each row', 13, 10, '$'
    menu5 db '5. Find strings of positive numbers', 13, 10, '$'
    menu6 db '6. Square negative numbers and sort', 13,10, '$'
    menu0 db '0. Exit the program', 13, 10, '$'
 
    sumRowElements db 'Sum of row elements: $'
    sumAboveDiagonal db 'Sum of elements above the main diagonal: $'
    posRowsFound db 'Rows consisting of positive elements: $'
 
    buffer db 20 dup(?)
    min dw 0
    max dw 0
    rows dw 1
    cols dw 1
    count dw 1
    currentMatrix dw 100 dup (0)
    exMatrix dw 100 dup (0)
    transposedMatrix dw 100 dup (0)
 
 
mReadMatrix macro matrix, row, col, matrix2
local rowLoop, colLoop
JUMPS ; Директива, делающая возможным большие прыжки
    push bx ; Сохранение регистров, используемых в макросе, в стек
    push cx
    push si
 
    xor bx, bx ; Обнуляем смещение по строкам
    mov cx, row
 
rowLoop: ; Внешний цикл, проходящий по строкам
    push cx
 
    xor si, si ; Обнуляем смещение по столбцам
    mov cx, col
colLoop: ; Внутренний цикл, проходящий по столбцам
    mReadAX buffer 4 ; Макрос ввода значения регистра AX с клавиатуры
 
    mov matrix[bx][si], ax
    mov matrix2[bx][si], ax
    add si, 2 ; Переходим к следующему элементу (размером в слово)
    loop colLoop
 
    mWriteStr endl ; Макрос вывода строки на экран [Приложение 3]
    ; Перенос курсора и каретки на следующую строку
 
    add bx, col ; Увеличиваем смещение по строкам
    add bx, col ; (дважды, так как размер каждого элемента - слово)
 
    pop cx
    loop rowLoop
 
    pop si ; Перенос сохранённых значений обратно в регистры
    pop cx
    pop bx
NOJUMPS ; Прекращение действия директивы JUMPS
endm mReadMatrix
 
 
mWriteMatrix macro matrix, row, col
local rowLoop, colLoop
    push ax ; Сохранение регистров, используемых в макросе, в стек
    push bx
    push cx
    push si
    
    xor bx, bx ; Обнуляем смещение по строкам
    mov cx, row
    rowLoop: ; Внешний цикл, проходящий по строкам
    push cx
 
    xor si, si ; Обнуляем смещение по столбцам
    mov cx, col
colLoop: ; Внутренний цикл, проходящий по столбцам
    mov ax, matrix[bx][si] ; bx - смещение по строкам, si - по столбцам
 
    mWriteAX ; Макрос вывода значения регистра AX на экран 
 
    ; Вывод текущего элемента матрицы
    xor ax, ax
    mWriteStr tab ; Макрос вывода строки на экран 
 
    ; Вывод на экран табуляции, разделяющей элементы строки
    add si, 2 ; Переходим к следующему элементу (размером в слово)
    loop colLoop
 
    mWriteStr endl ; Макрос вывода строки на экран *Приложение 3]
    
    ; Перенос курсора и каретки на следующую строку
    add bx, col ; Увеличиваем смещение по строкам
    add bx, col ; (дважды, так как размер каждого элемента - слово)
 
    pop cx
    loop rowLoop
 
    pop si ; Перенос сохранённых значений обратно в регистры
    pop cx
    pop bx
    pop ax
endm mWriteMatrix
 
 
mMulNegative macro matrix, row, col, resMatrix
local rowLoop, colLoop, skip 
  push ax ; Сохранение регистров, используемых в макросе, в стек
  push bx
  push cx
  push di
  push si
  push dx
 
  xor di, di ; Обнуляем смещение по строкам
  mov cx, row
rowLoop: ; Внешний цикл, проходящий по строкам
  push cx
  xor si, si ; Обнуляем смещение по столбцам
  mov cx, col
colLoop: ; Внутренний цикл, проходящий по столбцам
  mov ax, col
  mul di ; Устанавливаем смещение по строкам
  add ax, si ; Устанавливаем смешение по столбцам
  mov bx, ax
  mov ax, matrix[bx]
  test ax, ax 
  jns skip
  neg ax
  mul ax 
  push ax
skip:
  push ax ; Заносим текущий элемент в стек
 
  mov ax, col
  mul di ; Устанавливаем смещение по строкам
  add ax, si ; Устанавливаем смешение по столбцам
 
  ; (смещения по строкам и столбцам меняются
  ; местами по сравнению с оригинальной матрицей)
  mov bx, ax
  pop ax
  mov resMatrix[bx], ax ; Заносим в новую матрицу элемент,
   ; сохранённый в стеке
 
  add si, 2 ; Переходим к следующему элементу
 
  ; (размером в слово)
  loop colLoop
 
  add di, 2 ; Переходим к следующей строке  
  pop cx
  loop rowLoop
 
  pop dx ; Перенос сохранённых значений обратно в регистры
  pop si
  pop di
  pop cx
  pop bx
  pop ax
endm mMulNegative
 
 
mSort macro matrix, row, col, resMatrix
local rowLoop, colLoop, perm, next
  push ax ; Сохранение регистров, используемых в макросе, в стек
  push bx
  push cx
  push di
  push si
  push dx
 
  xor di, di ; Обнуляем смещение по строкам
  xor dx, dx 
  mov cx, row
rowLoop: ; Внешний цикл, проходящий по строкам
  push cx
  xor si, si ; Обнуляем смещение по столбцам
  mov cx, col
  sub cx, 1
colLoop: ; Внутренний цикл, проходящий по столбцам
  mov ax, col
  mul di ; Устанавливаем смещение по строкам
  add ax, si ; Устанавливаем смешение по столбцам
  mov bx, ax
  
  xor ax, ax
  mov ax, matrix[bx+2]
  cmp ax, matrix[bx]
  jl perm
  jg next
 
perm:
  mov resMatrix[bx], ax 
  mov dx, matrix[bx]
  mov resMatrix[bx+2], dx 
  xor dx, dx 
  xor ax, ax 
 
 
next:
  add si, 2 
  loop colLoop
 
  add di, 2 ; Переходим к следующей строке  
  pop cx
  loop rowLoop
 
  pop dx ; Перенос сохранённых значений обратно в регистры
  pop si
  pop di
  pop cx
  pop bx
  pop ax
endm mSort
 
 
mSumOfRowElements macro matrix, row, col, count
local
    push ax
    push bx
    push cx
    push dx
    push di
    push si
 
    xor ax, ax
    xor bx, bx
    xor cx, cx
    xor dx, dx
    xor di, di
    xor si, si
 
    mov cx, col
    mov di, 0
colLoop:
    push cx
    xor bx, bx
    mov cx, row
    mov dx, matrix[bx][si]
    test dx, dx
    jns rowLoop
    neg dx
rowLoop:
    mov ax, matrix[bx][si]
    test ax, ax
    jns loop1
    neg ax
loop1:
    cmp ax, dx
    jle loop2
    mov dx, ax
    mov di, bx
loop2:
    add bx, col
    add bx, col
    loop rowLoop
    push di
    mov di, count
    sub di, 1
    mov count, di
    pop di
 
    push cx
    mov cx, count
    sub cx, 1
    cmp cx, 0
    je colLoop
    push bx
    mov bx, di
    add bx, col
    add bx, col
    mov ax, matrix[bx][si]
cicle1:
    add bx, col
    add bx, col
    mov dx, matrix[bx][si]
    imul dx
    loop cicle1
    pop cx
    pop bx
    add si, 2
 
    mWriteAX
    loop colLoop
 
 
endm mSumOfRowElements
 
 
mTransposeMatrix macro matrix, row, col, resMatrix
local rowLoop, colLoop
    push ax ; Сохранение регистров, используемых в макросе, в стек
    push bx
    push cx
    push di
    push si
    push dx
 
    xor di, di ; Обнуляем смещение по строкам
    mov cx, row
rowLoop: ; Внешний цикл, проходящий по строкам
    push cx
    xor si, si ; Обнуляем смещение по столбцам
    mov cx, col
colLoop: ; Внутренний цикл, проходящий по столбцам
    mov ax, col
    mul di ; Устанавливаем смещение по строкам
    add ax, si ; Устанавливаем смешение по столбцам
    mov bx, ax
    mov ax, matrix[bx]
    push ax ; Заносим текущий элемент в стек
 
    mov ax, row
    mul si ; Устанавливаем смещение по строкам
    add ax, di ; Устанавливаем смешение по столбцам
 
    ; (смещения по строкам и столбцам меняются
    ; местами по сравнению с оригинальной матрицей)
    mov bx, ax
    pop ax
    mov resMatrix[bx], ax ; Заносим в новую матрицу элемент,
     ; сохранённый в стеке
 
    add si, 2 ; Переходим к следующему элементу
 
    ; (размером в слово)
    loop colLoop
 
    add di, 2 ; Переходим к следующей строке   
    pop cx
    loop rowLoop
 
    pop dx ; Перенос сохранённых значений обратно в регистры
    pop si
    pop di
    pop cx
    pop bx
    pop ax
endm mTransposeMatrix
 
 
 
mSearchPositiveRows macro matrix, row, col
local rowLoop, colLoop, positiveNumber, nonzeroNumber
    push ax ; Сохранение регистров, используемых в макросе, в стек
    push bx
    push cx
    push si
    push di
    push dx
 
    mov di, 1 ; di - счётчик строк, начиная с единицы
    xor dx, dx ; dx - счётчик отрицательных чисел в строке
    xor bx, bx ; Обнуляем смещение по строкам
    mov cx, row
rowLoop:
    push cx
 
    xor si, si ; Обнуляем смещение по столбцам
    mov cx, col
colLoop:
    mov ax, matrix[bx][si] ; bx - смещение по строкам, si - по столбцам
 
    or ax, ax ; Проверяем, отрицательное ли число
    jns positiveNumber ; Если найдено отрицательное число, то
    inc dx ; Увеличиваем счётчик отрицательных числе в строке
    positiveNumber:
 
    add si, 2 ; Переходим к следующему элементу (размером в слово)
    loop colLoop
 
    or dx, dx ; Проверяем счётчик отрицательных чисел на равенство 0
    jnz nonzeroNumber ; Если счётчик отрицательных чисел строки пуст, то:
    mov ax, di
    mWriteAX ; Макрос вывода значения регистра AX на экран
 
    ; Выводим номер текущей строки
    mWriteStr space ; Макрос вывода строки на экран 
 
    ; Выводим пробел между номерами строк
    nonzeroNumber:
 
    xor dx, dx ; Обнуляем счётчик отрицательных чисел
    inc di ; Увеличиваем счётчик строк
    add bx, col ; Увеличиваем смещение по строкам
    add bx, col ; (дважды, так как размер каждого элемента - слово)
    pop cx
    loop rowLoop
 
    pop dx ; Перенос сохранённых значений обратно в регистры
    pop di
    pop si
    pop cx
    pop bx
    pop ax
endm mSearchPositiveRows
 
mReadAX macro buffer, size
local input, startOfConvert, endOfConvert
    push bx ; Сохранение регистров, используемых в макросе, в стек
    push cx
    push dx
 
input:
    mov [buffer], size ; Задаём размер буфера
    mov dx, offset [buffer]
    mov ah, 0Ah ; 0Ah - функция чтения строки из консоли
    int 21h
 
    mov ah, 02h ; 02h - функция вывода символа на экран
    mov dl, 0Dh
    int 21h ; Переводим каретку на новою строку
 
    mov ah, 02h ; 02h - функция вывода символа на экран
    mov dl, 0Ah
    int 21h ; Переносим курсор на новою строку
 
    xor ah, ah
    cmp ah, [buffer][1] ; Проверка на пустую строку
    jz input ; Если строка пустая - переходим обратно к вводу
 
    xor cx, cx
    mov cl, [buffer][1] ; Инициализируем переменную счетчика
 
    xor ax, ax
    xor bx, bx
    xor dx, dx
    mov bx, offset [buffer][2] ; bx = начало строки
 
     ; (строка начинается со второго байта)
    cmp [buffer][2], '-' ; Проверяем, отрицательное ли число
    jne startOfConvert ; Если отрицательное - пропускаем минус
    inc bx
    dec cl
 
startOfConvert:
 
    mov dx, 10
    mul dx ; Умножаем на 10 перед сложением с младшим разрядом
    cmp ax, 8000h ; Если число выходит за границы, то
    jae input ; возвращаемся на ввод числа
 
    mov dl, [bx] ; Получаем следующий символ
    sub dl, '0' ; Переводим его в числовой формат
 
    add ax, dx ; Прибавляем к конечному результату
    cmp ax, 8000h ; Если число выходит за границы, то
    jae input ; врзвращаемся на ввод числа
 
    inc bx ; Переходим к следующему символу
    loop startOfConvert
 
    cmp [buffer][2], '-' ; Ещё раз проверяем знак
    jne endOfConvert ; Если знак отрицательный, то
    neg ax ; инвертируем число
 
endOfConvert:
    pop dx ; Перенос сохранённых значений обратно в регистры
    pop cx
    pop bx
endm mReadAX
 
 
mWriteAX macro
local convert, write
    push ax ; Сохранение регистров, используемых в макросе, в стек
    push bx
    push cx
    push dx
    push di
 
    mov cx, 10 ; cx - основание системы счисления
    xor di, di ; di - количество цифр в числе
 
    or ax, ax ; Проверяем, равно ли число в ax нулю и устанавливаем флаги
    jns convert ; Переход к конвертированию, если число в ax положительное
 
    push ax
 
    mov dx, '-'
    mov ah, 02h ; 02h - функция вывода символа на экран
    int 21h ; Вывод символа "-"
 
    pop ax
    neg ax ; Инвертируем отрицательное число
 
convert:
    xor dx, dx
 
    div cx ; После деления dl = остатку от деления ax на cx
    add dl, '0' ; Перевод в символьный формат
    inc di ; Увеличиваем количество цифр в числе на 1
    
    push dx ; Складываем в стек
 
    or ax, ax ; Проверяем, равно ли число в ax нулю и устанавливаем флаги
    jnz convert ; Переход к конвертированию, если число в ax не равно нулю
 
write: ; Вывод значения из стека на экран
    pop dx ; dl = очередной символ
 
    mov ah, 02h
    int 21h ; Вывод очередного символа
    
    dec di ; Повторяем, пока di <> 0
    jnz write
 
    pop di ; Перенос сохранённых значений обратно в регистры
    pop dx
    pop cx
    pop bx
    pop ax
endm mWriteAX
 
 
mWriteStr macro string
    push ax ; Сохранение регистров, используемых в макросе, в стек
    push dx
 
    mov ah, 09h ; 09h - функция вывода строки на экран
    mov dx, offset string
    int 21h
 
    pop dx ; Перенос сохранённых значений обратно в регистры
    pop ax
endm mWriteStr
 
 
mCLS macro
    push ax ; Сохранение регистров, используемых в макросе, в стек
    push bx
    push cx
    push dx
 
    mov ah, 10h
    mov al, 3h
    int 10h ; Включение режима видеоадаптора с 16-ю цветами
 
    mov ax, 0600h ; ah = 06 - прокрутка вверх
     ; al = 00 - строки появляются снизу и заполняются нулями
    mov bh, 00011110b ; 0001 - синий (фон), 1110 - желтый (текст)
    mov cx, 0000b ; ah = 00 - строка верхнуго левого угла
    ; al = 00 - столбец верхнего левого угла
 
    mov dx, 184Fh ; dh = 18h - строка нижнего правого угла
    ; dl = 4Fh - столбец нижнего правого угла
 
    int 10h ; Очистка экрана и установка цветов фона и текста
 
    mov dx, 0 ; dh - строка, dl - столбец
    mov bh, 0 ; Номер видео-страницы
    mov ah, 02h ; 02h - функция установки позиции курсора
    int 10h ; Устанавливаем курсор на позицию (0, 0)
 
    pop dx ; Перенос сохранённых значений обратно в регистры
    pop cx
    pop bx
    pop ax
endm mCLS
 
 
.CODE
Start:
    mov ax, @data
    mov ds, ax
 
    ;include macros.asm ; Подключение файла со всеми вышеописанными макросами
 
    ; Вывод на экран меню, а также осуществление выбора следующего пункта программы
menu:
    mCLS ; Макрос очистки экрана и установки вида окна
 
    mWriteStr menuInstruction ; Макрос вывода строки на экран 
    mWriteStr endl
    mWriteStr menu1
    mWriteStr menu2
    mWriteStr menu3
    mWriteStr menu4
    mWriteStr menu5
    mWriteStr menu6
    mWriteStr menu0
 
    mov ah, 00h
    int 16h ; Ожидание нажатия символа и получение его значения в al
 
    cmp al, "1"
    je writeMatrix
 
    cmp al, "2"
    je consoleInput
 
    cmp al, "3"
    je transposeMatrix
 
    cmp al, "4"
    je task1
 
    cmp al, "5"
    je task2
 
    cmp al, "6"
    je task3
 
    cmp al, "0"
    je exit
 
    jmp menu
 
    ; Вывод элементов матрицы на экран
writeMatrix:
    mCLS ; Макрос очистки экрана и установки вида окна  
    mWriteMatrix currentMatrix, rows, cols
    mov ah, 07h ; Задержка экрана
    int 21h
    jmp menu
 
    ; Ввод элементов матрицы из консоли
consoleInput:
    mCLS ; Макрос очистки экрана и установки вида окна  
 
    mWriteStr inputRows ; Макрос вывода строки на экран  
    mReadAX buffer 2 ; Макрос ввода значения регистра AX с клавиатуры
 
    ; Ввод количества строк
    mov rows, ax
    mov count, ax
    mWriteStr endl ; Макрос вывода строки на экран 
 
    mWriteStr inputColumns ; Макрос вывода строки на экран  
    mReadAX buffer 2 ; Макрос ввода значения регистра AX с клавиатуры
 
    ; Ввод количества столбцов
    mov cols, ax
    mWriteStr endl ; Макрос вывода строки на экран
 
    mWriteStr inputElements ; Макрос вывода строки на экран
 
    mReadMatrix currentMatrix, rows, cols, exMatrix
    jmp writeMatrix
 
    ; Получение и вывод транспонированной матрицы
transposeMatrix:
    mCLS ; Макрос очистки экрана и установки вида окна
 
    mWriteMatrix currentMatrix, rows, cols
    mWriteStr endl ; Макрос вывода строки на экран
    mWriteStr endl
    mTransposeMatrix currentMatrix, rows, cols, transposedMatrix
    mWriteMatrix transposedMatrix, cols, rows
 
    mov ah, 07h ; Задержка экрана
    int 21h
    jmp menu
 
    ; Получение суммы элементов всех строк в пределах [min..max]
task1:
    mCLS ; Макрос очистки экрана и установки вида окна
 
    mWriteStr inputMin ; Макрос вывода строки на экран 
    mReadAX buffer 4 ; Макрос ввода значения регистра AX с клавиатуры
 
    ; Ввод нижнего предела
    mov min, ax
    mWriteStr endl
 
    mWriteStr inputMax ; Макрос вывода строки на экран 
    mReadAX buffer 4 ; Макрос ввода значения регистра AX с клавиатуры
 
    ; Ввод верхнего предела
    mov max, ax
    mWriteStr endl ; Макрос вывода строки на экран 
 
    mov ax, max
    cmp ax, min
    jge notSwap ; Если максимальное и минимальное числа введены неверно,
    xchg min, ax ; то меняем их местами
    mov max, ax
 
notSwap:
    mCLS ; Макрос очистки экрана и установки вида окна 
    mWriteMatrix currentMatrix, rows, cols
    mWriteStr endl ; Макрос вывода строки на экран
    mWriteStr endl
    mWriteStr sumRowElements
    mWriteStr endl
    ;mSumOfRowElements currentMatrix, rows, cols, min, max
 
    mov ah, 07h ; Задержка экрана
    int 21h
    jmp menu
 
    ; Получение строк, состоящих только из положительных элементов
task2:
    mCLS ; Макрос очистки экрана и установки вида окна 
    mWriteMatrix currentMatrix, rows, cols
    mWriteStr endl ; Макрос вывода строки на экран 
    mWriteStr endl
    mWriteStr posRowsFound
    mSearchPositiveRows currentMatrix, rows, cols
 
    mov ah, 07h ; Задержка экрана
    int 21h
    jmp menu
 
    ; Получение суммы элементов выше главной диагонали
task3:
    mCLS ; Макрос очистки экрана и установки вида окна  
    mWriteMatrix currentMatrix, rows, cols
    mWriteStr endl ; Макрос вывода строки на экран 
    mWriteStr endl
    ;mWriteStr sumAboveDiagonal
    mMulNegative currentMatrix, rows, cols, exMatrix
    mWriteMatrix exMatrix, cols, rows
    mWriteStr endl ; Макрос вывода строки на экран 
    mWriteStr endl
    mSort exMatrix, rows, cols, exMatrix
    mWriteMatrix exMatrix, cols, rows
 
    mov ah, 07h ; Задержка экрана
    int 21h
    jmp menu
 
    ; Завершение программы
exit:
    mov ax, 4c00h
    int 21h
end Start
0
Модератор
Эксперт по электронике
8475 / 4334 / 1642
Регистрация: 01.02.2015
Сообщений: 13,455
Записей в блоге: 8
02.12.2020, 18:06 4
Цитата Сообщение от fYm13 Посмотреть сообщение
Задумывался над этим, но глядя на количество строк в коде, меня охватывал страх и неуверенность
Всё же попробуйте - других тоже охватывают сходные эмоции - вы не одиноки.
0
3 / 3 / 1
Регистрация: 23.09.2019
Сообщений: 107
02.12.2020, 20:56  [ТС] 5
Какой-то процесс пошел, но всё равно не то...


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
mSort macro matrix, row, col, resMatrix
local rowLoop, colLoop, perm, next, perm2
  push ax ; Сохранение регистров, используемых в макросе, в стек
  push bx
  push cx
  push di
  push si
  push dx
 
  xor di, di ; Обнуляем смещение по строкам
  xor dx, dx 
  mov cx, row
rowLoop: ; Внешний цикл, проходящий по строкам
  mov bx, cx
  push cx
  xor si, si ; Обнуляем смещение по столбцам
  mov cx, col
  sub cx, 1
  
colLoop: ; Внутренний цикл, проходящий по столбцам
  mov ax, col
  mul di ; Устанавливаем смещение по строкам
  add ax, si ; Устанавливаем смешение по столбцам
  mov bx, ax
  
  xor ax, ax
  mov ax, matrix[bx]
  cmp ax, matrix[bx+2]
  jg perm
  je next
 
perm:
  mov dx, matrix[bx+2]
  mov resMatrix[bx], dx 
  mov resMatrix[bx+2], ax 
  xor dx, dx 
  xor ax, ax 
  
  cmp si, 2
  jge perm2
 
perm2: 
  mov ax, resMatrix[bx]
  cmp ax, resMatrix[bx-2]
  jl perm3
  jg next
 
perm3: 
  mov dx, resMatrix[bx-2]
  mov resMatrix[bx], dx
  mov resMatrix[bx-2], ax
  xor dx, dx 
  xor ax, ax
 
next:
  add si, 2 
  loop colLoop
 
  add di, 2 ; Переходим к следующей строке  
  pop cx
  loop rowLoop
 
  pop dx ; Перенос сохранённых значений обратно в регистры
  pop si
  pop di
  pop cx
  pop bx
  pop ax
endm mSort
Миниатюры
Сортировка двумерного массива по возрастанию построчно  
0
3 / 3 / 1
Регистрация: 23.09.2019
Сообщений: 107
02.12.2020, 21:18  [ТС] 6
Почему-то теперь двигает элемент максимум на 4 позиции и останавливается.

Но в идеале, нужно отсортировать только строку, а не весь массив. То есть, каждую строку в массиве отдельно.
0
Модератор
Эксперт по электронике
8475 / 4334 / 1642
Регистрация: 01.02.2015
Сообщений: 13,455
Записей в блоге: 8
02.12.2020, 22:05 7
Завтра в обед постараюсь посмотреть.
Только уточните задачу - не могу уяснить, что сортировать нужно.

И ещё. Обычно для алгоритмов (типа сортировка, выделение слова и пр.) делаю программку на C/Delphi и прописываю её строки в комментариях к ассемблеру - это же алгоритмическое решение, не зависящее от языка.
0
3 / 3 / 1
Регистрация: 23.09.2019
Сообщений: 107
03.12.2020, 13:58  [ТС] 8
По задаче:
Нужно заменить все отрицательные числа массива на их квадраты, после этого - отсортировать построчно по возрастанию.
С заменой проблем нет, а сортировка сами видите какая.

Почему на ассемблере:
Дали такое задание в университете. Предмет - машинно-зависимые языки программирования.
0
Модератор
Эксперт по электронике
8475 / 4334 / 1642
Регистрация: 01.02.2015
Сообщений: 13,455
Записей в блоге: 8
05.12.2020, 11:42 9
Мне кажется, что
Assembler
1
2
3
4
5
colLoop: ; Внутренний цикл, проходящий по столбцам
  mov ax, col
  mul di ; Устанавливаем смещение по строкам
  add ax, si ; Устанавливаем смешение по столбцам
  mov bx, ax
упускается размер одного элемента, поэтому неправильная адресация элементов матрицы, начиная со строки 2
1
3 / 3 / 1
Регистрация: 23.09.2019
Сообщений: 107
11.12.2020, 16:17  [ТС] 10
Цитата Сообщение от ФедосеевПавел Посмотреть сообщение
упускается размер одного элемента, поэтому неправильная адресация элементов матрицы, начиная со строки 2
Действительно, смена адресации массива помогла решению проблемы.
0
11.12.2020, 16:17
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
11.12.2020, 16:17
Помогаю со студенческими работами здесь

Сортировка двумерного массива по возрастанию
есть массив Array ( =&gt; Array ( =&gt; 7 =&gt; Левит Евгений...

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

Сортировка двумерного массива по возрастанию
Здравствуйте. Помогите пожалуйста решить простую задачу, недавно перешел на с# и не могу правильно...

Сортировка двумерного массива по возрастанию
задаем двумерный массив с клавиатуры и надо чтоб выводил значения по возрастанию (т.е сортировку...

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

Сортировка двумерного массива по убыванию и возрастанию
Мне нужно написать программу сортировки массива(по возрастанию и убыванию), что бы можно было...


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

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

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