Guest User

Untitled

a guest
Oct 23rd, 2017
87
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. xtern malloc
  2.  
  3. section .text
  4.  
  5. global crear
  6. global longitud
  7. global insertar_primero
  8. global insertar_ultimo
  9. global insertar_posicion
  10. global eliminar_id
  11. global eliminar_posicion
  12. global destruir
  13. global ordenar
  14. global imprimir
  15.  
  16. %define off_lista_primero 0
  17. %define off_lista_ultimo 4
  18. %define off_lista_longitud 8
  19. %define lista [ebp + 8]
  20. %define nombre [ebp + 12]
  21. %define id [ebp + 16]
  22. %define peso [ebp + 18]
  23.  
  24. crear:
  25.     ;list *crear();
  26.  
  27.     push ebp ;convención c
  28.     mov ebp, esp ;convención c
  29.     push edi ;convención c
  30.     push esi ;convención c
  31.     push ebx ;convención c
  32.    
  33.     push dword 12 ;tamaño en bytes de la "lista"
  34.     call malloc
  35.     add esp, 4
  36.     mov ebx, 0 ;preparo el 0.
  37.  
  38.     ;longitud 0, primero y último apuntan a null...
  39.    
  40.     mov [eax + off_lista_primero], ebx
  41.     mov [eax + off_lista_ultimo], ebx
  42.     mov [eax + off_lista_longitud], bx 
  43.    
  44.    
  45.     pop ebx ;convención c
  46.     pop esi ;convención c
  47.     pop edi ;convención c
  48.     pop ebp ;convención c
  49.     ret
  50. ;//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  51. longitud:
  52.     ;unsigned int longitud(list *lista);
  53.    
  54.     push ebp ;convención c
  55.     mov ebp, esp ;convención c
  56.     push edi ;convención c
  57.     push esi ;convención c
  58.     push ebx ;convención c
  59.  
  60.     mov esi, lista
  61.     mov eax, [esi + 8] ; pongo en eax el valor de la longitud
  62.    
  63.    
  64.     pop ebx ;convención c
  65.     pop esi ;convención c
  66.     pop edi ;convención c
  67.     pop ebp ;convención c
  68.     ret
  69. ;//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  70. insertar_primero:
  71.     ;void insertar_primero(list *lista, char *nombre, short id, float peso);
  72.  
  73.     push ebp ;convención c
  74.     mov ebp, esp ;convención c
  75.     push edi ;convención c
  76.     push esi ;convención c
  77.     push ebx ;convención c
  78.  
  79.     push dword 18 ; pido 18 bytes para un nodo nuevo
  80.     call malloc
  81.     add esp, 4
  82.    
  83.     mov esi, lista ;puntero a la lista pasada como parámetro
  84.     mov edi, [esi] ; me guardo el puntero al ex-primer nodo de la lista
  85.    
  86.     ;inicializo las variables del nuevo primer nodo
  87.     mov bx, id
  88.     mov [eax], bx
  89.     mov ebx, nombre
  90.     mov [eax + 2], ebx
  91.     mov ebx, peso
  92.     mov [eax + 6], ebx
  93.     mov [eax + 10], edi ; cargo el puntero del ex primer nodo en "siguiente" del nuevo primer nodo
  94.     mov dword [eax + 14], 0 ;el anterior del nuevo primer nodo debe ser NULL
  95.    
  96.     mov edx, eax ;salvo el puntero al nuevo nodo para preguntar por longitud
  97.     push dword lista ; voy a obtener la longitud para separar en casos
  98.     call longitud
  99.     add esp, 4
  100.    
  101.     cmp eax, 0
  102.     je ins_pri_vacia
  103.    
  104.     mov [edi + 14], edx ; el anterior del ex-primer nodo debe apuntar al nuevo primer nodo
  105.     mov [esi + off_lista_primero], edx ; ahora el primer nodo de la lista es el nuevo
  106.     mov ebx, [edi + off_lista_longitud] ; longitud++
  107.     inc ebx
  108.     mov [esi + off_lista_longitud], ebx
  109.     jmp ins_pri_fin
  110.    
  111. ins_pri_vacia:
  112.     mov [esi + off_lista_primero], edx ; ahora el primer nodo de la lista es el nuevo
  113.     mov [esi + off_lista_ultimo], edx ; ahora el primer nodo de la lista es el nuevo
  114.     mov ebx, [esi + off_lista_longitud] ; longitud++
  115.     inc ebx
  116.     mov [esi + off_lista_longitud], ebx
  117. ins_pri_fin:
  118.     pop ebx ;convención c
  119.     pop esi ;convención c
  120.     pop edi ;convención c
  121.     pop ebp ;convención c
  122.     ret
  123.    
  124. ;//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  125. insertar_ultimo:
  126.     ;void insertar_ultimo(list *lista, char *nombre, short id, float peso);
  127.    
  128.     push ebp ;convención c
  129.     mov ebp, esp ;convención c
  130.     push edi ;convención c
  131.     push esi ;convención c
  132.     push ebx ;convención c
  133.  
  134.     push dword 18 ; pido 18 bytes para un nodo nuevo
  135.     call malloc
  136.     add esp, 4
  137.    
  138.     mov esi, lista ;puntero a la lista pasada como parámetro
  139.     mov edi, [esi + 4] ; me guardo el puntero al ex-último nodo de la lista
  140.    
  141.     ;inicializo las variables del nuevo último nodo
  142.     mov bx, id
  143.     mov [eax], bx
  144.     mov ebx, nombre
  145.     mov [eax + 2], ebx
  146.     mov ebx, peso
  147.     mov [eax + 6], ebx
  148.     mov dword [eax + 10], 0 ; el nuevo último tiene su siguiente en null
  149.     mov [eax + 14], edi ;el anterior del nuevo ahora apunta al ex-último
  150.    
  151.     mov edx, eax ;salvo el puntero al nuevo nodo para preguntar por longitud
  152.     push dword lista ; voy a obtener la longitud para separar en casos
  153.     call longitud
  154.     add esp, 4
  155.    
  156.     cmp eax, 0
  157.     je ins_ult_vacia
  158.    
  159.     mov [edi + 10], eax ; el siguiente d el ex-primer nodo debe apuntar al nuevo primer nodo
  160.    
  161.     mov [esi + off_lista_ultimo], edx ; ahora el último nodo de la lista es el nuevo
  162.     mov ebx, [edi + off_lista_longitud] ; longitud++
  163.     inc ebx
  164.     mov [esi + off_lista_longitud], ebx
  165.     jmp ins_ult_fin
  166.  
  167. ins_ult_vacia:
  168.     mov [esi + off_lista_primero], edx ; ahora el primer nodo de la lista es el nuevo
  169.     mov [esi + off_lista_ultimo], edx ; ahora el ultimo nodo de la lista es el nuevo
  170.     mov ebx, [esi + off_lista_longitud] ; longitud++
  171.     inc ebx
  172.     mov [esi + off_lista_longitud], ebx
  173. ins_ult_fin:
  174.    
  175.     pop ebx ;convención c
  176.     pop esi ;convención c
  177.     pop edi ;convención c
  178.     pop ebp ;convención c
  179.     ret
  180.  
  181. ;//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  182. %define posicion [ebp + 22]
  183.  
  184. insertar_posicion:
  185.     ;void insertar_posicion(list *lista, char *nombre, short id, float peso, unsigned int posicion);
  186.  
  187.     push ebp ;convención c
  188.     mov ebp, esp ;convención c
  189.     push edi ;convención c
  190.     push esi ;convención c
  191.     push ebx ;convención c
  192.  
  193.     push dword lista ; voy a obtener la longitud para separar en casos
  194.     call longitud
  195.     add esp, 4
  196.    
  197.     mov ebx, posicion
  198.     cmp ebx, 0
  199.     je subrutina_ins_primero ;este es el caso en que inserto al principio
  200.     cmp ebx, eax
  201.     je subrutina_ins_ultimo ;este es el caso en el que inserto al final
  202.     ja fin_insertar_posicion ;aca posicion > longitud de la lista, no hago nada
  203.    
  204.     ;acá es el caso en el que tengo que insertar el nodo en medio de otros 2...
  205.    
  206.     dec eax ; decremento porque sé que como mínimo, inserto en la posicion 1
  207.     mov ecx, lista ; puntero a la lista pasada como parámetro
  208.     mov edi, [ecx] ;puntero a nodo izquierdo
  209.     mov esi, [edi + 10] ;puntero a nodo derecho
  210. ciclo_insertar:
  211.     cmp eax, 0
  212.     je terminar_insercion
  213.     mov edi, esi
  214.     mov esi, [esi + 10]
  215.     dec eax
  216.     jmp ciclo_insertar
  217.    
  218. terminar_insercion:
  219.     push dword 18
  220.     call malloc
  221.     add esp, 4
  222.    
  223.     mov bx, id
  224.     mov [eax], bx
  225.     mov ebx, nombre
  226.     mov [eax + 2], ebx
  227.     mov ebx, peso
  228.     mov [eax + 6], ebx
  229.     mov [eax + 10], esi
  230.     mov [eax + 14], edi
  231.    
  232.     mov ebx, [ecx + off_lista_longitud] ; longitud++
  233.     inc ebx
  234.     mov [ecx + off_lista_longitud], ebx
  235.    
  236.     jmp fin_insertar_posicion
  237.  
  238. subrutina_ins_primero:
  239.     push dword peso
  240.     push word id
  241.     push dword nombre
  242.     push dword lista
  243.     call insertar_primero
  244.     add esp, 14
  245.     jmp fin_insertar_posicion
  246.  
  247. subrutina_ins_ultimo:
  248.     push dword peso
  249.     push word id
  250.     push dword nombre
  251.     push dword lista
  252.     call insertar_ultimo
  253.     add esp, 14
  254.     jmp fin_insertar_posicion
  255.    
  256. fin_insertar_posicion:
  257.     pop ebx ;convención c
  258.     pop esi ;convención c
  259.     pop edi ;convención c
  260.     pop ebp ;convención c
  261.     ret
  262. ;//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  263. eliminar_id:
  264.     ret
  265. eliminar_posicion:
  266.     ret
  267. destruir:
  268.     ret
  269. ordenar:
  270.     ret
  271. imprimir:
  272.     ret
Add Comment
Please, Sign In to add comment