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.










Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts