Árvore binária de busca em Assembler 8086

Publicado por Perfil removido (última atualização em 08/05/2010)

[ Hits: 6.738 ]

Download abba.asm




Os algoritmos implementados até o presente momento são: inserção, busca e caminhamento em ordem.

Assim que eu terminar a "exclusão" posto aqui. :D

Trabalho apresentado na disciplina "Programação de Sistemas" da 2a série do curso de Ciência da Computação da Universidade Estadual de Maringá, ministrada pelo professor Munif Gebara Júnior.

Acadêmicos: Ewerton Daniel de Lima e Cezar Augustus Lamann

  



Esconder código-fonte

.model small
.stack
.data
primeiro db 0,0
mensagem db 10,13,"Insira um valor (de 0 a 65535): $"
mensagemInsercao db "INSERINDO ELEMENTOS$",10,13
mensagemCaminhamento db 10,13,"CAMINHAMENTO EM ORDEM$",10,13
mensagemBusca db 10,13,"BUSCANDO ELEMENTO$",10,13
naoEncontrou db 10,13,"ITEM NÃO ENCONTRADO$",10,13
encontrou db 10,13,"ITEM ENCONTRADO$",10,13
numero db 6, 1, 0,0,0,0,0
resultado db 10,13,"00000$"

.code
entrada proc                         
    mov ax, seg mensagem
    mov ds, ax
    lea dx, mensagem
    mov ah, 09h
    int 21h

    mov ax, seg numero
    mov ds, ax
    lea dx, numero
    mov ah, 0Ah
    int 21h
  
    mov ch, 0
    mov cl, [numero+1]
    lea bx, numero
    inc bx
    add bx, cx
    mov dx, 1
    mov cx, 0
  
    calculo:
    sub [bx], 48
    mov ax, [bx]
    mov ah, 0
    push dx
    mul dx
    pop dx
    push ax
    mov ax, dx
    mov dx, 10
    mul dx
    mov dx, ax
    pop ax
    add cx, ax
    dec bl
    lea ax, numero
    inc ax
    cmp bx, ax
    jne calculo
    ret
entrada endp

saida proc
   mov bx, seg resultado
   mov ds, bx
   mov cx,5
   lea si,resultado+6
volta:
   mov dx,0
   mov bx,10
   div bx
   add dl,48
   mov [si],dl
   dec si
   loop volta
   mov ah,09h
   lea   dx,resultado
   int   21h
   ret
saida endp

caminhamento proc
    mov cx, 1
    camEsq:
    mov dx, ds
    cmp dx, 0
    je fimCaminhamento
    push dx
    inc cx
    mov bx, 0
    mov dh, [bx]
    inc bx
    mov dl, [bx]
    mov ds, dx
    jmp camEsq
    camDir:
    mov dx ,ds
    cmp dx, 0
    je fimCaminhamento
    mov bx, 4
    mov ah, [bx]
    inc bx
    mov al, [bx]
    
    mov bx, ds
    push bx
    push cx
    call saida
    pop cx
    pop bx
    mov ds, bx
    
    mov bx, 2
    mov dh, [bx]
    inc bx
    mov dl, [bx]
    mov ds, dx
    jmp camEsq

   fimCaminhamento:
   dec cx
   cmp cx, 0
   je fimfimCaminhamento
   pop dx
   mov ds, dx
   jmp camDir
   fimfimCaminhamento:
   ret      
caminhamento endp

proc inserir
    mov cx, 5

    ;INSERÇÃO
    mov ax, seg mensagemInsercao
    mov ds, ax
    lea dx, mensagemInsercao
    mov ah, 09h
    int 21h
    loopPrincipal:
    push cx
    call entrada
    mov ah, 48h
    mov bx, 1
    int 21h
    mov ds, ax
    mov bx, 0
    mov [bx], 0
    inc bx
    mov [bx], 0
    inc bx
    mov [bx], 0
    inc bx
    mov [bx], 0
    inc bx
    mov [bx], ch
    inc bx
    mov [bx], cl

    mov bx, seg primeiro
    mov ds, bx
    mov dh, [primeiro]
    mov dl, [primeiro+1]
    cmp dx, 0
    jne naoSerPrimeiro
    mov [primeiro], ah
    mov [primeiro+1], al
  
    jmp serPrimeiro
  
    naoSerPrimeiro:
    busca:
    mov ds, dx
    mov bx, 4
    mov dh, [bx]
    inc bx
    mov dl, [bx]
    cmp cx, dx
    jl  casoMenor
    casoMaior:
    mov bx, 2
    mov dh, [bx]
    inc bx
    mov dl, [bx]
    jp comparador
  
    casoMenor:
    mov bx, 0
    mov dh, [bx]
    inc bx
    mov dl, [bx]
     
    comparador:
    cmp dx, 0
     
    jne busca

    mov [bx], al
    dec bx
    mov [bx], ah
  
    serPrimeiro:
    pop cx
    loop loopPrincipal
   
    ;CAMINHAMENTO
    mov ax, seg mensagemCaminhamento
    mov ds, ax
    lea dx, mensagemCaminhamento
    mov ah, 09h
    int 21h

    mov bx, seg primeiro
    mov ds, bx
    mov dh, [primeiro]
    mov dl, [primeiro+1]
    mov ds, dx
    call caminhamento   
   
    ;BUSCA
    mov ax, seg mensagemBusca
    mov ds, ax
    lea dx, mensagemBusca
    mov ah, 09h
    int 21h
  
    call entrada
  
    mov bx, seg primeiro
    mov ds, bx
    mov dh, [primeiro]
    mov dl, [primeiro+1]
  
    busca2:
    mov ds, dx
    mov bx, 4
    mov dh, [bx]
    inc bx
    mov dl, [bx]
    cmp cx, dx
    je encontrar
    jl  casoMenor2
    casoMaior2:
    mov bx, 2
    mov dh, [bx]
    inc bx
    mov dl, [bx]
    jp comparador2
  
    casoMenor2:
    mov bx, 0
    mov dh, [bx]
    inc bx
    mov dl, [bx]
     
    comparador2:
    cmp dx, 0
    jne busca2
  
    mov ax, seg naoEncontrou
    mov ds, ax
    lea dx, naoEncontrou
    mov ah, 09h
    int 21h
    jp fim
  
    encontrar:
    mov ax, seg encontrou
    mov ds, ax
    lea dx, encontrou
    mov ah, 09h
    int 21h
  
    fim:
    mov ax, 4C00h
    int 21h   
endp inserir
end inserir

Scripts recomendados

Escrita de um número em hexadecimal na tela em Assembly Puro para Linux x86 (Nasm - Netwide Assemble

Soma dois números lidos da memória

Retorna o maior e menor elemento de um vetor em Assembly

Crivo de Eratóstenes Simples para Linux x86 em Assembly Puro (GNU Assembler)

Escrita de número em binário em Assembly Puro para Linux 64 bits (Nasm - Netwide Assembler)


  

Comentários
[1] Comentário enviado por andrezc em 12/05/2010 - 08:50h

Eu sei bem pouco de assembly, mas é sem dúvida, uma linguagem espetacular.

Agora, me tira uma dúvida por genteleza...

o MOV move dados de memoria, não é ?!

[2] Comentário enviado por foxbit3r em 14/05/2010 - 14:58h

int 21h significa chamada da interrupção de video no ms-dos.
O site se chama viva o linux. Bem interessante!

[3] Comentário enviado por andrezc em 14/05/2010 - 21:50h

@foxbit3r

"O site se chama viva o linux."

é comigo ?

[4] Comentário enviado por removido em 22/06/2010 - 22:51h

Olá pessoal!
A int 21h é uma interrupção do DOS que tem várias funções.
O meu objetivo ao postar o código aqui foi compartilhar o conhecimento da linguagem assembly e esta implementação poderia ser feita sem rotinas do DOS. Utilizei a int 21h pois estou aprendendo assembly com ela.
Se houver alguma implementação que não utilize de interrupções do DOS, gostaria que alguém postasse, pois seria muito interessante.
Grande abraço a todos!


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts