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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 28.12.2010, 15:45   #1
HostileZeth
 
Регистрация: 01.12.2010
Сообщений: 8
По умолчанию [Assembler (TASM)] Переделать рабочую программу подсчета полинома под 32разрядные регистры

Добрый день. У меня программа считает значение полинома Y=Ax^4+Bx^3+Cx^2+Dx+E при X от -10 до 10 (с шагом 1). Одна процедура считает значения, вторая преобразует их в ASCII-код. Программа нормально работает с маленькими значениями, но с нужными мне значениями возникает переполнение. А с 32разрядными я никогда до этого не работал. Подскажите пожалуйста.

Код:
.model small
.stack 256
.486
.data
;пропущу всё ненужное

MAS_A DW  -9, -2, -9, 0, -9 
N       DW 4
Y_ASCII DB 7 dup(?)
sign    DB (?)
NUMBER  DW (?) 
X       DW -11
Y       DW (?)
NAMBER DW 0

;подсчет полинома Y=Ax^4+Bx^3+Cx^2+Dx+E
;массив MAS_A содержит в себе коэфиценты A,B,C,D,E
;формула подсчета: Y=[((((x+a)*x+b)*x+c)*x+d)*x+e]

POLI PROC 
LEA SI, MAS_A
MOV CX, N
XOR DX, DX
MOV AX,[SI]
IT: IMUL X
INC SI
INC SI                                    
ADD AX, [SI]
LOOP IT
MOV Y, AX
RET
POLI ENDP

preobr	proc

          mov	sign, ' '       ;пробел в sign      
          cmp	ax, 0           ;сравнить AX и 0   
          jns	m_1             ;если AX>=0 то M_1

          mov	sign, '-'       ;если AX<0 то знак:='-'
          NEG  ax               ;преобразовать AX в обратный код

m_1:  xor cx,  cx               ;CX:=0
          mov	bx, 10          ;BX:=10 (делитель)
m_2:  xor dx, dx                ;DX:=0
          div	bx              ;AX:=AX/BX (поделить число на 10)
          push	dx              ;остаток в стек
          inc cx                ;CX:=CX+1
          cmp ax, 0             ;сравнить AX, 0
          jne    m_2            ;если целая часть результата деления AX не 0 то провести еще одно деление


XOR SI, SI                      ;SI:=0
mov	al,  sign                   ;AL:=sign (код знака в AL)
mov	Y_ASCII[si], al             ;сделать первым символом знак
inc	si                          ;увеличить SI
m_3:  pop	ax                  ;из стека в AX
add	al, 30h                     ;прибавить к AL 30
mov	Y_ASCII[si] ,al             ;переслать код символа в Y_ASCII

 inc	si;                     ;SI:=SI+1 (индекс+1)
loop	m_3                     ;цикл равный количеству символов
mov Y_ASCII[SI], ' '            ;пробел для понятного вывода
inc SI
mov  Y_ASCII[si], '$'           ;в последний элемент строки символ конца строки
ret
preobr	endp                    ;конец процедуры

CYCL:INC X
     MOV DH, 12      
     XOR AX, AX
     MOV AX, X
     MOV DL, 25
     ADD DH, AL
     MOV AH, 02H
     INT 10H             ;установка курсора в нужную точку
     MOV AX, X
     MOV Y, AX
     CALL PREOBR
     CALL OUTX         ;процедура просто выводит "X=<значение X>"
     MOV DH, 12
     XOR AX, AX
     MOV AX, X
     MOV DL, 33
     ADD DH, AL
     MOV AH, 02H
     INT 10H	             ;тоже курсор
     CALL POLI
     CALL PREOBR
     CALL OUTRES      ;тоже просто вывод для Y
     CMP X, 10
JNE CYCL
Благодарю всех за помощь.
HostileZeth вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Assembler-TASM biznessld Фриланс 4 13.10.2010 19:08
исправить программу вычисления полинома. vitaly38 Помощь студентам 11 21.03.2010 16:11
Переделать программу под структуры. Си++ Влад-mego Помощь студентам 0 12.04.2009 22:14
Регистры в TASM Piksel Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 2 29.12.2008 09:28
Нужна помощь! Нужно переделать программу написанную на дельфи, чтобы она работала под управлением Vista Karloss Фриланс 5 10.11.2008 17:14