Advertisement
Guest User

Untitled

a guest
May 23rd, 2019
104
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1.     .text
  2.     .global useimmiten
  3. # RBP+8    paluuosoite (kutsussa laitettu)
  4. # RBP+0    edellisen kehyksen kanta (täytyy hoitaa täällä)
  5. # RBP-8    ensimmäinen parametri eli "FILE* fp", joka saadaan RDI:ssä
  6. # RBP-16   toinen parametri eli "int eofmarker", joka saadaan RSI:ssä
  7. # RBP-24   taulukko[255] merkin 255 esiintymismäärä lasketaan tähän
  8. # RBP-32   taulukko[254] merkin 254 esiintymismäärä lasketaan tähän
  9. # ...
  10. # RBP-2064 taulukko[0] (laskin kait oikein.. selviää debugatessa jos en)
  11. useimmiten:
  12.         # Alkutoimet:
  13.         pushq   %rbp                    ;# Aiempi kanta pinon päälle
  14.         movq    %rsp, %rbp              ;# Kiinnitetään uusi kanta
  15.         subq    $2064, %rsp             ;# Varataan tarvittava tila
  16.  
  17.         movq    %rdi, -8(%rbp)          ;# Parametri talteen
  18.         movq    %rsi, -16(%rbp)         ;# Parametri talteen
  19.  
  20.         # Aliohjelman varsinainen toiminnallisuus tulee tähän
  21.         movq    $0, %rax                ;# käytetään vaikka RAXia indeksinä
  22.         call    nollaus
  23.        
  24.         movq    $0, %rbx                # Alustetaan muuttuja, joka kuvaa indeksiä, RBX, currentChar
  25.        
  26.         mov -8(%rbp), %rdi
  27.         call    fgetc                   # Linkkeri osaa laittaa osoitteeksi C:n fgetc():n alun.
  28.        
  29. loom:      
  30.         cmpq    %rax, -16(%rbp)         # Testataan tuliko EOF vastaan
  31.         je      done                    # Hypätään jos tuli
  32.         addq    $1, -2064(%rbp,%rax,8)  # array[currentChar]++;
  33.         movq    %rax, %rbx              # currentChar = fgetc(input);
  34.                
  35.         movq -8(%rbp), %rdi            
  36.         call    fgetc
  37.         jmp loom
  38. done:
  39.        
  40.         # rax rdx rcx
  41.         movq    $0, %rax                # Eniten esiintyvä luku, rax, highestCount
  42.         movq    $0, %rdx                # Indeksi, jolla isoin luku, rdx, mostOccurringChar
  43.         movq    $0, %rcx                # Seuraavan silmukan indeksimuuttuja, rcx
  44. loon:                                   # Silmukassa selvitetään taulukon indeksi, jossa on isoin arvo
  45.         cmpq    $254, %rcx              # Silmukan ehto, indeksi > 255
  46.         jg      dun                     # Silmukasta lennetään pihalle
  47.         addq    $1, %rcx                # Silmukan indeksimuuttuja++
  48.         cmpq    -2064(%rbp,%rcx,8),%rax # array[i] > highestCount
  49.         jg      loon                    # Hypätään silmukan alkuun, koska nykyinen indeksi < suurin tähän mennessä nähty arvo
  50.         # Tässä taulukon arvo indeksin kohdalla > suurin tähän mennessä nähty arvo
  51.         movq    -2064(%rbp,%rcx,8), %rax # highestCount = array[i]
  52.         movq    %rcx, %rdx              # mostOccurringChar = i
  53.         jmp     loon
  54. dun:
  55.  
  56.    
  57.         # Lopputoimet:
  58.         movq    %rdx, %rax              # Paluuarvon asetus
  59.         leaveq                          # Puretaan kehys
  60.         ret  
  61.        
  62.        
  63. # Nollataan taulukko
  64. nollaus:
  65.         movq    $0, -2064(%rbp,%rax,8)  ;# nolla taulukkoon indeksin kohdalle
  66.         addq    $1, %rax                ;# indeksi++
  67.         cmpq    $256, %rax              ;# Onko indeksi...
  68.         jl      nollaus                 ;# ... pienempää (less) kuin 256? Ni uudestaan.
  69.         ret
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement