Форум программистов, компьютерный форум, киберфорум
Assembler, MASM, TASM
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.85/13: Рейтинг темы: голосов - 13, средняя оценка - 4.85
0 / 0 / 0
Регистрация: 03.06.2012
Сообщений: 9
1

ошибка: divide overflow не могу справиться. кто подскажет?

03.06.2012, 11:50. Показов 2573. Ответов 12
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
ошибка: divide overflow не могу справиться. кто подскажет?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
03.06.2012, 11:50
Ответы с готовыми решениями:

Ошибка divide overflow
Как ни пытаюсь, никак не получается. masm model small .stack 100h .data otvet df '','$' ...

divide overflow
наверно,у меня уже крыша едет работаю в консоли,в конце выводит "divide overflow" смотрю через...

divide overflow
дебагом ничего подозрительного не выявил, от чего оно лезет ? STAK SEGMENT para stack 'stack' dw...

кто подскажет что за ошибка
при форматировании пишет вот это

12
202 / 168 / 11
Регистрация: 30.05.2012
Сообщений: 703
03.06.2012, 11:56 2
Регистра не хватает для результат деления. Больше сказать не могу. Покажи код.
0
0 / 0 / 0
Регистрация: 03.06.2012
Сообщений: 9
03.06.2012, 11:58  [ТС] 3
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
;ЗАДАНИЕ: Даны сведения о результатах сдачи вступительных экзаменов:
;   - фамилия абитуриента и инициалы (16 символов);
;   - оценки по каждому из трёх экзаменов
;     - наличие целевого направления (1 символ);
;Сформировать упорядоченный по сумме баллов список абитуриентов:
; целевиков, сдавших экзамены без троек и двоек;
; Для каждого абитуриента указать сумму набранных баллов.
; Подсчитать количество и средний балл выбранных абитуриентов.
;**********************************************************************
.model small
; Формат исходной таблицы (ИТ)
tabl1 struc
      fio  db 16 dup(' ')
      p1   db ? 
      p2   db ?
      p3   db ?
      cel  db 2 dup(' ') 
tabl1 ends
; Формат результирующей таблицы (РТ)
tabl2 struc
      fio2  db 16 dup(' ')
      sum db ?
tabl2 ends
;**********************************************************************
;Макрокоманда пересылки цепочек
;Вызов: movstr src,dest,len
;Параметры:
;src - идентификатор источника  (в ds - сегмент источника)
;dest - идентификатор приемника  (в es - сегмент приемника)
;len - число пересылаемых байт
;Ограничение: src при вызове не может определяться через di !!!
movstr  macro src,dest,len
    push cx     ;спасти cx,si,di
    push si     ;
    push di     ;
    mov cx,len      ;размер цепочки в cx
    lea di,dest     ;адрес приемника в di 
    lea si,src      ;адрес источника в si 
    rep movsb       ;пересылка цепочки
    pop di      ;восстановить cx,si,di 
    pop si      ;
    pop cx      ;
    endm        
    
;*************************************************************************
vivod macro str
lea dx,str
outstr str
endm
 
 
;*************************************************************************
.stack 256
;************************************************************************
.data
 
N     equ  15       ;количество элементов ИТ
lens equ  type tabl1    ;длина записи ИТ
lenr equ  type tabl2    ;длина записи РТ
; Определение и инициализация ИТ
stabl tabl1 <'Жмуркина А.А.  $',4,5,4,'+$'>
      tabl1 <'Зюзин С.Р.     $',3,5,4,'+$'>
      tabl1 <'Сигулкин А.Ю.  $',2,3,3,'-$'>
      tabl1 <'Макеев Л.Р.    $',3,3,3,'+$'>
      tabl1 <'Кулакова О.Е.  $',3,3,4,'-$'>
      tabl1 <'Хорунский А.В. $',5,4,5,'+$'>
      tabl1 <'Ароян Н.В.     $',5,5,5,'-$'>
      tabl1 <'Ленин Е.К.     $',4,4,5,'+$'>
      tabl1 <'Рубцова О.О    $',5,4,3,'-$'>
      tabl1 <'Караулов А.К.  $',5,5,5,'+$'>
      tabl1 <'Бирулова В.П   $',4,4,2,'-$'>
      tabl1 <'Дипурин П.А.   $',4,4,4,'-$'>
      tabl1 <'Крысько Р.В.   $',4,5,5,'+$'>
      tabl1 <'Потапов П.А.   $',5,4,5,'+$'>
      tabl1 <'Корж Л.Я.      $',4,2,3,'+$'>
rtabl tabl2 N dup (<>)  ;определение РТ
buf   tabl2 <>      ;вспомогательный буфер для сортировки РТ
NRez  dw ?            ;число отобранных студентов
shapka0  db '┌───────────────┬──────────┬───────────┬──────┬─┐$'
shapka00 db '┌───────────────┬──────┐$'
shapka1  db 'Ф.И.О.         $'
shapka2  db 'Математика$'
shapka3  db 'Русский яз.$'
shapka4  db 'Физика$'
shapka44  db 'Ц$'
shapka5  db 'Сумма $'
shapka7  db '├───────────────┼──────────┼───────────┼──────┼─┤$'
shapka77 db '├───────────────┼──────┤$'
shapka8  db '└───────────────┴──────────┴───────────┴──────┴─┘$'
shapka88 db '└───────────────┴──────┘$'
message1 db 'Список абитуриентов: $'
message2 db 'Отобранные абитуриенты: $'
message3 db 'Количество отобранных абитуриентов: $'
message4 db 'Средний балл выбранных абитуриентов: $'
etalon   db '+$'
;********************************************************************
.code
include io.asm                 ;подключение библиотеки io.asm
start:
    mov ax ,@data
    mov ds,ax   ;настройка ds  
    mov es,ax   ;и es на сегмент данных
    cld     ;сброс флага DF (направление обработки строк-вперед)
    mov cx,N    ;счетчик строк ИТ 
    mov dx,0    ;счетчик строк РТ
    lea si,stabl    ;адрес первой строки ИТ  
    lea di,rtabl    ;адрес первой строки РТ         
 
