|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
17.12.2009, 22:40 | #1 |
Новичок
Джуниор
Регистрация: 17.12.2009
Сообщений: 6
|
Умножение чисел в сопроцессоре, помогите найти ошибку
Задача: умножение двух целых чисел, вводимых с клавиатуры, в сопроцессоре.
Прога работает, при малых числах, а если умножать например 255х255, то результат неправильный, постоянно выводит 37768.. в чем проблема?? |
17.12.2009, 22:41 | #2 |
Новичок
Джуниор
Регистрация: 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 |
18.12.2009, 09:35 | #3 |
Форумчанин
Регистрация: 31.05.2009
Сообщений: 786
|
Потому что происходит переполнение результата. Сопроцессор, командой fist x, пытается сохранить целое число со знаком размером в слово, а диапазон чисел, которые могут храниться в 16-разрядном слове от -32767 до 32768. А 256*256 уже 65536 - в 2 раза больше максимально хранимого значения, вот процессор и запоминает максимально возможное число.
|
18.12.2009, 17:37 | #4 |
Новичок
Джуниор
Регистрация: 17.12.2009
Сообщений: 6
|
проблему поняла, а как мне правильно поменять тип переменной чтобы прога работала адекватно и на больших числах?
|
18.12.2009, 23:14 | #5 |
Форумчанин
Регистрация: 31.05.2009
Сообщений: 786
|
переводить на 32-х разрядные команды, но это почти все переделывать
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Помогите сделать умножение неупакованых 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 |