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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 17.12.2009, 22:40   #1
avroraoff
Новичок
Джуниор
 
Регистрация: 17.12.2009
Сообщений: 6
По умолчанию Умножение чисел в сопроцессоре, помогите найти ошибку

Задача: умножение двух целых чисел, вводимых с клавиатуры, в сопроцессоре.
Прога работает, при малых числах, а если умножать например 255х255, то результат неправильный, постоянно выводит 37768.. в чем проблема??
avroraoff вне форума Ответить с цитированием
Старый 17.12.2009, 22:41   #2
avroraoff
Новичок
Джуниор
 
Регистрация: 17.12.2009
Сообщений: 6
По умолчанию

текст программы:
.model small
.stack 16h
.data

time db 13,10,'Time: ',0,0,':',0,0,':',0,0,13,10,'$'
FIO db 13,10,'Lubov Zhukova','$'
timelen dw $-time
msg0 db 13,10,20 dup(20h),'$'
msg1 db 13,10,"Please enter number a ", '$'
msg2 db 13,10,"Please enter number b ",'$'
msg3 db 13,10,"Result =",'$'
msga db "Chislo a= ", '$'
msgb db "Chislo b= ", '$'
txtres db 13,10,"FIO:",'$'

msg label byte ; массив для ввода символов
maxnum db 4
reallen db ?
numfld db 4 dup(30h)
mult10 dw 0
zn1000 dw 1000
ascval db 5 dup(20h),13,10,'$' ;,".", 3 dup(30h) массив символов для вывода
vallen dw $-ascval
handle dw ?
BUFFER DB 512 DUP(?)
filename db 'Mult.txt',0

x dw ?
y dw ?
c dw 2
a dw ?
b dw ?

.code
start:
mov ax, @data
mov ds, ax

;------------------------------

create:
mov ah,3ch
mov cx,'0'
mov dx,offset filename
int 21h
jmp write

check: ; открытие файла
mov ah,3dh
mov al,2
mov dx,offset filename
int 21h
cmp ax,02h
je create

write:
mov handle,ax

;------------------------------

mov ah, 9 ; ввод первого числа
lea dx, msg1
int 21H ;
CALL asbin ; вызов процедуры преобразования символов в число

xor ax,ax
mov ah,40h ; запись в файл
mov bx,handle
lea dx,msga
mov cx,10
int 21h

mov ax, x
mov a, ax ; заполняем переменную a
call outp

xor ax,ax
mov ah,40h ; запись в файл
mov bx,handle
lea dx,ascval
mov cx,11
int 21h

;------------------------------

mov ah, 9 ; ввод второго числа
lea dx, msg2 ;
int 21H ;
CALL asbin ; вызов процедуры преобразования символов в число

xor ax,ax
mov ah,40h ; запись в файл
mov bx,handle
lea dx,msgb
mov cx,10
int 21h

mov ax, x
mov b, ax ; заполняем переменную b
call outp

xor ax,ax
mov ah,40h ; запись в файл
mov bx,handle
lea dx,ascval
mov cx,11
int 21h

;------------------------------

fild a
fild b
fmul
fist x


call input

mov ah,9h
lea dx,time
int 21h

call outp ; вывод результата на экран

mov ah,9h
lea dx,msg3
int 21h

mov ah,9h
lea dx,ascval
int 21h


xor ax,ax
mov ah,40h ; запись в файл
mov bx,handle
lea dx,msg3
mov cx,10
int 21h

xor ax,ax
mov ah,40h ; запись в файл
mov bx,handle
lea dx,ascval
mov cx,11
int 21h

;---FIO---
xor ax,ax
mov ah,40h ; запись в файл
mov bx,handle
lea dx,FIO
mov cx,15
int 21h

xor ax,ax
mov ah,40h ; запись в файл
mov bx,handle
lea dx,time
mov cx,16
int 21h

mov ah,3eh
mov bx,handle
int 21h

mov ah,00
int 16h

mov ah, 4ch
int 21h

;----таймер------------

time_as macro addr,offs
push cx
push ax
and al,0fh
add al,'0'
mov addr+offs+1,al
pop ax
mov cl,4
shr al,cl
and al,0fh
add al,'0'
mov addr+offs,al
pop cx
endm

input proc
mov ah,2h
int 1ah
mov al,ch
time_as time,8
mov al,cl
time_as time,11
mov al,dh
time_as time,14
ret
input endp

;----------------------

asbin proc
mov ah,0ah
lea dx,msg
int 21h

mov mult10,0001
mov x,0
mov cx,10
lea si,numfld-1
mov bl,reallen
sub bh,bh
b20: mov al,[si+bx]
and ax,000fh
mul mult10
add x,ax
mov ax,mult10
mul cx
mov mult10,ax
dec bx
jnz b20
ret
asbin endp

outp proc ; процедуры "вывод" x - целая часть, y - 3 символа дробной части
xor dx,dx
lea si, ascval
M1:
mov [si],20h
inc si
inc dx
cmp dx,4
jne M1

mov cx,10 ; система счисления
lea si, ascval+4 ; Установка указателя на позицию единиц в массиве ascval

; вывод целой части
mov ax, x ; Результат х занести в ax
c20: cmp ax,10 ; Сравнить результат с числом 10
jb c30 ; Если меньше то преобразовывать не надо

xor dx,dx ; Очистка регистра dx для команды деления
div cx ; Делим на 10
or dl, 30h ; Преобразование остатка к ASCII коду
mov [si], dl ; Занесение остатка от деления в массив ascval
dec si ; Перемещение указателя массива на 1 байт влево
jmp c20 ; Переход на начало для преобразования след. цифры

c30: or al, 30h ; Если остаток меньше 10, то целая часть готова
mov [si], al ;


ret ; Возврат в головную программу из п/программы
outp endp ; Конец процедуры

open proc
lea dx, filename
mov al,1
mov ah,3Dh
int 21h
mov handle,ax
open endp

close proc
mov ah,3Eh
mov bx,handle
int 21h
close endp

end start
avroraoff вне форума Ответить с цитированием
Старый 18.12.2009, 09:35   #3
alexcoder
Форумчанин
 
Регистрация: 31.05.2009
Сообщений: 786
По умолчанию

Потому что происходит переполнение результата. Сопроцессор, командой fist x, пытается сохранить целое число со знаком размером в слово, а диапазон чисел, которые могут храниться в 16-разрядном слове от -32767 до 32768. А 256*256 уже 65536 - в 2 раза больше максимально хранимого значения, вот процессор и запоминает максимально возможное число.
Помощь с программами:
vk.com/alexcoder1
e-mail: informatik101@mail.ru
alexcoder вне форума Ответить с цитированием
Старый 18.12.2009, 17:37   #4
avroraoff
Новичок
Джуниор
 
Регистрация: 17.12.2009
Сообщений: 6
По умолчанию

проблему поняла, а как мне правильно поменять тип переменной чтобы прога работала адекватно и на больших числах?
avroraoff вне форума Ответить с цитированием
Старый 18.12.2009, 23:14   #5
alexcoder
Форумчанин
 
Регистрация: 31.05.2009
Сообщений: 786
По умолчанию

переводить на 32-х разрядные команды, но это почти все переделывать
Помощь с программами:
vk.com/alexcoder1
e-mail: informatik101@mail.ru
alexcoder вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите сделать умножение неупакованых BCD чисел andresan Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 3 11.11.2009 14:22
Умножение огромных чисел Pedro Помощь студентам 3 19.04.2009 21:32
Умножение длинных чисел SeRhy Помощь студентам 1 28.11.2008 20:04
умножение 16-разрядных чисел deeeman Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 3 12.12.2007 13:26