;**********************************************************************
next:   
push ax              ;спасаем регистры
push si
push di
lea si,[si].cel 
lea di,etalon
cmpsb                ;абитуриент ?целевик?
pop di               ;возвращаем регистры
pop si 
pop ax
jne cont       ;если нет, идем дальше
mov  bx,0      ;обнуляем регистры
mov  ax,0      ;ah - сумма оценок текущего абитуриента
     mov al,[si].p1  ;в al первую оценку
     cmp al,3     ;меньше 3?
     jbe cont     ;если да, то абитуриент уже не проходит по критерию
                  ;переходим к следующему по списку
     add ah,al    ;если нет, записываем оценку в сумму
     mov al,0
     mov al,[si].p2 ; в al вторую оценку
     cmp al,3     ;меньше 3?
     jbe cont     ;если да, то абитуриент уже не проходит по критерию
                  ;переходим к следующему по списку
     add ah,al    ;если нет, записываем оценку в сумму
     mov al,0
     mov al,[si].p3 ;в al третью оценку
     cmp al,3     ;меньше 3?
     jbe cont     ;если да, то абитуриент уже не проходит по критерию
                  ;переходим к следующему по списку
     add ah,al    ;если нет, записываем оценку в сумму
;*************************************************************************
; строка выбрана, пересылка данных из ИТ в РТ
; пересылка поля fio -> fio2
movstr [si].fio,[di].fio2,16
mov [di].sum, ah
; завершение блока пересылки
    inc dx      ;увеличить на 1 счетчик строк РТ
    add di,lenr ;установить в di адрес начала следующей строки РТ
;*************************************************************************
cont:               ;переход к следующей строке ИТ      
    add si,lens   ;в si - адрес начала следующей строки ИТ
     loop next 
