Помощь - Поиск - Пользователи - Календарь
Полная версия: UNIX AT&T синтаксис (деление)
Форум «Всё о Паскале» > Современный Паскаль и другие языки > Ассемблер
LVI
Hi all smile.gif
Собственно возникла проблема с делением на ассемблере в UNIXе
Необходимо вычислить заданную функцию Y = -36*X^3 - 98*X^2 / (15*X + 1).
(все запускается и транслируется через терминал UNIXа командами as -o file.o file.s и gcc -o file.e file.o )
Числитель и знаменатель считаются правильно, но при делении получается баг!
Я так понял возникает переполнение регистра %eax причем очистка оного не помогает!

В результате получаем:
Для X=2
Y = -36*2 ^3 - 98*2 ^2 / (15*2 +1) = -680 / 31 = 138547310
Для X=3
Y = -36*3 ^3 - 98*3 ^2 / (15*3 +1) = -1854 / 46 = 933688


.section .rodata
.string "Pz by LVI"
.section .data
Y: .int 0
X: .int 0
tmp2: .int 0
tmp: .int 0
msg_X: .asciz"X=\0"
tmp_str: .asciz"%d"
out_str: .asciz "Y = -36*%d ^3 - 98*%d ^2 / (15*%d +1) = %d / %d = %d \n"
.text
.globl main
main:
#===================
pushl $msg_X
call printf
popl %ebx
#===================
pushl $X
pushl $tmp_str
call scanf
popl %ebx
popl %ebx
#===================
# xxxxx ~ COMPUTING ~ xxxxx
movl X,%eax
imull X
imull X # X^3 => %eax
movl $-36,%edx
imull %edx # -36*X^3 => %eax
movl %eax,%ecx # -36*X^3 => %ecx
movl X,%eax
imull X # X^2 => %eax
movl $98,%edx
imull %edx # 98*X^2 => %eax
subl %eax,%ecx # -36*X^3 - 98*X^2 => %ecx
movl %ecx,tmp

#------------------------------------------------------

movl $15,%eax
imull X # 15*X => %eax
addl $1,%eax # (15*X + 1) => %eax
movl %eax,tmp2 # (15*X + 1) => tmp2
movl %ecx,%eax
xorl %edx,%edx
divl tmp2 # %eax / tmp2 (15X + 1) => %eax !!!!?
movl %eax,Y
# xxxxx ~ END_COMPUTING ~ xxxxx

#==================
pushl Y
pushl tmp2
pushl tmp
pushl X
pushl X
pushl X

pushl $out_str
call printf
popl %ebx
popl %ebx
popl %ebx
popl %ebx
popl %ebx
popl %ebx
popl %ebx

pushl $0
call exit
ret

volvo
А ничего, что ты совсем не то делаешь? Надо сначала поделить 98*X^2 на (15*X + 1), и потом отнять результат от -36*X^3... Но если тебе-таки надо (-36*X^3 - 98*X^2) / (15*X + 1), то попробуй вот это:

# xxxxx ~ COMPUTING ~ xxxxx
# Первая часть вроде правильная, до разделяющей черты
#------------------------------------------------------
movl $15,%eax
imull X # 15*X => %eax
addl $1,%eax # (15*X + 1) => %eax
movl %eax,tmp2 # (15*X + 1) => tmp2
movl %ecx,%eax
xorl %edx,%edx

cltd
idivl tmp2 # Вот эти 2 строки изменились !!!

movl %eax,Y
# xxxxx ~ END_COMPUTING ~ xxxxx
LVI
Цитата(volvo @ 20.10.2009 1:34) *

А ничего, что ты совсем не то делаешь? Надо сначала поделить 98*X^2 на (15*X + 1), и потом отнять результат от -36*X^3... Но если тебе-таки надо (-36*X^3 - 98*X^2) / (15*X + 1), то попробуй вот это:

# xxxxx ~ COMPUTING ~ xxxxx
# Первая часть вроде правильная, до разделяющей черты
#------------------------------------------------------
movl $15,%eax
imull X # 15*X => %eax
addl $1,%eax # (15*X + 1) => %eax
movl %eax,tmp2 # (15*X + 1) => tmp2
movl %ecx,%eax
xorl %edx,%edx

cltd
idivl tmp2 # Вот эти 2 строки изменились !!!

movl %eax,Y
# xxxxx ~ END_COMPUTING ~ xxxxx


Ой точно! ух уж мне эти ночные бдения...
Спасибо volvo
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.