Форум программистов, компьютерный форум, киберфорум
Assembler для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.55/11: Рейтинг темы: голосов - 11, средняя оценка - 4.55
19 / 19 / 5
Регистрация: 17.10.2010
Сообщений: 247
1

[MASM] Найти сумму наименьших элементов каждой строки матрицы

15.02.2012, 23:41. Показов 2203. Ответов 14
Метки нет (Все метки)

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
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
page  80,120    
;--------------------------------- Џ®«Ґ б⥪* --------------------------------------
sseg     segment  stack 'stack'                            ; ‡*ў¤***п ᥣ¬Ґ*в* б⥪*
           db 128 dup(?)                           ; Џ®«Ґ ¤«п б⥪* ஧¬?஬ 128 Ў*©в
sseg     ends                                              ; Љ?*Ґжм ᥣ¬Ґ*в* б⥪*
;-------------------- Џ®«п ¤**Ёе ---------------------------------------
dseg     segment 'data'        ; ‡*ў¤***п ᥣ¬Ґ*в* ¤**Ёе
    text1   db    'Џа®Ја*¬¬* бв*ав®ў*«*',13,10,'$'  
    text2   db    'Џ®¤бзҐв бг¬¬л ¬Ё*Ё¬*«м*ле н«-в®ў ў бва®ЄҐ'13,10,'$' 
    
    mas db  12,-23,44,22
        db  2,21,22,44
        db  33,21,32,11
        db  3,12,-11,12
 
    sum dw  0
    nl      db      13,10,'$'
    StrMin dw 4 dup(?),'$'
    Negate db ?
 dseg     ends                             
;------------------------------------ ’ҐЄбв   Їа®Ја*¬Ё -----------------------------------
cseg    segment 'code'                                  ; ‡*ў¤***п ᥣ¬Ґ*в* Є®¬**¤
        assume  cs:cseg, ds:dseg, ss:sseg    ;‚бв**®ў«Ґ**п ў?¤Ї®ў?¤*®бв? ¬?¦ cҐЈ¬Ґ*в*Ё¬Ё 
  start proc far                              ;Џ®з*в®Є Їа®жҐ¤гаЁ start (’®зЄ* ўе®¤г - start)
    mov   ax, dseg                      ;?*?ж?*«?§*ж?п ᥣ¬Ґ*в*®Ј® ॣ?бва* ds **
    mov   ds, ax                        ; Їа®Ја*¬*Ё© ᥣ¬Ґ*в ¤**Ёе dseg
;--------------------------------------------------------
m1: lea   dx, text1         ; ‡*ў**в*¦гў***п  г  аҐЈ?бва  dx ?§ ᥣ¬Ґ*в* ¤**Ёе *¤аҐбЁ 
    call  WrStr          ; ‡*ўҐа*Ґ**п ¤® Їа®жҐ¤гаЁ WrStr ўЁўҐ¤Ґ**п ** ҐЄа** ⥪бв* text1
    mov   dx, offset text2 ; ‡*ў**в*¦гў***п  г  аҐЈ?бва  dx ?§ ᥣ¬Ґ*в* ¤**Ёе *¤аҐбЁ
    call  WrStr          ; ‡*ўҐа*Ґ**п ¤® Їа®жҐ¤гаЁ WrStr ўЁўҐ¤Ґ**п ** ҐЄа** ⥪бв* text2
;------------------------- ------------------------------
m2:;--------------------------OUTTING BEGIN_______________________  
    xor     si,si
    xor     ax,ax
    xor     bx,bx
    xor     di,di
        c: ;---------------
    mov     cx,4
    mov     bp,cx
    dec     bp  ;x=3
    sub     bp,3    ;x=3-i
    mov     bl,mas[si][bp]
        m:;----------------
    mov     al,mas[si][bp]
    cmp     bl,mas[si][bp]
    jnle        set                                                      ВОТ ОН ЭТОТ УСЛОВНЫЙ ПЕРЕХОД
 
    back:
    cbw
    call        StrCon
    lea     dx,strmin
    call        wrstr
    call        clear
    inc     bp
    cmp     bp,4
jne     m
    mov     ax,sum
    add     ax,bx
    mov     sum,ax
    lea     dx,nl
    call        wrstr
    cmp     si,12
    je      m4
    add     si,4
loop    c
set:
    mov         bl,mas[si][bp]
    jmp     back
;-----------------------------------------------
m4: 
        mov     ax,sum
    call        strcon
    lea     dx,strmin
    call        wrstr
 
    mov     ah, 4Ch             ;”г*Єж?п §*ўҐаиҐ**п Їа®Ја*¬Ё
    int     21h                 ;ЏҐаҐаЁў***п MS-DOS
  start  endp                       ;Љ?*Ґжм   Їа®жҐ¤гаЁ   start
; ************************************************
WrStr  proc near                             ; Џ®з*в®Є Їа®жҐ¤гаЁ (Ї?¤Їа®Ја*¬Ё) WrStr
          mov   ah,09h                      ;ўЁўҐ¤Ґ**п ** ҐЄа** ап¤Є* бЁ¬ў®«?ў, ®Ў¬Ґ¦Ґ*Ёе
          int   21h                          ; бЁ¬ў®«®¬ $ *Ў® Є®¤®¬ 24h
          ret                                  ; Џ®ўҐа*Ґ**п § Їа®жҐ¤гаЁ
WrStr  endp       
;----------------------------------------------------
StrCon proc 
push ax
push cx
push dx 
push bx
push si
 
mov cx, 10 
lea si, StrMin + 3 
mov Negate, 0 
cmp ax, 8000h 
jb m5 
neg ax 
mov Negate, 1 
m5: 
cmp ax, 10 
jb m6 
cwd 
div cx 
or dl, 30h 
mov [si], dl 
dec si 
jmp m5 
m6: 
or al, 30h 
mov [si], al 
cmp Negate, 0 
jz m7 
dec si 
mov byte ptr [si], '-' 
m7 : pop si
pop bx
pop dx
pop cx
pop ax 
ret 
StrCon endp
clear proc
push cx
push dx
push si
lea si,StrMin
mov cx,4
re: mov dl,20h
mov [si],dl
inc si
loop re
pop si
pop dx
pop cx
ret
clear endp
;-------------------------------------------------------
cseg     ends                                  ; K?*Ґжм ᥣ¬Ґ*в* Є®¬**¤
         end   start                           ; Љ?*Ґжм Їа®Ја*¬Ё - end, в®зЄ* ўе®¤г - start
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.02.2012, 23:41
Ответы с готовыми решениями:

Найти сумму наименьших элементов каждой строки матрицы
погамите

Найти сумму наименьших элементов каждой строки матрицы
7. Разработать алгоритмы и программы решения задачи: a) найти сумму наименьших элементов каждой...

Найти сумму наименьших элементов каждой строки матрицы и их координат
Написать программу обработки матриц,выполнить ее тестирование Задана квадратная матрица А размером...

Найти сумму наименьших элементов каждой строки матрицы и их координаты
Здравствуйте! в Возможно такая темы была уже, но я так и не нашел( В общем задача такая: Задана...

14
43 / 27 / 6
Регистрация: 27.09.2011
Сообщений: 280
16.02.2012, 11:41 2
vaselo, а разве бывает ,что меньше или не равно....

вот такие команды буду работать но то что вы написали врятли...
jl - меньше
ja - больше
jae - больше или равно
jle - меньше или равно
jne - не равно
je - равно
1
Ушел с форума
Автор FAQ
16279 / 7604 / 1065
Регистрация: 11.11.2010
Сообщений: 13,617
16.02.2012, 11:54 3
Noclip, условных переходов немного больше, а среди тех, что ты написал смешаны комнды условных переходов для чисел со знаком и чисел без знака
В таблице приведены все коды условий и соответствующие им описания и значения флагов. Эти условия используются в командах CMOVcc, FCMOVcc, Jcc и SETcc.
Колонка «Код условия (code condition)» содержит название условия, используемое вместо символов cc в конкретной команде (например, для кода «NAE» команда Jcc будет выглядеть как JNAE, а команда CMOVcc - CMOVNAE). Колонка «Часть кода команды» - значения кода, используемый при кодировке CMOVcc, FCMOVcc, Jcc и SETcc. В колонке «Условие» - названия условий на русском и английском языках. В колонке «Значение флагов» - либо значение флага, соответствующее данному условию (например, OF = 1, OF = 0), либо алгоритм, по которому процессор вычисляет возникновение условия (например, CF or ZF = 1 - условие возникает тогда, когда значения флагов CF и ZF, совмещённые логическим «ИЛИ» дают в результате единицу - это значит, что или флаг CF, или флаг ZF равен 1).
Большинство условий имеют по два названия, например, L (less, меньше) и NGE (neither greater nor equal, не больше и не равно) представлены одним и тем же кодом, так как имеют одинаковый смысл. Термины «выше» (above) и «ниже» (below) ассоциированы со значением флага CF и применяются при сравнении двух целых беззнаковых величин. Термины «больше» (greater) и «меньше» (less) ассоциируются со значениями флагов SF и OF и применяются при сравнении двух целых величин со знаком.
Код условия (code condition)Условие Часть кода команды Значение флагов
O переполнение (overflow) 0000 OF = 1
NO нет переполнения (no overflow) 0001 OF = 0
B/NAE/C ниже (below) /не выше и не равно (neither above nor equal) /перенос (carry) 0010 CF = 1
NB/AE/NC не ниже (not below) /нет переноса (not carry) /выше или равно (above or equal)0011 CF = 0
E/Z равно (equal) /ноль (zero) 0100 ZF = 1
NE/NZ не равно (not equal) /не ноль (not zero) 0101 ZF = 0
BE/NA ниже или равно (below or equal) /не выше (not above) 0110 CF or ZF = 1
NBE/A выше (above) /не ниже и не равно (neither below nor equal) 0111 CF or ZF = 0
S знак есть (sign) /отрицательное число 1000 SF = 1
NS знака нет (no sign) /положительное число 1001 SF = 0
P/PE четное (parity)/паритет четный (parity even) 1010 PF = 1
NP/PO паритет не чётный (parity odd)/не четное (no parity) 1011 PF = 0
L/NGE меньше (less) /не больше и не равно (neither greater nor equal) 1100 SF xor OF = 1
NL/GE не меньше (not less) /больше или равно (greater or equal) 1101 SF xor OF = 0
LE/NG меньше или равно (less or equal) /не больше (not greater) 1110 (SF xor OF) or ZF = 1
NLE/G больше (greater) /не меньше и не равно (neither less nor equal) 1111 (SF xor OF) or ZF = 0
2
19 / 19 / 5
Регистрация: 17.10.2010
Сообщений: 247
16.02.2012, 13:05  [ТС] 4
про переходы я почитал прилично, но, думаю, дело не в них:
перевел число -93 в двоичную систему и понял, что занял два байта, а знак не помещается в эти два байта и число считается положительным(как правило оч. большим), следовательно придется мне увеличить массив до слова, или есть другой выход, о котором я не знаю?
или я не прав?
0
43 / 27 / 6
Регистрация: 27.09.2011
Сообщений: 280
16.02.2012, 19:58 5
vaselo, тогда проблема в том что нужно использовать переход с учетом знака
но у вас он стоит jnle , я немного в недоумении. у меня всё работало , когда я работал с переходами и проблем не было..
0
19 / 19 / 5
Регистрация: 17.10.2010
Сообщений: 247
16.02.2012, 20:32  [ТС] 6
моя программа работает, никто не проверял???
мож у меня что-то не так?
0
43 / 27 / 6
Регистрация: 27.09.2011
Сообщений: 280
16.02.2012, 20:36 7
vaselo, что у вас в text1 и text2 ??
0
19 / 19 / 5
Регистрация: 17.10.2010
Сообщений: 247
16.02.2012, 20:37  [ТС] 8
выводит, что "программа стартовала"
"подсчет суммы минимальных элементов каждой строки"
0
43 / 27 / 6
Регистрация: 27.09.2011
Сообщений: 280
16.02.2012, 20:45 9
vaselo, у вас всё в порядке всё работает =) пропускайте через masm и смотрите ошибки....

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
page  80,120    
;--------------------------------- Џ®«Ґ б⥪* --------------------------------------
sseg     segment  stack 'stack'                            ; ‡*ў¤***п ᥣ¬Ґ*в* б⥪*
           db 128 dup(?)                           ; Џ®«Ґ ¤«п б⥪* ஧¬?஬ 128 Ў*©в
sseg     ends                                              ; Љ?*Ґжм ᥣ¬Ґ*в* б⥪*
;-------------------- Џ®«п ¤**Ёе ---------------------------------------
dseg     segment 'data'        ; ‡*ў¤***п ᥣ¬Ґ*в* ¤**Ёе
        text1   db    'Programma startovala',13,10,'$'  
        text2   db    'Podc4et summi min elementov kazhdoi stroki',13,10,'$' 
        
        mas     db      12,-23,44,22
                db      2,21,22,44
                db      33,21,32,11
                db      3,12,-11,12
 
        sum     dw      0
        nl      db      13,10,'$'
        StrMin dw 4 dup(?),'$'
        Negate db ?
 dseg     ends                             
;------------------------------------ ’ҐЄбв   Їа®Ја*¬Ё -----------------------------------
cseg    segment 'code'                                  ; ‡*ў¤***п ᥣ¬Ґ*в* Є®¬**¤
                assume  cs:cseg, ds:dseg, ss:sseg    ;‚бв**®ў«Ґ**п ў?¤Ї®ў?¤*®бв? ¬?¦ cҐЈ¬Ґ*в*Ё¬Ё 
  start proc far                              ;Џ®з*в®Є Їа®жҐ¤гаЁ start (’®зЄ* ўе®¤г - start)
        mov   ax, dseg                      ;?*?ж?*«?§*ж?п ᥣ¬Ґ*в*®Ј® ॣ?бва* ds **
    mov   ds, ax                        ; Їа®Ја*¬*Ё© ᥣ¬Ґ*в ¤**Ёе dseg
;--------------------------------------------------------
m1: lea   dx, text1         ; ‡*ў**в*¦гў***п  г  аҐЈ?бва  dx ?§ ᥣ¬Ґ*в* ¤**Ёе *¤аҐбЁ 
    call  WrStr          ; ‡*ўҐа*Ґ**п ¤® Їа®жҐ¤гаЁ WrStr ўЁўҐ¤Ґ**п ** ҐЄа** ⥪бв* text1
    mov   dx, offset text2 ; ‡*ў**в*¦гў***п  г  аҐЈ?бва  dx ?§ ᥣ¬Ґ*в* ¤**Ёе *¤аҐбЁ
    call  WrStr          ; ‡*ўҐа*Ґ**п ¤® Їа®жҐ¤гаЁ WrStr ўЁўҐ¤Ґ**п ** ҐЄа** ⥪бв* text2
;------------------------- ------------------------------
m2:;--------------------------OUTTING BEGIN_______________________      
        xor             si,si
        xor             ax,ax
        xor             bx,bx
        xor             di,di
                c: ;---------------
        mov             cx,4
        mov             bp,cx
        dec             bp      ;x=3
        sub             bp,3    ;x=3-i
        mov             bl,mas[si][bp]
                m:;----------------
        mov             al,mas[si][bp]
        cmp             bl,mas[si][bp]
        jnle            set                                                     ; ВОТ ОН ЭТОТ УСЛОВНЫЙ ПЕРЕХОД
 
        back:
        cbw
        call            StrCon
        lea             dx,strmin
        call            wrstr
        call            clear
        inc             bp
        cmp             bp,4
jne             m
        mov             ax,sum
        add             ax,bx
        mov             sum,ax
        lea             dx,nl
        call            wrstr
        cmp             si,12
        je              m4
        add             si,4
loop    c
set:
        mov             bl,mas[si][bp]
        jmp             back
;-----------------------------------------------
m4:     
        mov             ax,sum
        call            strcon
        lea             dx,strmin
        call            wrstr
 
        mov     ah, 4Ch             ;”г*Єж?п §*ўҐаиҐ**п Їа®Ја*¬Ё
    int         21h                 ;ЏҐаҐаЁў***п MS-DOS
  start  endp                       ;Љ?*Ґжм   Їа®жҐ¤гаЁ   start