mov NRez,dx   ;число отобранных абитуриентов в РТ
    cmp dx,1    ;если найдено более одного абитуриента
    ja beg  ;перейти к сортировке
    je print    ;если только один абитуриент - на вывод
    jmp quit    ;в противном случае завершить работу
            ;(jmp дает длинный переход!" 
;*************************************************************************
; Сортировка РТ 
beg:
mov cx,NRez ;
    dec cx      ;в сх - число циклов сравнения (NRez-1)
    mov dx,0    ;в dx - число перестановок пар (пока 0)
    mov bx,0    ;в bx - смещение текущего элемента (строки) РТ
cycle:  
    mov al,byte ptr rtabl[bx+lenr].sum  ;сравнить 1-й символ следующего (в al)
    cmp byte ptr rtabl[bx].sum,al   ;и текущего элементов
    jbe cont1   ;если меньше - выбрать следующую пару (перестановки нет)
; перестановка
; 1-й (текущий)-> buf
    movstr rtabl[bx],buf,lenr
; 2-й (следующий)-> 1-й (текущий)
    movstr rtabl[bx+lenr],rtabl[bx],lenr
; buf -> 2-й
    movstr buf,rtabl[bx+lenr],lenr
 
    inc dx      ;увеличить на единицу счетчик перестановок
cont1:
    add bx,lenr ;следующий элемент
    loop cycle  ;если cx <> 0, продолжить сравнение след. пары
                        
    cmp dx,0    ;если зафиксирована хотя бы одна перестановка,
    jnz beg     ;повторить все сначала
    
;**************************************************************************
;Вывод шапки для исходной таблицы
print:
vivod message1
newline
vivod shapka0   ;напечатать shapka0 
newline         ;перейти на следующую строку
outch 179       ;напечатать символ '│' 
vivod shapka1   ;напечатать 'Ф.И.О.         '
outch 179       ;напечатать символ '│' 
vivod shapka2   ;напечатать 'Математика'
outch 179       ;напечатать символ '│' 
vivod shapka3   ;напечатать 'Русский яз.'
outch 179       ;напечатать символ '│' 
vivod shapka4   ;напечатать 'Физика'
outch 179       ;напечатать символ '│'
vivod shapka44  ;напечатать 'Ц'
outch 179       ;напечатать символ '│'
newline         ;перейти на следующую строку
vivod shapka7   ;напечатать shapka7
newline         ;перейти на следующую строку   
;**************************************************************************
; Вывод строковых полей ИТ на экран
    mov cx,N      ;в cx - число элементов в ИТ
    lea si,stabl ;в si - смещение текущего элемента (строки) РТ
new:
      mov dx,si       ;в dx смещение текущего элемента
      outch 179      ;напечатать символ '│'  
    outstr [si].fio ;напечатать фамилию текущего абитуриента
      outch 179       ;напечатать символ '│'  
 
      mov al, [si].p1 ;печать первой оценки и символа '│'   
      mov ah,0        ;
      outword ax,10   ;
      outch 179       ;
 
      mov al, [si].p2 ;печать второй оценки и символа '│'   
      mov ah,0        ;
      outword ax,11   ;
      outch 179       ;
 
      mov al, [si].p3 ;печать третьей оценки и символа '│'   
      mov ah,0        ;
      outword ax,6    ;
      outch 179       ;
 
      vivod [si].cel  ;печать информации о целевом направлении 
      outch 179       ;и символа '│'   
      newline         ;перейти на следующую строку             
      add si,lens     ;смещение следующего элемента ИТ
      dec cx          ;
      jcxz pr         ;аналог loop
     jmp new          ;
 
;**************************************************************************
;Вывод шапки для результирующей таблицы
pr:
vivod shapka8  ;печать shapka8
newline        ;перейти на следующую строку  
vivod message2 ;печать message2
newline        ;перейти на следующую строку         
vivod shapka00 ;печать shapka00
newline        ;перейти на следующую строку               
outch 179      ;напечатать символ '│' 
vivod shapka1  ;напечатать 'Ф.И.О.         '
outch 179      ;напечатать символ '│'  
vivod shapka5  ;печать 'Сумма  '
outch 179      ;напечатать символ '│'  
newline        ;перейти на следующую строку             
vivod shapka77 ;печать shapka77
newline      ;перейти на следующую строку                         
;***************************************************************************
; Вывод строковых полей PТ на экран
    mov cx,NRez  ;в cx - число элементов в PТ
    lea di,rtabl;в di адрес первой строки РТ
      mov bx,0    ;обнуляем регистр, в котором будет накапливаться сумма
                  ;всех оценок выбранных абитуриентов
new2:
      mov dx,di         ;в di адрес первой строки РТ
      outch 179        ;напечатать символ '│'  
    outstr [di].fio2  ;напечатать ф.и.о абитуриента
      outch 179         ;напечатать символ '│'  
      mov al,[di].sum   ;печать суммы оценок и символа '│'
      mov ah,0
      outword ax,6
      outch 179
      add bx,ax ;прибавить к общей сумме сумму оценок текущего студента      
      newline   ;перейти на следующую строку                         
     
     add di,lenr        ;смещение следующего элемента РТ
    loop new2
;**************************************************************************
     vivod shapka88    ;печать shapka88
     newline           ;перейти на следующую строчку
     vivod message3    ;вывести на экран message3
     mov cx,NRez       ;в cx количество отобранных абитуриентов
     outword cx,2      ;вывести на экран число абитуриентов 
     newline           ;перейти на следующую строку
     vivod message4    ;вывести на экран message4
     mov dx,NRez       ;в dx количество отобранных абитуриентов
     mov al,3         ;в al количество оценок
     mul dl           ;вычисляем делитель для определения средней оценки
     mov cl,al        ;переносим результат в cl
     mov ax,bx        ;в ax общую сумму оценок отобранных абитуриентов
     div cl           ;вычисляем среднюю оценку       
     mov ah,0     
     outword ax,2     ;выводим результат 
    quit:
       finish
        end start
0
202 / 168 / 11
Регистрация: 30.05.2012
Сообщений: 703
03.06.2012, 12:02 4
Исправил. Сейчас не должно быть переполнения:
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
;ЗАДАНИЕ: Даны сведения о результатах сдачи вступительных экзаменов:
; - фамилия абитуриента и инициалы (16 символов);
; - оценки по каждому из трёх экзаменов
; - наличие целевого направления (1 символ);
;Сформировать упорядоченный по сумме баллов список абитуриентов:
; целевиков, сдавших экзамены без троек и двоек;
; Для каждого абитуриента указать сумму набранных баллов.
; Подсчитать количество и средний балл выбранных абитуриентов.
;**********************************************************************
.model small
; Формат исходной таблицы (ИТ)
tabl1 struc
fio db 16 dup(' ')
p1 db ?
p2 db ?
p3 db ?
cel db 2 dup(' ')
tabl1 ends
; Формат результирующей таблицы (РТ)
tabl2 struc
fio2 db 16 dup(' ')
sum db ?
tabl2 ends
;**********************************************************************
;Макрокоманда пересылки цепочек
;Вызов: movstr src,dest,len
;Параметры:
;src - идентификатор источника (в ds - сегмент источника)
;dest - идентификатор приемника (в es - сегмент приемника)
;len - число пересылаемых байт
;Ограничение: src при вызове не может определяться через di !!!
movstr macro src,dest,len
push cx ;спасти cx,si,di
push si ;
push di ;
mov cx,len ;размер цепочки в cx
lea di,dest ;адрес приемника в di
lea si,src ;адрес источника в si
rep movsb ;пересылка цепочки
pop di ;восстановить cx,si,di
pop si ;
pop cx ;
endm
 
;*************************************************************************
vivod macro str
lea dx,str
outstr str
endm
 
 
;*************************************************************************
.stack 256
;************************************************************************
.data
 
N equ 15 ;количество элементов ИТ
lens equ type tabl1 ;длина записи ИТ
lenr equ type tabl2 ;длина записи РТ
; Определение и инициализация ИТ
stabl tabl1 <'Жмуркина А.А. $',4,5,4,'+$'>
tabl1 <'Зюзин С.Р. $',3,5,4,'+$'>
tabl1 <'Сигулкин А.Ю. $',2,3,3,'-$'>
tabl1 <'Макеев Л.Р. $',3,3,3,'+$'>
tabl1 <'Кулакова О.Е. $',3,3,4,'-$'>
tabl1 <'Хорунский А.В. $',5,4,5,'+$'>
tabl1 <'Ароян Н.В. $',5,5,5,'-$'>
tabl1 <'Ленин Е.К. $',4,4,5,'+$'>
tabl1 <'Рубцова О.О $',5,4,3,'-$'>
tabl1 <'Караулов А.К. $',5,5,5,'+$'>
tabl1 <'Бирулова В.П $',4,4,2,'-$'>
tabl1 <'Дипурин П.А. $',4,4,4,'-$'>
tabl1 <'Крысько Р.В. $',4,5,5,'+$'>
tabl1 <'Потапов П.А. $',5,4,5,'+$'>
tabl1 <'Корж Л.Я. $',4,2,3,'+$'>
rtabl tabl2 N dup (<>) ;определение РТ
buf tabl2 <> ;вспомогательный буфер для сортировки РТ
NRez dw ? ;число отобранных студентов
shapka0 db '┌───────────────┬──────────┬───────────┬──────┬─┐$'
shapka00 db '┌───────────────┬──────┐$'
shapka1 db 'Ф.И.О. $'
shapka2 db 'Математика$'
shapka3 db 'Русский яз.$'
shapka4 db 'Физика$'
shapka44 db 'Ц$'
shapka5 db 'Сумма $'
shapka7 db '├───────────────┼──────────┼───────────┼──────┼─┤$'
shapka77 db '├───────────────┼──────┤$'
shapka8 db '└───────────────┴──────────┴───────────┴──────┴─┘$'
shapka88 db '└───────────────┴──────┘$'
message1 db 'Список абитуриентов: $'
message2 db 'Отобранные абитуриенты: $'
message3 db 'Количество отобранных абитуриентов: $'
message4 db 'Средний балл выбранных абитуриентов: $'
etalon db '+$'
;********************************************************************
.code
include io.asm ;подключение библиотеки io.asm
start:
mov ax ,@data
mov ds,ax ;настройка ds
mov es,ax ;и es на сегмент данных
cld ;сброс флага DF (направление обработки строк-вперед)
mov cx,N ;счетчик строк ИТ
mov dx,0 ;счетчик строк РТ
lea si,stabl ;адрес первой строки ИТ
lea di,rtabl ;адрес первой строки РТ
 
;**********************************************************************
next:
push ax ;спасаем регистры
push si
push di
lea si,[si].cel
lea di,etalon
cmpsb ;абитуриент ?целевик?
pop di ;возвращаем регистры
pop si
pop ax
jne cont ;если нет, идем дальше
mov bx,0 ;обнуляем регистры
mov ax,0 ;ah - сумма оценок текущего абитуриента
mov al,[si].p1 ;в al первую оценку
cmp al,3 ;меньше 3?
jbe cont ;если да, то абитуриент уже не проходит по критерию
;переходим к следующему по списку
add ah,al ;если нет, записываем оценку в сумму
mov al,0
mov al,[si].p2 ; в al вторую оценку
cmp al,3 ;меньше 3?
jbe cont ;если да, то абитуриент уже не проходит по критерию
;переходим к следующему по списку
add ah,al ;если нет, записываем оценку в сумму
mov al,0
mov al,[si].p3 ;в al третью оценку
cmp al,3 ;меньше 3?
jbe cont ;если да, то абитуриент уже не проходит по критерию
;переходим к следующему по списку
add ah,al ;если нет, записываем оценку в сумму
;*************************************************************************
; строка выбрана, пересылка данных из ИТ в РТ
; пересылка поля fio -> fio2
movstr [si].fio,[di].fio2,16
mov [di].sum, ah
; завершение блока пересылки
inc dx ;увеличить на 1 счетчик строк РТ
add di,lenr ;установить в di адрес начала следующей строки РТ
;*************************************************************************
cont: ;переход к следующей строке ИТ
add si,lens ;в si - адрес начала следующей строки ИТ
loop next
mov NRez,dx ;число отобранных абитуриентов в РТ
cmp dx,1 ;если найдено более одного абитуриента
ja beg ;перейти к сортировке
je print ;если только один абитуриент - на вывод
jmp quit ;в противном случае завершить работу
;(jmp дает длинный переход!"
;*************************************************************************
; Сортировка РТ
beg:
mov cx,NRez ;
dec cx ;в сх - число циклов сравнения (NRez-1)
mov dx,0 ;в dx - число перестановок пар (пока 0)
mov bx,0 ;в bx - смещение текущего элемента (строки) РТ
cycle:
mov al,byte ptr rtabl[bx+lenr].sum ;сравнить 1-й символ следующего (в al)
cmp byte ptr rtabl[bx].sum,al ;и текущего элементов
jbe cont1 ;если меньше - выбрать следующую пару (перестановки нет)
; перестановка
; 1-й (текущий)-> buf
movstr rtabl[bx],buf,lenr
; 2-й (следующий)-> 1-й (текущий)
movstr rtabl[bx+lenr],rtabl[bx],lenr
; buf -> 2-й
movstr buf,rtabl[bx+lenr],lenr
 
inc dx ;увеличить на единицу счетчик перестановок
cont1:
add bx,lenr ;следующий элемент
loop cycle ;если cx <> 0, продолжить сравнение след. пары
 
cmp dx,0 ;если зафиксирована хотя бы одна перестановка,
jnz beg ;повторить все сначала
 
;**************************************************************************
;Вывод шапки для исходной таблицы
print:
vivod message1
newline
vivod shapka0 ;напечатать shapka0
newline ;перейти на следующую строку
outch 179 ;напечатать символ '│'
vivod shapka1 ;напечатать 'Ф.И.О. '
outch 179 ;напечатать символ '│'
vivod shapka2 ;напечатать 'Математика'
outch 179 ;напечатать символ '│'
vivod shapka3 ;напечатать 'Русский яз.'
outch 179 ;напечатать символ '│'
vivod shapka4 ;напечатать 'Физика'
outch 179 ;напечатать символ '│'
vivod shapka44 ;напечатать 'Ц'
outch 179 ;напечатать символ '│'
newline ;перейти на следующую строку
vivod shapka7 ;напечатать shapka7
newline ;перейти на следующую строку
;**************************************************************************
; Вывод строковых полей ИТ на экран
mov cx,N ;в cx - число элементов в ИТ
lea si,stabl ;в si - смещение текущего элемента (строки) РТ
new:
mov dx,si ;в dx смещение текущего элемента
outch 179 ;напечатать символ '│'
outstr [si].fio ;напечатать фамилию текущего абитуриента
outch 179 ;напечатать символ '│'
 
mov al, [si].p1 ;печать первой оценки и символа '│'
mov ah,0 ;
outword ax,10 ;
outch 179 ;
 
mov al, [si].p2 ;печать второй оценки и символа '│'
mov ah,0 ;
outword ax,11 ;
outch 179 ;
 
mov al, [si].p3 ;печать третьей оценки и символа '│'
mov ah,0 ;
outword ax,6 ;
outch 179 ;
 
vivod [si].cel ;печать информации о целевом направлении
outch 179 ;и символа '│'
newline ;перейти на следующую строку
add si,lens ;смещение следующего элемента ИТ
dec cx ;
jcxz pr ;аналог loop
jmp new ;
 
;**************************************************************************
;Вывод шапки для результирующей таблицы
pr:
vivod shapka8 ;печать shapka8
newline ;перейти на следующую строку
vivod message2 ;печать message2
newline ;перейти на следующую строку
vivod shapka00 ;печать shapka00
newline ;перейти на следующую строку
outch 179 ;напечатать символ '│'
vivod shapka1 ;напечатать 'Ф.И.О. '
outch 179 ;напечатать символ '│'
vivod shapka5 ;печать 'Сумма '
outch 179 ;напечатать символ '│'
newline ;перейти на следующую строку
vivod shapka77 ;печать shapka77
newline ;перейти на следующую строку
;***************************************************************************
; Вывод строковых полей PТ на экран
mov cx,NRez ;в cx - число элементов в PТ
lea di,rtabl;в di адрес первой строки РТ
mov bx,0 ;обнуляем регистр, в котором будет накапливаться сумма
;всех оценок выбранных абитуриентов
new2:
mov dx,di ;в di адрес первой строки РТ
outch 179 ;напечатать символ '│'
outstr [di].fio2 ;напечатать ф.и.о абитуриента
outch 179 ;напечатать символ '│'
mov al,[di].sum ;печать суммы оценок и символа '│'
mov ah,0
outword ax,6
outch 179
add bx,ax ;прибавить к общей сумме сумму оценок текущего студента
newline ;перейти на следующую строку
 
add di,lenr ;смещение следующего элемента РТ
loop new2
;**************************************************************************
vivod shapka88 ;печать shapka88
newline ;перейти на следующую строчку
vivod message3 ;вывести на экран message3
mov cx,NRez ;в cx количество отобранных абитуриентов
outword cx,2 ;вывести на экран число абитуриентов
newline ;перейти на следующую строку
vivod message4 ;вывести на экран message4
mov dx,NRez ;в dx количество отобранных абитуриентов
mov al,3 ;в al количество оценок
mul dl ;вычисляем делитель для определения средней оценки
mov cl,al ;переносим результат в cl
xor ch,ch
xor dx,dx
mov ax,bx
div cx ;вычисляем среднюю оценку
mov ah,0
outword ax,2 ;выводим результат
quit:
finish
end start
1
0 / 0 / 0
Регистрация: 03.06.2012
Сообщений: 9
03.06.2012, 12:50  [ТС] 5
вложила файл...
ошибка: divide overflow не могу справиться.  кто подскажет?

Не считает и не переводит строку
0
0 / 0 / 0
Регистрация: 03.06.2012
Сообщений: 9
03.06.2012, 13:05  [ТС] 6
см. вложенный файл
Вложения
Тип файла: doc Не считает и не переводит строку.doc (76.0 Кб, 8 просмотров)
0
650 / 337 / 37
Регистрация: 04.04.2012
Сообщений: 886
03.06.2012, 22:47 7
Программу надо смотреть в отладчике, а Вы не дали файл IO.asm.
0
0 / 0 / 0
Регистрация: 03.06.2012
Сообщений: 9
04.06.2012, 20:45  [ТС] 8
программа во вложении
Вложения
Тип файла: doc tana.doc (11.2 Кб, 9 просмотров)
0
650 / 337 / 37
Регистрация: 04.04.2012
Сообщений: 886
04.06.2012, 23:23 9
Вы не поняли. В проррамме есть строка:
include io.asm ;подключение библиотеки io.asm

Это значит, что должен быть еще один файл с именем io.asm. Его то и не хватает, чтобы правильно скомпилировать программу. Найдите этот файл и выложите его код на форуме или прикрепите его к сообщению, как было с tana.doc.
0
0 / 0 / 0
Регистрация: 03.06.2012
Сообщений: 9
04.06.2012, 23:33  [ТС] 10
Файл выложила, только с расширением doc

Добавлено через 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
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
.XLIST      ;запрет записи этого файла в листинг
 
; файл с макросами ввода-вывода, подключаемый к
; программе по директиве: INCLUDE io.asm
 
;********************************************************************
;       ОКОНЧАНИЕ СЧЕТА ПРОГРАММЫ
;********************************************************************
 
;====================================================================
; Окончание счета программы
;   Обращение: finish
;--------------------------------------------------------------------
finish MACRO
    MOV AX,4C00h
    INT 21h
    ENDM
 
;********************************************************************
;       ВЫВОД НА ЭКРАН (в текстовом режиме)
;********************************************************************
 
;====================================================================
; Переход на новую строку
;   Обращение: newline
;--------------------------------------------------------------------
EXTRN _newline:FAR
newline MACRO
    CALL _newline
    ENDM
 
;====================================================================
; Вывод символа
;   Обращение: outch c
;      где c - i8, r8 или m8
;--------------------------------------------------------------------
outch MACRO c
    PUSH DX
    PUSH AX
    MOV DL,c
    MOV AH,2
    INT 21h
    POP AX
    POP DX
    ENDM
 
;====================================================================
; Вывод строки символов
;   Обращение: outstr
;   На входе: DS:DX - начальный адрес строки
; Замечание: строка должна заканчиваться символом '$', код 36
;--------------------------------------------------------------------
outstr MACRO str
    PUSH AX
    PUSH DX
    LEA DX,str
    MOV AH,9
    INT 21h
    POP DX
    POP AX
    ENDM
 
;====================================================================
; Вывод целого со знаком размером в слово
;   Обращение: outint num [,leng]
;   где num  - выводимое число: i16, r16, m16
;       leng - ширина поля вывода: i8, r8, m8
; Замечание:
;   если поле больше, чем надо, то слева добавляются пробелы,
;   если меньше - выводится только число (полностью)
;   по умолчанию leng=0
;--------------------------------------------------------------------
outint MACRO num,leng
    outnum <num>,<leng>,1
    ENDM
 
;====================================================================
; Вывод целого без знака размером в слово
;   Обращение: outword num [,leng]
;      где num и leng - как в outint
;--------------------------------------------------------------------
outword MACRO num,leng
    outnum <num>,<leng>,0
    ENDM
 
;====================================================================
; Вспомогательный макрос проверки написания имени
; разными (большими и малыми) буквами
;--------------------------------------------------------------------
same MACRO name,variants,ans
    ans=0
    IRP v,<variants>
    IFIDN <name>,<v>
    ans=1
    EXITM
    ENDIF
    ENDM
    ENDM
 
;====================================================================
; Вспомогательный макрос для outint (sign=1) и outword (=0)
;--------------------------------------------------------------------
EXTRN _outnum:FAR
outnum MACRO num,leng,sign
    LOCAL regdx?
    PUSH AX
    PUSH DX
    same <num>,<dx,DX,Dx,dX>,regdx?
    IF regdx?       ;; out DX,leng -->
    IFB <leng>      ;; mov AL,leng
    MOV AL,0        ;; xchg AX,DX
    ELSE
    MOV AL,leng
    ENDIF
    XCHG AX,DX
    ELSE            ;; out num,leng (num<>DX) -->
    IFB <leng>      ;; mov DL,leng
    MOV DL,0        ;; mov AX,num
    ELSE
    MOV DL,leng
    ENDIF
    MOV AX,num
    ENDIF
    MOV DH,sign
    CALL _outnum        ;; AX=num, DL=leng, DH=sign 
    POP DX
    POP AX
    ENDM
 
;********************************************************************
;       ВВОД С КЛАВИАТУРЫ
;********************************************************************
 
;====================================================================
; Очистка буфера ввода с клавиатуры
;   Обращение: flush
;--------------------------------------------------------------------
EXTRN _flush:FAR
flush MACRO
    CALL _flush
    ENDM
 
;====================================================================
; Ввод символа (без Enter)
;   Обращение: inch x
;      где x - r8, m8
;   На выходе: x - введенный символ
;--------------------------------------------------------------------
EXTRN _inch:FAR
inch MACRO x
    LOCAL regax?
    same <x>,<ah,AH,Ah,aH>,regax?
    IF regax?
    XCHG AH,AL      ;;x=AH
    MOV AL,0
    CALL _inch
    XCHG AH,AL
    ELSE
    same <x>,<al,AL,Al,aL>,regax?
    IF regax?
    MOV AL,0        ;;x=AL
    CALL _inch
    ELSE
    PUSH AX         ;;x - не AH и не AL
    MOV AL,0
    CALL _inch
    MOV x,AL
    POP AX
    ENDIF
    ENDIF
    ENDM
 
;====================================================================
; Ввод целого числа (со знаком и без) размером в слово
;   Обращение: inint x
;      где x - r16, m16
;   На выходе: x - введенное число
; Замечание:
;   пропускаются все пробелы и концы строк перед числом;
;   число должно начинаться с цифры, перед ней возможен знак;
;   при минусе число вводится как отрицательное;
;   ввод идет до первой нецифры (в т.ч. до Enter), она глотается;
;   при ошибке будет печатать сообщения и останов программы;
; Ошибки:
;   "нет цифры" - в числе нет ни одной цифры
;   "переполнение" - большое по модулю число
;   (вне отрезка [-32768,+65535])
;--------------------------------------------------------------------
EXTRN _inint:FAR
inint MACRO x
    LOCAL regax?
    same <x>,<ax,AX,Ax,aX>,regax?
    IF regax?
    CALL _inint     ;;x=AX
    ELSE
    PUSH AX         ;;x<>AX
    CALL _inint
    MOV x,AX
    POP AX
    ENDIF
    ENDM
 
;====================================================================
.LIST       ; восстановить запись в листинг
0
0 / 0 / 0
Регистрация: 03.06.2012
Сообщений: 9
04.06.2012, 23:36  [ТС] 11
еще раз выкладыва файл io.
Вложения
Тип файла: doc IO.doc (5.4 Кб, 10 просмотров)
0
650 / 337 / 37
Регистрация: 04.04.2012
Сообщений: 886
05.06.2012, 11:13 12
Теперь можно смотреть.

Добавлено через 11 часов 32 минуты
Ошибки в файле IO.ASM. Не работают два макроса, в которые, по моему мнению, подключаются еще внешние процедуры: _newline – делает перевод строки и _outnum – делает вычисления и выводит результаты.
Я в макросах плохо разбираюсь, практически не использую. Может, кто другой поможет.
_newline я исправил.
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
.XLIST      ;§*ЇаҐв §*ЇЁбЁ нв®Ј® д*©«* ў «ЁбвЁ*Ј
 
; д*©« б ¬*Єа®б*¬Ё ўў®¤*-ўлў®¤*, Ї®¤Є«оз*Ґ¬л© Є
; Їа®Ја*¬¬Ґ Ї® ¤ЁаҐЄвЁўҐ: INCLUDE io.asm
 
;********************************************************************
;       ЋЉЋЌ—ЂЌ?… ‘—…’Ђ ЏђЋѓђЂЊЊ›
;********************************************************************
 
;====================================================================
; ЋЄ®*з**ЁҐ бзҐв* Їа®Ја*¬¬л
;   ЋЎа*йҐ*ЁҐ: finish
;--------------------------------------------------------------------
finish MACRO
    MOV AX,4C00h
    INT 21h
    ENDM
 
;********************************************************************
;       ‚›‚Ћ„ ЌЂ ќЉђЂЌ (ў ⥪бв®ў®¬ ०Ё¬Ґ)
;********************************************************************
 
;====================================================================
; ЏҐаҐе®¤ ** *®ўго бва®Єг
;   ЋЎа*йҐ*ЁҐ: newline
;--------------------------------------------------------------------
;EXTRN _newline:FAR
newline MACRO
mov dl,10
mov ah,2
int 21h
mov dl,13
int 21h
;   CALL _newline
    ENDM
 
;====================================================================
; ‚лў®¤ бЁ¬ў®«*
;   ЋЎа*йҐ*ЁҐ: outch c
;      Ј¤Ґ c - i8, r8 Ё«Ё m8
;--------------------------------------------------------------------
outch MACRO c
    PUSH DX
    PUSH AX
    MOV DL,c
    MOV AH,2
    INT 21h
    POP AX
    POP DX
    ENDM
 
;====================================================================
; ‚лў®¤ бва®ЄЁ бЁ¬ў®«®ў
;   ЋЎа*йҐ*ЁҐ: outstr
;   Ќ* ўе®¤Ґ: DS:DX - **з*«м*л© *¤аҐб бва®ЄЁ
; ‡*¬Ґз**ЁҐ: бва®Є* ¤®«¦** §*Є**зЁў*вмбп бЁ¬ў®«®¬ '$', Є®¤ 36
;--------------------------------------------------------------------
outstr MACRO str
    PUSH AX
    PUSH DX
    LEA DX,str
    MOV AH,9
    INT 21h
    POP DX
    POP AX
    ENDM
 
;====================================================================
; ‚лў®¤ 楫®Ј® б® §**Є®¬ а*§¬Ґа®¬ ў б«®ў®
;   ЋЎа*йҐ*ЁҐ: outint num [,leng]
;   Ј¤Ґ num  - ўлў®¤Ё¬®Ґ зЁб«®: i16, r16, m16
;       leng - иЁаЁ** Ї®«п ўлў®¤*: i8, r8, m8
; ‡*¬Ґз**ЁҐ:
;   Ґб«Ё Ї®«Ґ Ў®«миҐ, 祬 **¤®, в® б«Ґў* ¤®Ў*ў«повбп Їа®ЎҐ«л,
;   Ґб«Ё ¬Ґ*миҐ - ўлў®¤Ёвбп в®«мЄ® зЁб«® (Ї®«*®бвмо)
;   Ї® 㬮«з**Ёо leng=0
;--------------------------------------------------------------------
outint MACRO num,leng
    outnum <num>,<leng>,1
    ENDM
 
;====================================================================
; ‚лў®¤ 楫®Ј® ЎҐ§ §**Є* а*§¬Ґа®¬ ў б«®ў®
;   ЋЎа*йҐ*ЁҐ: outword num [,leng]
;      Ј¤Ґ num Ё leng - Є*Є ў outint
;--------------------------------------------------------------------
outword MACRO num,leng
    outnum <num>,<leng>,0
    ENDM
 
;====================================================================
; ‚бЇ®¬®Ј*⥫м*л© ¬*Єа®б Їа®ўҐаЄЁ **ЇЁб**Ёп Ё¬Ґ*Ё
; а*§*л¬Ё (Ў®«миЁ¬Ё Ё ¬*«л¬Ё) ЎгЄў*¬Ё
;--------------------------------------------------------------------
same MACRO name,variants,ans
    ans=0
    IRP v,<variants>
    IFIDN <name>,<v>
    ans=1
    EXITM
    ENDIF
    ENDM
    ENDM
 
;====================================================================
; ‚бЇ®¬®Ј*⥫м*л© ¬*Єа®б ¤«п outint (sign=1) Ё outword (=0)
;--------------------------------------------------------------------
EXTRN _outnum:FAR
outnum MACRO num,leng,sign
    LOCAL regdx?
    PUSH AX
    PUSH DX
    same <num>,<dx,DX,Dx,dX>,regdx?
    IF regdx?       ;; out DX,leng -->
    IFB <leng>      ;; mov AL,leng
    MOV AL,0        ;; xchg AX,DX
    ELSE
    MOV AL,leng
    ENDIF
    XCHG AX,DX
    ELSE            ;; out num,leng (num<>DX) -->
    IFB <leng>      ;; mov DL,leng
    MOV DL,0        ;; mov AX,num
    ELSE
    MOV DL,leng
    ENDIF
    MOV AX,num
    ENDIF
    MOV DH,sign
    CALL _outnum        ;; AX=num, DL=leng, DH=sign 
    POP DX
    POP AX
    ENDM
 
;********************************************************************
;       ‚‚Ћ„ ‘ Љ‹Ђ‚?Ђ’“ђ›
;********************************************************************
 
;====================================================================
; ЋзЁбвЄ* ЎгдҐа* ўў®¤* б Є«*ўЁ*вгал
;   ЋЎа*йҐ*ЁҐ: flush
;--------------------------------------------------------------------
EXTRN _flush:FAR
flush MACRO
    CALL _flush
    ENDM
 
;====================================================================
; ‚ў®¤ бЁ¬ў®«* (ЎҐ§ Enter)
;   ЋЎа*йҐ*ЁҐ: inch x
;      Ј¤Ґ x - r8, m8
;   Ќ* ўл室Ґ: x - ўўҐ¤Ґ**л© бЁ¬ў®«
;--------------------------------------------------------------------
EXTRN _inch:FAR
inch MACRO x
    LOCAL regax?
    same <x>,<ah,AH,Ah,aH>,regax?
    IF regax?
    XCHG AH,AL      ;;x=AH
    MOV AL,0
    CALL _inch
    XCHG AH,AL
    ELSE
    same <x>,<al,AL,Al,aL>,regax?
    IF regax?
    MOV AL,0        ;;x=AL
    CALL _inch
    ELSE
    PUSH AX         ;;x - *Ґ AH Ё *Ґ AL
    MOV AL,0
    CALL _inch
    MOV x,AL
    POP AX
    ENDIF
    ENDIF
    ENDM
 
;====================================================================
; ‚ў®¤ 楫®Ј® зЁб«* (б® §**Є®¬ Ё ЎҐ§) а*§¬Ґа®¬ ў б«®ў®
;   ЋЎа*йҐ*ЁҐ: inint x
;      Ј¤Ґ x - r16, m16
;   Ќ* ўл室Ґ: x - ўўҐ¤Ґ**®Ґ зЁб«®
; ‡*¬Ґз**ЁҐ:
;   Їа®ЇгбЄ*овбп ўбҐ Їа®ЎҐ«л Ё Є®*жл бва®Є ЇҐаҐ¤ зЁб«®¬;
;   зЁб«® ¤®«¦*® **зЁ**вмбп б жЁдал, ЇҐаҐ¤ *Ґ© ў®§¬®¦Ґ* §**Є;
;   ЇаЁ ¬Ё*гᥠзЁб«® ўў®¤Ёвбп Є*Є ®ваЁж*⥫м*®Ґ;
;   ўў®¤ Ё¤Ґв ¤® ЇҐаў®© *ҐжЁдал (ў в.з. ¤® Enter), ®** Ј«®в*Ґвбп;
;   ЇаЁ ®иЁЎЄҐ Ўг¤Ґв ЇҐз*в*вм б®®ЎйҐ*Ёп Ё ®бв**®ў Їа®Ја*¬¬л;
; ЋиЁЎЄЁ:
;   "*Ґв жЁдал" - ў зЁб«Ґ *Ґв *Ё ®¤*®© жЁдал
;   "ЇҐаҐЇ®«*Ґ*ЁҐ" - Ў®«м讥 Ї® ¬®¤г«о зЁб«®
;   (ў*Ґ ®в१Є* [-32768,+65535])
;--------------------------------------------------------------------
EXTRN _inint:FAR
inint MACRO x
    LOCAL regax?
    same <x>,<ax,AX,Ax,aX>,regax?
    IF regax?
    CALL _inint     ;;x=AX
    ELSE
    PUSH AX         ;;x<>AX
    CALL _inint
    MOV x,AX
    POP AX
    ENDIF
    ENDM
 
;====================================================================
.LIST       ; ў®ббв**®ўЁвм §*ЇЁбм ў «ЁбвЁ*Ј
0
0 / 0 / 0
Регистрация: 03.06.2012
Сообщений: 9
05.06.2012, 11:20  [ТС] 13
спасибо за помощь!!!!!!
0
05.06.2012, 11:20
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
05.06.2012, 11:20
Помогаю со студенческими работами здесь

Почему приведенный код выдает сообщение divide overflow
Помогите, пожалуйста, не могу разобраться почему выдает сообщение divide overflow( вроде push и pop...

В чём ошибка, кто подскажет (shell скрипт)
Написал shell скрипт, но не совсем работает как надо. Вот само задание: Командная процедура для...

Глючит анимация по наведению в FF, кто подскажет в чем ошибка скрыта?
Поставил при наведении на ссылку стили внутренней картинке транзишн + трансформ + бордер радиус,...

VS2017 Не могу найти "Диспетчер Надстроек". Кто подскажет, где он?
Собственно в названии темы и сам вопрос. В версиях 2010 и 2013 пользовался им для отключения...


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

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