Форум программистов, компьютерный форум, киберфорум
Наши страницы
Assembler для начинающих
Войти
Регистрация
Восстановить пароль
 
helpmea
0 / 0 / 0
Регистрация: 09.11.2019
Сообщений: 1
1

Сумма элементов двумерного массива кратных 5

09.11.2019, 16:03. Просмотров 94. Ответов 1
Метки нет (Все метки)

Крашится код, помогите решить(

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
.686 
.model flat,stdcall 
option casemap:none 
include\masm32\include\kernel32.inc
include \masm32\include\windows.inc
include \masm32\include\\user32.inc 
includelib\masm32\lib\kernel32.lib
includelib\masm32\lib\user32.lib
BSIZE equ 30
.data ;
mas1 dd 5,30,6,5,6,5,82,
7,81,6,78,8,13,4
t dd 5
tt dd 0
temp dd ?
Sum dd 0
len equ ($-mas1)/4/2 
titl db "Лабораторна робота №12",0
buf dd 0,0
ifmt db "Сума елементов кратних 5",0dh,0ah,\
"в рядках двохмерного массива:",0dh,0ah,\
"5 30 6 5 6 5 82",0dh,0ah,\
" 7 81 6 78 8 13 4",0dh,0ah,0ah,\
"Сума елементов кратних 5: %d",0dh,0ah,0
.code ;
_start:
mov ecx,len 
lea esi, mas1 
mov eax, [esi]
 
m1:
mov temp , eax
idiv t
test eax,eax
jnz m2   
mov eax , Sum
add eax , temp
mov Sum,eax
 
m2:
add esi,4
mov eax,[esi]
loop m1
 
invoke wsprintf, ADDR buf, ADDR ifmt, Sum
invoke MessageBox, 0, addr buf, addr titl, MB_ICONEXCLAMATION
invoke ExitProcess,0
end _start
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.11.2019, 16:03
Ответы с готовыми решениями:

1

ФедосеевПавел
Модератор
4732 / 2633 / 1051
Регистрация: 01.02.2015
Сообщений: 8,616
Записей в блоге: 1
09.11.2019, 16:52 2
helpmea, самый лучший вариант - попробуйте в отладчике определить строку, вызывающую аварийный останов.

Для этого запустите программу в отладчике и выполняйте по шагам.
Отладчик x64dbg или ollydbg. Но x64dbg предпочтительнее - он обновляется и в нём меньше багов.

Попробуйте для начала определить строку.

Добавлено через 4 минуты
Смотрите, в строке 17 вы неправильно определяете размер массива mas1.
Нужно или
Assembler
1
2
mas1 dd 5,30,6,5,6,5,82,7,81,6,78,8,13,4
len equ ($-mas1)/4/2 ;   <--- сразу после определения массива mas1
или средствами компилятора masm32
Assembler
1
len equ (LENGTHOF mas1)/2
Добавлено через 32 минуты
helpmea, смотрите, есть похожая задачка - для каждой строки матрицы вычислить среднее арифметическое

Видна организация циклов. Чтение элементов выполняется последовательно строковой инструкцией lodsd, т.к. матрица занимает непрерывную область памяти и за последним элементом строки расположен первый элемент следующей строки. Единственно, при переходе к следующей строке перед циклом @@ForJ обнуляется сумма в регистровой паре (di:bx).

Добавлено через 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
.686
.model flat, stdcall
option casemap :none
 
        include \masm32\include\windows.inc
 
        include \masm32\include\user32.inc
        include \masm32\include\kernel32.inc
        include \masm32\include\masm32.inc
 
        includelib \masm32\lib\user32.lib
        includelib \masm32\lib\kernel32.lib
        includelib \masm32\lib\masm32.lib
.data
        ;Messages
        aszMsgInstant   db      0Dh, 0Ah, 'Matrix:', 0Dh, 0Ah, 0
        aszMsgResult    db      'Average: %d', 0Dh, 0Ah, 0
        aszInteger      db      '%8d', 0
        aszPressEnter   db      0Dh, 0Ah, 0Dh, 0Ah, "Press ENTER to exit", 0
        aszCrLf         db      0Dh, 0Ah, 0
        ;Matrix
        Rows            dd      5
        Cols            dd      4
        Matrix          dd      94380,-87862,59071,25189
                        dd      69729,-45593,87302,-12528
                        dd      -75800,-3078,-92071,-88894
                        dd      78630,99258,45427, 4231
                        dd      -67943,-38626,39956, 6849
 
 
.data?
        hConsoleOutput  HANDLE  ?
        hConsoleInput   HANDLE  ?
        Result          dd      ?
        Buffer          db      1024 dup(?)
        BufLen          dd      ?
 
.code
 
ShowMatrix      proc    lpMatrix:DWORD, uiRows:DWORD, uiCols:DWORD
        pushad
        cmp     [uiRows],       0
        je      @@Exit
        cmp     [uiCols],       0
        je      @@Exit
 
        mov     ecx,    [uiRows]
        mov     esi,    [lpMatrix]
        @@ForI:
                push    ecx
                mov     ecx,    [uiCols]
                @@ForJ:
                        push    ecx
                        lodsd
                        invoke  wsprintf, ADDR Buffer, ADDR aszInteger, eax
                        mov     [BufLen],       eax
                        invoke  WriteConsole, hConsoleOutput, ADDR Buffer,\
                                BufLen, ADDR BufLen, NULL
                        pop     ecx
                loop    @@ForJ
                invoke  WriteConsole, hConsoleOutput, ADDR aszCrLf,\
                        LENGTHOF aszCrLf - 1, ADDR BufLen, NULL
                pop     ecx
        loop    @@ForI
@@Exit:
        popad
        ret
ShowMatrix      endp
 
main    proc
 
        ; получение описателей ввода и вывода консоли
        invoke  GetStdHandle,   STD_INPUT_HANDLE
        mov     hConsoleInput,  eax
 
        invoke  GetStdHandle,   STD_OUTPUT_HANDLE
        mov     hConsoleOutput, eax
 
        invoke  ClearScreen
 
        ;вывод исходных данных
        invoke  WriteConsole, hConsoleOutput, ADDR aszMsgInstant,\
                LENGTHOF aszMsgInstant - 1, ADDR BufLen, NULL
        invoke  ShowMatrix,      ADDR Matrix, [Rows], [Cols]
        ;обработка: среднее арифметическое всех строк
        mov     ecx,    [Rows]
        lea     esi,    [Matrix]
        @@ForI:
                push    ecx
                mov     ecx,    [Cols]
                xor     ebx,    ebx
                xor     edi,    edi
                @@ForJ:
                        lodsd
                        cdq
                        add     ebx,    eax
                        adc     edi,    edx
                loop    @@ForJ
                mov     eax,    ebx
                mov     edx,    edi
                mov     ebx,    [Cols]
                idiv    ebx
                mov     [Result],       eax
                ;вывод результата
                push    esi
                invoke  wsprintf, ADDR Buffer, ADDR aszMsgResult, [Result]
                mov     [BufLen],       eax
                invoke  WriteConsole, hConsoleOutput, ADDR Buffer,\
                        BufLen, ADDR BufLen, NULL
                pop     esi
                pop     ecx
        loop    @@ForI
 
        ;ожидание нажатия ENTER
        invoke  WriteConsole, hConsoleOutput, ADDR aszPressEnter,\
                LENGTHOF aszPressEnter - 1, ADDR BufLen, NULL
        invoke  ReadConsole, hConsoleInput, ADDR Buffer,\
                LENGTHOF Buffer, ADDR BufLen, NULL
 
        invoke  ExitProcess, 0
main    endp
 
end     main
0
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.11.2019, 16:52

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

Или воспользуйтесь поиском по форуму:

2
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.