Форум программистов
 
Регистрация на форуме тут, о проблемах пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail, а тут можно восстановить пароль.

Как купить рекламу на форуме


Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail


Ответ
 
Опции темы
Старый 21.05.2008, 19:56   #1
Alter
Старожил
 
Аватар для Alter
 
Регистрация: 06.08.2007
Сообщений: 2,236
Стрелка массивы, переполнение при делении

Код почти рабочий, нужно получить среднее арифметическое от суммы всех элементов массива, затем отнять от значения элементов исходного массива, полученное среде арифметическое значение, и записать разность в другой массив.
A - исходный; B - массив для записи.

Ошибка возникает, следующего содержания: "Переполнение деления". Как бы это исправить. Считаю что в остальном коде недолжно быть ошибок, я вроде правильно операции делал, но лишняя проверка непомешает.
Код:
arr_len	equ	10

assume 	cs:mycode, ds:mydate, ss:mystack, es:mydate
mycode		segment para
Start:
	 	push 	ds
		xor 	ax, ax
		push 	ax
		mov 	ax, seg mydate
		mov	ds, ax
; ++ сложение
		lea	si, A ; получаем адрес на массив A
		mov	cx, arr_len ; устанавливаем счётчик на 10 _(колл-во элементов)
sum_loop:
		mov	bx, ds:[si] ; bx := ds[si]
		Add 	ax, bx	; ax := bx + ax
loop	sum_loop

		Mov	Sum, ax ; заносим в Sum сумму
	mov	bx, arr	; bx := 10
	div	bx	; ax := bx div ax
		push	ax
		 Mov 	Sred, AX 
		pop	ax

	xor	si,si ; обнуляем
	mov	di,si ; обнуляем

; Вычитание в массив "B"
	Push	Ax
		lea	si, A
		lea	di, B
		mov	cx, arr_len
sub_loop:
		mov	bx, ds:[si]	; bx := A[si]
		mov	ax, Sred	; ax := sred;
		 sub	ax, BX	; ax := bx - ax
		mov	ds:[di], Ax	; B[di] := Ax
		 add	si, 2
		 add	di, 2
loop	sub_loop
	Pop	Ax

		mov	ax, arr_len
		lea	bx, B
		call	PRINT_ARRAY

		retf


PRINT_ARRAY	proc	near
		; DS:BX - адрес массива
		; AX - число элементов
		push	cx

		mov	cx, ax

		mov	ax, [bx]
		call	PRINT_INT
		add	bx, 2
		
		mov	cx, arr_len
		dec	cx
loop_print:		
		lea	dx, Coma
		mov	ax, 0900h
		int	21h
		mov	ax, [bx]	
		call	PRINT_INT
		inc	bx
		inc	bx
		loop	loop_print
		
		pop	cx
		retn
PRINT_ARRAY	endp

PRINT_INT	proc	near
		; AX    - число
		push	di
		push	cx
		push	dx
		push	bx
		
		lea	di, byte ptr String
		add	di, 10
		mov	byte ptr ds:[di], '$'
		dec	di
		
		test	ax, ax
		jnz	start_itoa
		mov	byte ptr ds:[di], '0'
		dec	di
		jmp	print_string	
start_itoa:
		mov	bx, ax
		mov	cx, 10
loop_div:
		test	ax,ax
		jz	end_div
		cwd
		idiv	cx
		jns	positive
		neg	dx
positive:		
		add	dl, '0'
		mov	ds:[di], dl
		dec	di
		jmp	loop_div
end_div:
		test	bx, bx
		jns	print_string
		mov	byte ptr ds:[di], '-'
		dec	di
	
print_string:
		mov	dx, di
		inc	dx
		mov	ax, 0900h
		int	21h	

		pop	bx
		pop	dx
		pop	cx
		pop	di

		retn
PRINT_INT	endp
		
mycode 		ends

mydate 		segment para
	A	dw	2, 3, 4, 7, -9, 8, 9, 1, -5, -2	
	B	dw	10 dup(?)
	Sred	dw	? ; среднее
	Sum	dw	? ; сумма
	Coma	db	', $'
	arr	dw	10
	String	db	16 dup(' ')
mydate 		ends	

mystack		segment para stack 'stack'
		dw 100 dup (?)
mystack		ends
		
		end start
Alter вне форума Ответить с цитированием
Старый 21.05.2008, 20:11   #2
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

Перед sum_loop: добавить xor ax,ax
перед делением xor dx,dx
Код:
        xor dx, dx
        Mov Sum, ax ; заносим в Sum сумму   
        mov bx, arr ; bx := 10  
        div bx  ; ax := bx div ax
Вычитание наоборот
Код:
sub_loop:   
        mov bx, ds:[si] ; bx := A[si]   
        mov ax, Sred    ; ax := sred;   ;можно сделать один раз перед циклом 
        sub    bx, ax  ;!!! ax, BX  ; ax := bx - ax   
        mov ds:[di], bx ; B[di] := Ax
Вложения
Тип файла: txt test1.txt (3.4 Кб, 132 просмотров)

Последний раз редактировалось alexBlack; 21.05.2008 в 20:15.
alexBlack вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме 20000 рублей в месяц

Опции темы


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема с рекурсивным закрашиванием. Переполнение стэка. prost Помощь студентам 7 02.06.2008 22:34
Переполнение при возведении в степень ruPy Общие вопросы Delphi 1 01.02.2008 19:21
Переполнение стека при передачи функциям массивов большой размерности graphoman Общие вопросы Delphi 2 07.01.2008 21:47
массивы Informer Общие вопросы C/C++ 3 24.11.2007 16:32


Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru
Пеллетный котёл Emtas
котлы EMTAS