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

Ввод матрицы с клавиатуры

14.01.2020, 03:37. Показов 5388. Ответов 1

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
  .code          
szRow   equ   3   
szCol   equ   szRow      
 
start:   mov   ax, @data     
   mov   ds, ax        
   mov   ch, szRow   
   xor   dx, dx     
   xor   bx, bx     
lRow:   mov   cl, szCol    
   xor   di, di      
lCol:   cmp   cl, ch     
   jle   next   
   mov   al, mass[bx][di]  
   test   al, 80h     
   jnz   next      
   cbw         
   add   dx, ax     
next:   inc   di      
   dec   cl       
   jnz   lCol    
   add   bx, szCol    
   dec   ch      
   jnz   lRow  
   mov   sum, dx     
   add   sum, 30h  
mov ah,0                                            
mov al,dl
mov bl,10
div bl
mov x,ah   
mov c,al 
mov ah,0
mov dl,c 
mov al,dl
mov bl,10
div bl      
mov a,ah
add al,30h 
mov dl,al
mov ah,2 
int 21h    
 
mov ah,0
mov dl,a 
add dl,30h 
 
mov ah,2    
int 21h     
 
mov ah,0
mov dl,x 
add dl,30h 
mov ah,2    
int 21h  
   mov   ah, 4ch     
   mov   al, 1  
   int   21h
   
   
   
   .data         
sum   dw   ?     
a db ?    
c db ?
x db ?
mass   label   byte      
            
dat    = 0        
   db  1, 2, 3  
   db  91, -2, 3
   db  8, 100, -3
endm           
endm             
 
   .stack   256     
   end   start
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.01.2020, 03:37
Ответы с готовыми решениями:

ввод с клавиатуры!!!
ДОброе время суток !!! Такой вопрос как в ассемблере считать буквы вводимые с клавиатуры!!!*???

Ввод с клавиатуры
Как мне на ассемблере сделать ввод с клавиатуры числа??? И потом после операций сделать вывод???

Ввод с клавиатуры
Как сделать ввод используя функции БИОС? mov ah, 00h int 16h Появляется курсор для ввода но как...

Ввод с клавиатуры
Подскажите, пожалуйста. В программе на ЯА переменные объявляются как: rx dd 20.0 ry dd 20.0Затем...

1
Модератор
Эксперт по электронике
8477 / 4335 / 1643
Регистрация: 01.02.2015
Сообщений: 13,462
Записей в блоге: 8
14.01.2020, 12:54 2
Лучший ответ Сообщение было отмечено Albert219oo как решение

Решение

Есть закреплённая тема
Ввод и вывод чисел в различных системах счисления
Есть ввод массива на основе процедур из неё
Ввод массива с клавиатуры

Попробуйте изменить под ввод матрицы

Добавлено через 3 часа 19 минут
Ввод и вывод матрицы с элементами размером 1 байт для TASM
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
LOCALS
 
.model  medium
 
.stack  200h
 
.data
        asPromptMatrix  db      'Enter a matrix:', 0Dh, 0Ah, '$'
        asPromptElement db      0Dh, 0Ah, 'M['
        asI             db      '**, '
        asJ             db      '**] =', '$'
        CrLf            db      0Dh, 0Ah, '$'
        asError         db      0Dh, 0Ah, 'Error', '$'
        msgPressAnyKey  db      0Dh, 0Ah, 'Press any key to exit...', '$'
.data?
        _COLS_          equ     3
        _ROWS_          equ     3
        byMatrix        db      (_COLS_*_ROWS_) dup(?)
 
        byBuffer        db      82 dup(?)
.code
 
; преобразования строки в число размером 1 байт
; на входе:
;   ds:[si] - строка с числом в формате Pascal
;             (первый байт - длина строки, далее - сама строка)
; на выходе
;   al - число
;   CY - флаг переноса (при ошибке - установлен, иначе - сброшен)
Str2Num PROC
        push    bx
        push    cx
        push    dx
        push    si
 
        mov     bl,     10
        xor     ax,     ax
 
        xor     cx,     cx
        mov     cl,     [si]
        inc     si
        jcxz    @@Error
        ;если в строке первый символ '-'
        ; - перейти к следующему
        ; - уменьшить количество рассматриваемых символов
        cmp     byte ptr [si], '-'
        jne     @@for
        inc     si
        dec     cx
        @@for:
                mul     bl              ; умножаем al на 10 ( ax=al*bl )
                cmp     ah,     0       ; проверяем, результат на переполнение
                jnz     @@Error
 
                mov     dl,     [si]    ; Преобразуем следующий символ в число
                inc     si
                sub     dl,     '0'     ; если это не символ цифры - показать ошибку
                jb      @@Error
                cmp     dl,     9
                ja      @@Error
                add     al,     dl
                jc      @@Error         ; Если сумма больше 255
        loop    @@for
 
        pop     si                      ;при необходимости сменить знак числа
        push    si
        cmp     byte ptr [si+1], '-'
        jne     @@CheckPositive         ;если должно быть положительным
        neg     al                      ;если должно быть отрицательным
        jns     @@Error                 ;если результат положительный - ошибка
        jmp     @@Ok
@@CheckPositive:
        ;во время вычислений проверять нельзя - т.к.
        ;диапазоны положительных и отрицательных чисел не симметричны
        test    al,     al              ;если результат отрицательный - ошибка
        js      @@Error
@@Ok:                ;сохранить результат
        clc
        pop     si
        pop     dx
        pop     cx
        pop     bx
        ret
@@Error:
        stc
        pop     si
        pop     dx
        pop     cx
        pop     bx
        ret
Str2Num ENDP
 
