Raiz quadrada assembly no Emu 8086

1. Raiz quadrada assembly no Emu 8086

Divino
divinotoledo

(usa Outra)

Enviado em 01/04/2013 - 10:08h

Bom dia!

Pessoal estou com dificuldades em fazer um programa para calcular a raiz quadrada de um numero em assembly, estou usando o emulador 8086, bom vamos ao que preciso:
- Fazer a raiz quadrada de um numero ex raiz de 9 é 3,0 tem de aparecer uma casa depois da virgula, raiz quadrada de 15 é 3,8
peguei um codigo aqui do site mas o mesmo não roda;
codigo é este:
podem me ajudar?
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Comentários:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
; nasm -f elf raizquadrada001.asm -o raizquadrada001.o
; ld -s raizquadrada001.o -o raizquadrada001
; a opção -s no linkeditor faz "strip -s" automaticamente
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

section .text
global _start

_start:

mov ebx, valor
xor ecx, ecx

_separa:

mov eax, ebx
and eax, 0x03

push eax

inc ecx

shr ebx, 0x02
cmp ebx, 0x00

jg _separa

xor eax, eax
xor ebx, ebx

_raiz:

pop edx

shl ebx, 0x02
add ebx, edx

shl eax, 0x01
mov edx, eax
shl edx, 0x01

inc edx

cmp ebx, edx
jl _zero

sub ebx, edx
add eax, 0x01

_zero:

dec ecx
cmp ecx, 0x00

jg _raiz

push 0x0a
xor ebx, ebx
mov ebx, 0x04

_empilha:

xor edx, edx
mov ecx, 0x0a
div ecx
add edx, 0x30
push edx
add ebx, 0x04
cmp eax, 0x00
jg _empilha

_escreve:

mov edx, ebx
mov ecx, esp
mov ebx, 0x01
mov eax, 0x04

int 0x80

_fim:

pop eax
add esp, eax

xor ebx, ebx
mov eax, 0x01
int 0x80

section .rodata

valor equ 4097



  


2. Re: Raiz quadrada assembly no Emu 8086

Perfil removido
removido

(usa Nenhuma)

Enviado em 01/04/2013 - 10:19h

divinotoledo escreveu:

Bom dia!

Pessoal estou com dificuldades em fazer um programa para calcular a raiz quadrada de um numero em assembly, estou usando o emulador 8086, bom vamos ao que preciso:
- Fazer a raiz quadrada de um numero ex raiz de 9 é 3,0 tem de aparecer uma casa depois da virgula, raiz quadrada de 15 é 3,8
peguei um codigo aqui do site mas o mesmo não roda;
codigo é este:
podem me ajudar?
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Comentários:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
; nasm -f elf raizquadrada001.asm -o raizquadrada001.o
; ld -s raizquadrada001.o -o raizquadrada001
; a opção -s no linkeditor faz "strip -s" automaticamente
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

section .text
global _start

_start:

mov ebx, valor
xor ecx, ecx

_separa:

mov eax, ebx
and eax, 0x03

push eax

inc ecx

shr ebx, 0x02
cmp ebx, 0x00

jg _separa

xor eax, eax
xor ebx, ebx

_raiz:

pop edx

shl ebx, 0x02
add ebx, edx

shl eax, 0x01
mov edx, eax
shl edx, 0x01

inc edx

cmp ebx, edx
jl _zero

sub ebx, edx
add eax, 0x01

_zero:

dec ecx
cmp ecx, 0x00

jg _raiz

push 0x0a
xor ebx, ebx
mov ebx, 0x04

_empilha:

xor edx, edx
mov ecx, 0x0a
div ecx
add edx, 0x30
push edx
add ebx, 0x04
cmp eax, 0x00
jg _empilha

_escreve:

mov edx, ebx
mov ecx, esp
mov ebx, 0x01
mov eax, 0x04

int 0x80

_fim:

pop eax
add esp, eax

xor ebx, ebx
mov eax, 0x01
int 0x80

section .rodata

valor equ 4097


Esse código que você postou é prá Linux 32 bits. Trabalha com inteiros. Prá imprimir casa decimal em Linix 32 bits, precisa de algumas alterações.
Na verdade, existem registradores próprios prá números fracionários e mnemônicos próprios também. Inclusive um mnemônico que faz raiz quadrada com esses fracionários. Instrução nativa do processador.