IPB
ЛогинПароль:

> ПРАВИЛА РАЗДЕЛА!!!

1. Заголовок или название темы должно быть информативным
2. Все тексты программ должны помещаться в теги [CODE=asm] [/CODE]
3. Прежде чем задавать вопрос, см. "FAQ",если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно, такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Ассемблера. Исключение только с согласия модератора.
5. НЕ используйте форум для личного общения! Все, что не относиться к обсуждению темы - на PM!
6. Проверяйте программы перед тем, как выложить их на форум!!

 
 Ответить  Открыть новую тему 
> UNIX AT&T синтаксис (деление)
сообщение
Сообщение #1


Новичок
*

Группа: Пользователи
Сообщений: 13
Пол: Мужской
Реальное имя: Vitaliy

Репутация: -  0  +


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



--------------------
still alive life
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Гость






А ничего, что ты совсем не то делаешь? Надо сначала поделить 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
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Новичок
*

Группа: Пользователи
Сообщений: 13
Пол: Мужской
Реальное имя: Vitaliy

Репутация: -  0  +


Цитата(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

Сообщение отредактировано: LVI -


--------------------
still alive life
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 20.04.2024 22:31
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name