Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

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

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

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.09.2010, 13:18   #1
zero-cool
 
Регистрация: 08.05.2010
Сообщений: 3
По умолчанию Переполнение деления!!!

здраствуйте, помогите найти ошыбку - переполнение деления((
при выведении позитивного числа нормально работает, но при негативном,или негативных значениях переменных выводит:переполнение деления(
вот код:
Код:
.model small
	.stack 100h
	.data
		
		;(2*c-d/4)/(a*a+1)
		a dw 1				
		c dw 2
		d dw 32
		x dw ?  
		m db '-$'
		s dw 6 dup('?')  
		z1 dw ?
		z2 dw ?
		z3 dw ?
		z4 dw ?
		odunuci dw ?
		sotni dw ?	
		desyatku dw ?
		
       	.code
	start:	mov ax, @data
		mov ds, ax
		xor ax,ax
		mov ax,a
		cwd
		imul a
		cwd
		adc ax,1
		mov z4,ax
		xor ax,ax
		xor bx,bx
		mov ax,d
		mov bx,4
		xor dx,dx
		cwd
		idiv bx
		mov z3,ax
		xor ax,ax
		xor bx,bx
		xor cx,cx
		mov ax,c
		mov bx,2
		mov cx,z3
		xor dx,dx
		cwd
		imul bx
		cwd
		sbb ax,cx
		mov z3,ax
		xor ax,ax
		xor bx,bx
		mov ax,z3
		mov bx,z4
		xor dx,dx
		cwd
		idiv bx
		mov x,ax
		js @@minus
		jns @@plus
		
			
	
	; vidyemne znachenya
	@@minus:
		xor dx,dx
		xor ax,ax
		mov ax,x
		neg ax
		mov x,ax
		xor ax,ax
		mov ax,x
		lea dx,m
		mov ah,09h
		int 21h
		jmp @@plus

	; posutuvne znachenya
	
	@@plus:
		xor ax, ax
		xor bx, bx

		mov ax, x
		mov bl, 1010b
		cwd
		div bl
                      mul bl
            	mov z1, ax
		xor ax, ax
		mov ax, x
		sub ax, z1
		add ax, 30h
		mov odunuci, ax
		cmp ax, 0
		je @@Exit
		
		xor ax, ax
		cwd
		mov ax, z1
		div bl
		cwd
		div bl
		cwd
		mul bl
		mov z2, ax
		mov ax, z1
		cwd
		div bl
		sub ax, z2
		add ax, 30h
		mov desyatku, ax
		cmp ax, 0
		je @@Exit

		xor ax, ax
		mov ax, z2
		cwd
		div bl				
		add ax, 30h
		mov sotni, ax
		xor ax, ax
		mov ax, sotni
		mov s, ax       ;sot
		xor ax, ax
		mov ax, desyatku		
		mov s+1, ax
		xor ax, ax
		mov ax, odunuci
		mov s+2, ax 
		mov s+4, '$'
		jmp @@Exit

	@@Exit:
	mov ah,09h
	mov dx, offset s
	int 21h
	mov ax, 4c00h
	int 21h
	end start

Последний раз редактировалось rpy3uH; 22.09.2010 в 14:09.
zero-cool вне форума Ответить с цитированием
Старый 24.09.2010, 14:14   #2
Somebody
Участник клуба
 
Регистрация: 08.10.2007
Сообщений: 1,185
По умолчанию

Код:
		idiv bx        ; значение SF после idiv не определено
		mov x,ax     ; mov не меняет флаги
		js @@minus ; и чему же тут SF равен тогда?
		jns @@plus
И вообще тут много лишнего
Код:
	
	@@minus:
		xor dx,dx
		xor ax,ax
		mov ax,x
		neg ax
		mov x,ax
		xor ax,ax
		mov ax,x
		lea dx,m
		mov ah,09h
		int 21h
		jmp @@plus

	; posutuvne znachenya
	
	@@plus:
А это то же самое:
Код:
	
	@@minus:
		neg x
		lea dx,m
		mov ah,09h
		int 21h
		jmp @@plus ; ну, jmp для приличия можно оставить, хотя @@plus прямо тут

	; posutuvne znachenya
	
	@@plus:

Последний раз редактировалось Somebody; 24.09.2010 в 14:17.
Somebody вне форума Ответить с цитированием
Старый 26.09.2010, 16:58   #3
zero-cool
 
Регистрация: 08.05.2010
Сообщений: 3
По умолчанию

Спасибо, я понял что SF не определён, а как исправить ету ошибку???
P.S: на счёт кода:
@@minus:
xor dx,dx
xor ax,ax
mov ax,x
neg ax
mov x,ax
xor ax,ax
mov ax,x
lea dx,m
mov ah,09h
int 21h
jmp @@plus
ето нам препод так сказал делать и больше не спрашивать поповоду того что здесь пол кода ненужно...
zero-cool вне форума Ответить с цитированием
Старый 27.09.2010, 16:03   #4
Somebody
Участник клуба
 
Регистрация: 08.10.2007
Сообщений: 1,185
По умолчанию

Поставь какую-нибудь инструкцию, которая SF ставит, например
test ax, ax
Somebody вне форума Ответить с цитированием
Старый 28.09.2010, 03:35   #5
Mikl___
Участник клуба
 
Регистрация: 11.01.2010
Сообщений: 1,139
По умолчанию

zero-cool
xor ax,ax
mov ax,x
сперва обнуляешь АХ а потом помещаешь туда значение -- пиши сразу mov ax,x
Цитата:
Сообщение от zero-cool
ето нам препод так сказал делать и больше не спрашивать поповоду того что здесь пол кода ненужно...
ассемблер -- это компактный код и быстродействие, за счет удаления лишних инструкций, которые накидает туда ЯВУ, да и врят ли преподаватель ассемблера мог такое сказать
Mikl___ вне форума Ответить с цитированием
Старый 28.09.2010, 21:10   #6
zero-cool
 
Регистрация: 08.05.2010
Сообщений: 3
По умолчанию

Спасибо большое,помогло *test ax,ax*;
Препод не всегда такой умён как должен быть,например ету проблему он не смог решыть, а сказал самому найти ответ!
П.С:Редактировал предыдущие коды и все работают на ура и сминусом и сплюсом...ещё раз спасибо..

Последний раз редактировалось zero-cool; 28.09.2010 в 21:15.
zero-cool вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Переполнение аппаратного стека Levsha100 Свободное общение 6 13.07.2010 01:59
Переполнение при делении JeyKip Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 1 20.03.2010 14:04
Переполнение стека NoHeart Общие вопросы Delphi 8 08.11.2009 16:03
Переполнение стека Ake Паскаль, Turbo Pascal, PascalABC.NET 3 30.05.2009 22:39
Переполнение Стека Викдон Паскаль, Turbo Pascal, PascalABC.NET 0 19.12.2008 19:16