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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 18.11.2010, 16:20   #1
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,206
Вопрос Квадратный корень на Assemblere

Имеется алгоритм вычисления квадратного корня на Assemblere. Прошу помочь и пояснить мне, кому не трудно строчки:
Код:
	.file	"square.c"
	.section	.rodata
.LC0:
	.string	"\ninsert number: "
.LC1:
	.string	"%d"
	.align 4
.LC2:
	.string	"\n\342\214\212sqrt(%d)\342\214\213 = %d \n\nExiting...\n"
	.text
.globl main
	.type	main, @function
main:
	leal	4(%esp), %ecx
	andl	$-16, %esp
	pushl	-4(%ecx)
	pushl	%ebp
	movl	%esp, %ebp
	pushl	%ecx
	subl	$20, %esp
	subl	$12, %esp
	pushl	$.LC0
	call	puts
	addl	$16, %esp
	subl	$8, %esp
	leal	-20(%ebp), %eax
	pushl	%eax
	pushl	$.LC1
	call	scanf
	addl	$16, %esp
	movl	-20(%ebp), %eax
	movl	%eax, -16(%ebp)
	movl	$1, -12(%ebp)
	movl	$0, -8(%ebp)
	jmp	.L2
.L3:
	movl	-12(%ebp), %eax
	subl	%eax, -16(%ebp)
	incl	-8(%ebp)
	addl	$2, -12(%ebp)
.L2:
	movl	-16(%ebp), %eax
	cmpl	-12(%ebp), %eax
	jge	.L3
	movl	-20(%ebp), %eax
	subl	$4, %esp
	pushl	-8(%ebp)
	pushl	%eax
	pushl	$.LC2
	call	printf
	addl	$16, %esp
	movl	$0, %eax
	movl	-4(%ebp), %ecx
	leave
	leal	-4(%ecx), %esp
	ret
	.size	main, .-main
	.ident	"GCC: (GNU) 4.1.1 20070105 (ALT Linux, build 4.1.1-alt11)"
	.section	.note.GNU-stack,"",@progbits
Помогите плиз только комментариями. Заранее спасибо.
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.
artemavd вне форума Ответить с цитированием
Старый 18.11.2010, 20:26   #2
alexcoder
Форумчанин
 
Регистрация: 31.05.2009
Сообщений: 786
По умолчанию

Алгоритм описан в педивикии: http://ru.wikipedia.org/wiki/%D0%9A%...B5%D0%BD%D1%8C
Арифметическое извлечение квадратного корня

Для квадратов чисел верны следующие равенства:

1 = 1^2
1 + 3 = 2^2
1 + 3 + 5 = 3^2

и так далее.

То есть, узнать целую часть квадратного корня числа можно, вычитая из него все нечётные числа по порядку, пока остаток не станет меньше следующего вычитаемого числа или равен нулю, и сочтя количество выполненных действий. Например, так:

9 − 1 = 8
8 − 3 = 5
5 − 5 = 0

Выполнено 3 действия, квадратный корень числа 9 равен 3.

Недостатком такого способа является то, что если извлекаемый корень не является целым числом, то можно узнать только его целую часть, но не точнее. В то же время такой способ вполне доступен детям, решающим простейшие математические задачи, требующие извлечения квадратного корня.

Код:
	movl	%eax, -16(%ebp);Число из которого нужно извлечь корень
	movl	$1, -12(%ebp);первое нечетное (1)
	movl	$0, -8(%ebp);количество вычитаний
	jmp	.L2
.L3:
	movl	-12(%ebp), %eax;текущее нечетное
	subl	%eax, -16(%ebp):вычесть из остатка текущее нечетное
	incl	-8(%ebp);увеличить количество итераций
	addl	$2, -12(%ebp);получить следующее нечетное(1,3,5...)
.L2:
	movl	-16(%ebp), %eax;остаток числа
	cmpl	-12(%ebp), %eax;сравниваем с текущим нечетным
	jge	.L3 ;если остаток больше или равен текущему нечетному, продолжаем вычисление
	а если меньше, то в [ebp-8] будет находиться значение корня, равное количеству итераций
Помощь с программами:
vk.com/alexcoder1
e-mail: informatik101@mail.ru
alexcoder вне форума Ответить с цитированием
Старый 19.11.2010, 07:31   #3
Mikl___
Участник клуба
 
Регистрация: 11.01.2010
Сообщений: 1,139
По умолчанию


извлечение целочисленного квадратного корня из числа Х, извиняйте, что синтаксис Intel а не AT&T. Считает на много быстрее чем алгоритм предложенный alexcoder
Код:
mov ebp,X
        inc ebp
    bsr ecx,ebp
    and ecx,-2
    mov ebx,1
    shl ebx,cl;для уменьшения количества итераций 
        xor eax,eax
@@:    lea ecx,[eax+ebx]
    shr eax,1
    cmp ecx,ebp
    sbb edx,edx
    mov edi,edx
    and edx,ecx
    sub ebp,edx
    and edi,ebx
    or eax,edi
    shr ebx,2
    jnz @b
Mikl___ вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Квадратный корень строки чисел amfisat Помощь студентам 1 13.09.2010 21:33
Вычислить квадратный корень Elfiniti Помощь студентам 7 02.02.2010 00:36
квадратный корень в с++ ben95 Общие вопросы C/C++ 9 09.02.2009 15:42
Корень квадратный помогите написать Woha Общие вопросы C/C++ 5 27.10.2008 06:18
Корень квадратный BETONOMESHALKA Общие вопросы Delphi 2 01.11.2007 10:06