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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 11.09.2009, 21:28   #1
Artur95
Новичок
Джуниор
 
Регистрация: 11.09.2009
Сообщений: 1
По умолчанию Ассемблер

Помогите пожалуйста исправить ошибку в примере. пишет - переполнение деления :
Цитата:
page 200,200

sseg segment stack 'stack'
db 128 dup(?)
sseg ends

dseg segment 'data'
text1 db 'Program started',13,10,'$'
text2 db '(A*A-B)*C*C = $'
A db 34d
B db 79d
C db 6d
Prom1 dw ?
RESS dw ?


dseg ends

cseg segment 'code'
assume cs:cseg, dsseg, ss:sseg

ShowSum proc far
push CX
push DX
push BX
mov CX, 0
mov BL, 10d

dividing: div BL
add AH, 30h
push AX

cbw

inc CX
cmp AL, 0
JE show
JMP dividing

show: pop AX
mov DL, AH
mov AH, 02h
int 21h
LOOP show

pop BX
pop DX
pop CX
ret
ShowSum endp
start proc far
mov ax, dseg
mov ds, ax
m1: lea dx, text1

call WrStr
mov dx, offset text2

call WrStr
m2:

mov al, B
cbw
mov Prom1, ax
mov al, A
mul al
sub ax, Prom1
mov bx, ax
mov al, C
mul al
mul bx

mov RESS, ax
call showSum

m4: mov ah, 4Ch
int 21h

start endp

WrStr proc near
mov ah,09h
int 21h
ret
WrStr endp

cseg ends
end start
Artur95 вне форума Ответить с цитированием
Старый 11.09.2009, 22:17   #2
Goodwin98
equ asm
Участник клуба
 
Аватар для Goodwin98
 
Регистрация: 02.05.2009
Сообщений: 1,605
По умолчанию

Во-первых у вас получается слишком большое число. В 16разрядном регистре можно хранить числа только до 65535.
А во-вторых если вы так поменяете процедуру, то она сможет вывести на экран такие числа.
Код:
ShowSum proc far
push CX
push DX
push BX
mov CX, 0
mov BX, 10

dividing: 
xor dx,dx
div BX
add dl, 30h
push dx



inc CX
cmp AX, 0
JE show
JMP dividing

show:
pop dx
mov AH, 02h
int 21h
LOOP show

pop BX
pop DX
pop CX 
ret
ShowSum endp
Add: посчитал неправильно, в результате получается 38772, а значит нужно только изменить эту процедуру.
Какой вопрос - такой ответ. Не забываем пользоваться поиском, гуглом.
Помощь в выполнении работ по ассемблеру ICQ:2725322O4

Последний раз редактировалось Goodwin98; 11.09.2009 в 22:44. Причина: ошипку исправил
Goodwin98 вне форума Ответить с цитированием
Старый 11.09.2009, 22:30   #3
alexcoder
Форумчанин
 
Регистрация: 31.05.2009
Сообщений: 786
По умолчанию

В твоем примере нужно cbw ставить перед div bl, но и в этом случае программа работает неправильно. Результат вычисления равен 38778, а значит для работы с ним требуется минимум слово, а твоем примере старший байт просто отбрасывается. Вот правильная функция
Код:
ShowSum proc far
push CX
push DX
push BX
mov CX, 0
mov Bx, 10d

dividing: 
xor dx,dx

div Bx
add dl, 30h
push dx


inc CX
cmp Ax, 0
JE show
JMP dividing

show: pop AX
mov DL, Al
mov AH, 02h
int 21h
LOOP show

pop BX
pop DX
pop CX
ret
ShowSum endp
P.S. немного не успел)))
Помощь с программами:
vk.com/alexcoder1
e-mail: informatik101@mail.ru

Последний раз редактировалось alexcoder; 11.09.2009 в 22:31. Причина: Не успел
alexcoder вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
ассемблер farxad Помощь студентам 6 11.09.2016 14:19
Ассемблер SWEET_15 Помощь студентам 3 06.09.2016 08:45
Ассемблер maziLa Помощь студентам 2 14.07.2009 09:25
Ассемблер InTest Фриланс 1 12.12.2007 02:05