; выводит знаковое 16-разрядное число из регистра AX на экран
; на входе:
;  ax - число для отображения
; на выходе:
;  число на экране
ShowInt16       proc
        push    ax
        push    bx
        push    cx
        push    dx
 
        mov     bx,     10      ;основание системы счисления (делитель)
        xor     cx,     cx      ;количество символов в модуле числа
        or      ax,     ax      ;для отрицательного числа
        jns     @@div
                neg     ax      ;поменять знак (сделать положительным)
                push    ax      ;и вывести на экран символ "-" (минус)
                mov     ah,     02h
                mov     dl,     '-'
                int     21h
                pop     ax
        @@div:                  ;делим число на 10
                xor     dx,     dx
                div     bx
                push    dx      ;остаток сохраняем в стеке
                inc     cx      ;количество цифр в числе
                or      ax,     ax
        jnz     @@div           ;повторяем, пока в числе есть цифры
        mov     ah,     02h
        @@store:
                pop     dx      ;извлекаем цифры (остатки от деления на 10) из стека
                add     dl,     '0'     ;преобразуем в символы цифр
                int     21h     ;и выводим их на экран
        loop    @@store
 
        pop     dx
        pop     cx
        pop     bx
        pop     ax
        ret
ShowInt16       endp
 
;преобразование числа в строку
;на входе:
;  ax - число
;  ds:si - адрес строки
Int16ToStr      proc
        push    ax
        push    bx
        push    cx
        push    dx
        push    si
        push    di
 
        mov     di,     ax
        mov     bx,     10
        xor     cx,     cx
        test    ax,     ax
        jns     @@div
                neg     ax
        @@div:
                inc     cx
                xor     dx,     dx
                div     bx
                add     dl,     '0'
                push    dx
                test    ax,     ax
        jnz     @@div
 
        test    di,     di
        jns     @@save
                mov     ax,     '-'
                push    ax
                inc     cx
        @@save:
                pop     ax
                mov     [si],   al
                inc     si
        loop    @@save
 
        pop     di
        pop     si
        pop     dx
        pop     cx
        pop     bx
        pop     ax
        ret
Int16ToStr      endp
 
;ввод матрицы из байтов
;на входе:
;  ds:si - адрес матрицы
InputMatrix     proc
        mov     bx,     1
        @@forI:
                push    bx
                mov     di,     1
                @@forJ:
                        push    di
                        push    si
                        ;сформировать строку приглашения ко вводу одного элемента
                        mov     word ptr [asI], '  '
                        mov     word ptr [asJ], '  '
                        lea     si,     [asI]
                        mov     ax,     bx
                        call    Int16ToStr
                        lea     si,     [asJ]
                        mov     ax,     di
                        call    Int16ToStr
                @@ShowPrompt:
                        ;вывести строку приглашения
                        mov     ah,     09h
                        lea     dx,     [asPromptElement]
                        int     21h
                        ;ввод строки
                        mov     [byBuffer],     5
                        mov     ah,     0Ah
                        lea     dx,     [byBuffer]
                        int     21h
                        ;преобразование строки в число
                        lea     si,     [byBuffer+1]
                        call    Str2Num
                        ;если ошибка - показать ошибку и повторить ввод
                        jnc     @@store
                        mov     ah,     09h
                        lea     dx,     [asError]
                        int     21h
                        jmp     @@ShowPrompt
                @@store:
                        ;сохранить число и перейти к следующему элементу
                        pop     si
                        mov     [si],   al
                        add     si,     1
                        pop     di
                        inc     di
                        cmp     di,     _COLS_
                jbe     @@forJ
                pop     bx
                inc     bx
                cmp     bx,     _ROWS_
        jbe     @@forI
        mov     ah,     09h
        lea     dx,     [CrLf]
        int     21h
 
        ret
InputMatrix     endp
 
;вывод матрицы
;на входе:
;  ds:si - адрес матрицы
ShowMatrix      proc
        mov     cx,     _ROWS_
        @@forI:
                push    cx
                mov     cx,     _COLS_
                @@forJ:
                        lodsb
                        cbw
                        call    ShowInt16
                        mov     al,     ' '
                        int     29h
                loop    @@forJ
                mov     ah,     09h
                lea     dx,     [CrLf]
                int     21h
                pop     cx
        loop    @@forI
        ret
ShowMatrix      endp
 
main    proc
        ;инициализация сегментного регистра ds адресом сегмента данных
        mov     ax,     @data
        mov     ds,     ax
 
        mov     ah,     09h
        lea     dx,     [asPromptMatrix]
        int     21h
        lea     si,     [byMatrix]
        call    InputMatrix
 
        lea     si,     [byMatrix]
        call    ShowMatrix
 
        ;ожидание нажатия любой клавиши
        mov     ah,     09h
        lea     dx,     [msgPressAnyKey]
        int     21h
 
        mov     ah,     00h
        int     16h
 
        ;завершение программы
        mov     ax,     4C00h
        int     21h
main    endp
 
end     main
0
14.01.2020, 12:54
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
14.01.2020, 12:54
Помогаю со студенческими работами здесь

Ввод с клавиатуры
Подскажите, пожалуйста. Как правильно написать программу для ввода целого числа с клавиатуры и...

Ввод числа с клавиатуры
Здравствуйте, вы бы не помогли подсказать, как на ассемблере можно ввести с клавиатуры число, а...

Ввод с клавиатуры, пример
DOS, MASM32 напишите пожалуйста короткий пример считывания в буфер и вывод при вводе с клавы. ну...

Ввод массива с клавиатуры
Здравствуйте, подскажите как организовать ввод массива с клавиатуры, знаю вот как программно sseg...


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

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