; ************************************************
WrStr  proc near                             ; Џ®з*в®Є Їа®жҐ¤гаЁ (Ї?¤Їа®Ја*¬Ё) WrStr
          mov   ah,09h                          ;ўЁўҐ¤Ґ**п ** ҐЄа** ап¤Є* бЁ¬ў®«?ў, ®Ў¬Ґ¦Ґ*Ёе
          int   21h                              ; бЁ¬ў®«®¬ $ *Ў® Є®¤®¬ 24h
          ret                                  ; Џ®ўҐа*Ґ**п § Їа®жҐ¤гаЁ
WrStr  endp       
;----------------------------------------------------
StrCon proc 
push ax
push cx
push dx 
push bx
push si
 
mov cx, 10 
lea si, StrMin + 3 
mov Negate, 0 
cmp ax, 8000h 
jb m5 
neg ax 
mov Negate, 1 
m5: 
cmp ax, 10 
jb m6 
cwd 
div cx 
or dl, 30h 
mov [si], dl 
dec si 
jmp m5 
m6: 
or al, 30h 
mov [si], al 
cmp Negate, 0 
jz m7 
dec si 
mov byte ptr [si], '-' 
m7 : pop si
pop bx
pop dx
pop cx
pop ax 
ret 
StrCon endp
clear proc
push cx
push dx
push si
lea si,StrMin
mov cx,4
re: mov dl,20h
mov [si],dl
inc si
loop re
pop si
pop dx
pop cx
ret
clear endp
;-------------------------------------------------------
cseg     ends                                  ; K?*Ґжм ᥣ¬Ґ*в* Є®¬**¤
         end   start


А вот и подтверждение что она работает
(я только поставил тексты и всё. Ну и закоментировал ВОТ ОН ЭТОТ УСЛОВНЫЙ ПЕРЕХОД
1
43 / 27 / 6
Регистрация: 27.09.2011
Сообщений: 280
16.02.2012, 20:48 10
только так смог подтверждение скинуть...
откройте и посмотрите =)
Вложения
Тип файла: docx 222222.docx (19.8 Кб, 8 просмотров)
0
43 / 27 / 6
Регистрация: 27.09.2011
Сообщений: 280
16.02.2012, 20:49 11
vaselo, только вот мне кажется , что там неправильный подсчет... =)
1
19 / 19 / 5
Регистрация: 17.10.2010
Сообщений: 247
16.02.2012, 20:50  [ТС] 12
в рабочей проге(с положительными числами) прога выполняет неправильные вычисления с отрицательными
491 - не правильный ответ.
в каждой строке найдите наименьшие числа и просуммируйте.
измените массив на положительные числа, повторите и увидите, что с положит. считает правильно
0
43 / 27 / 6
Регистрация: 27.09.2011
Сообщений: 280
16.02.2012, 20:52 13
491 ответ.... хотя должен меньше быть... тоесть меньше нуля я посчитал что-то около -21...

Добавлено через 1 минуту
vaselo, напишите мне условие программы и я её постараюсь вам сделать... =)
0
19 / 19 / 5
Регистрация: 17.10.2010
Сообщений: 247
16.02.2012, 20:55  [ТС] 14
делать не нужно. я все (кажется) сделал. но я так понял, что отрицательное число размером байт не воспринимается за отрицательное. Ведь с положительными считает, условные переходы все перепробовал.
если это так, то я увеличу массив до dw и проблема решится сама собой или не так?
0
43 / 27 / 6
Регистрация: 27.09.2011
Сообщений: 280
16.02.2012, 21:01 15
vaselo, у меня с dw работала сумма с отрицательными числами...
но на счет db я не вкурсе...
0
16.02.2012, 21:01
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.02.2012, 21:01
Помогаю со студенческими работами здесь

Найти сумму наименьших элементов каждой строки массива
Помогите решить пожалуйста) 1.Дан массив X(N,M). Найти номер той строки в массиве,сумма элементов...

Найти произведение наибольших и наименьших элементов каждой строки матрицы
Данно двохмерный массив в котором необходимо обчислить произведение найбольших и найменьших...

Найти произведение наименьших элементов каждой строки матрицы и их координаты
Найти произведение наименьших элементов каждой строки матрицы и их координаты

Найти суммы наименьших элементов каждой строки матрицы размером 5х8, состоящей из элементов целого типа
Извиняюсь за наглость, помогите написать две программы, очень срочно надо, сам не осилю....


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

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