Uke 6 - C og assembly-programmering; bash scripting

Oppgaver til mandag 3. - fredag 7. feb

  1. (Oblig) Det kan kjøres med ./hello.
  2. (Oblig) De er helt like, men skrevet for maskiner med forskjellig arkitektur.

     
    .globl sum 
    # C-signatur:int sum ()

    sum:                 # Standard

    mov   $4, %rcx       # 4 -> rcx, maks i løkke, gir sum = 10
    mov   $1, %rdx       # 1 -> rdx, tallet i Ã¸kes med for hver runde
    mov   $0, %rbx       # 0 -> rbx, variabelen i lagres i rbx
    mov   $0, %rax       # 0 -> rax, summen = S 

    # løkke
    start: # label
    add  %rdx, %rbx # rbx = rbx + rdx (i++) 
    add  %rbx, %rax # rax = rax + rbx (S = S + i)
    cmp  %rcx, %rbx # compare, er i = 3?
    jne  start      # Jump Not Equal til start:

    ret  # Verdien i rax returneres

  3.  
    .globl sum 
    # C-signatur:int sum ()

    sum:                 # Standard

    mov   $2, %rcx       # 2 -> rcx, maks i løkke
    mov   $1, %rdx       # 1 -> rdx, tallet i Ã¸kes med for hver runde
    mov   $0, %rbx       # 0 -> rbx, variabelen i lagres i rbx
    mov   $0, %rax       # 0 -> rax, summen = S 

    # løkke
    start: # label
    add  %rdx, %rbx # rbx = rbx + rdx (i++) 
    add  $2, %rax   # rax = rax + rbx (S = S + 2)
    cmp  %rcx, %rbx # compare, er i = 2?
    jne  start      # Jump Not Equal til start:

    ret  # Verdien i rax returneres

  4. (Oblig) as.s og esum.c gjør den samme beregningen. esum.c må kompileres først for å kunne gjøre det samme som as.s. as.s og esum.s er begge assembly-implementeringer av metoden. Men de er forskjellige, esum.s er den assemblykoden som gcc-kompilatoren lager. Linjene etter L3: og til og med jne gjør omtrent det samme som as.s-koden. Ved å endre $3 til $4 i linjen etter L2: går løkken en runde til og gir 10 som resultat:
    .L2:
            cmpl    $4, -4(%rbp)
    
  5. Man kan skrive til adresse 3 med en instruksjon siden tallet 3 ligger i R0 i dette tilfellet. Men for å skrive til adresse 2 må man først bruke en instruksjon på å legge tallet 2 i et register før man skriver til RAM. For å skrive til adresse 12 må man skrive enda mer kode med instruksjoner som adderer siden det største tallet som kan legges direkte inn i et register med MOVI er 3.
  6. groups
  7. (Oblig)
    grep $USER /etc/passwd
    
  8. (Oblig)

     
    #! /bin/bash

    if [ "$SHELL" != "" ]
    then 
         echo SHELL er definert til $SHELL
    else 
         echo "SHELL ikke definert"
    fi


  9. (Oblig)

     
    #! /bin/bash

    home=~

    if [ ! -d $home/www/bilder ]; then
       mkdir -p $home/www/bilder
    fi
    chmod 755 $home/www
    chmod 755 $home/www/bilder

    for file in $home/www/* $home/www/bilder/*
    do
       if [ -f $file ]; then
          chmod 644 $file
       fi
    done


  10.  
    #! /bin/bash
    (( dtot=0 ))
    (( ftot=0 ))
    (( ltot=0 ))
    for fil in $(find .)
    do
        if [ -L "$fil" ]; then 
               (( ltot += 1 ))
        elif [ -f "$fil" ]; then 
               (( ftot += 1 ))
        elif [ -d "$fil" ]; then 
               (( dtot += 1 ))
        fi
    done
    echo Filer: $ftot
    echo Kataloger: $dtot
    echo Linker: $ltot



    Løsning uten Bash 2.x aritmetikk:

     
    #! /bin/bash
         dtot=0
         ftot=0
         ltot=0
         for fil in $(find .)
         do
             if [ -L "$fil" ]; then 
                    ltot=$(expr $ltot + 1)
             elif [ -f "$fil" ]; then 
                    ftot=$(expr $ftot + 1)
             elif [ -d "$fil" ]; then 
                    dtot=$(expr $dtot + 1)
             fi
         done
         echo Filer: $ftot
         echo Kataloger: $dtot
         echo Linker: $ltot

  11. (Oblig)
  12. chmod -R u+rwX,go+rX,go-w ~/www
    
  13. chmod -R a=r,u+w,a+X ~/www
    
    Først gis alt r, deretter gis mapper(men ikke filer) x ved hjelp av +X.
  14. (Oblig)

     
    #! /bin/bash

    streng=$1;

    if [ -f $streng ]
    then
       start=${streng:0:1}
       if [ "$start" = "/" ]
       then 
        echo Absolutt path
       else
        echo Relativ path
       fi
    else
       echo "Finner ikke filen $streng. Hvis den eksisterer er feil path angitt"
    fi

  15. (Oblig)

     
    #! /bin/bash

    for streng in $*
    do
      if [ -f $streng ]
          then
          start=${streng:0:1}
          if [ "$start" = "/" ]
          then 
              echo Absolutt path
          else
              echo Relativ path
          fi
       else
          echo "Finner ikke filen $streng. Hvis den eksisterer er feil path angitt"
       fi
    done

  16.  
    #! /bin/bash

    if [ $# -ne 2 ]
    then
        echo "Syntaks: $0 fra-endelse til-endelse"
        exit
    fi

    fra=$1
    til=$2

    for fil in *.$fra
    do 
       if [ -f $fil ]
       then
          name=$(basename $fil .$fra)
          mv $fil $name.$til
          echo "Endrer $fil til $name.$til"
          found=true
       fi
    done

    if [ ! $found ]
    then
        echo "Fant ingen filer med filendelse $fra"
    fi

  17. rename -n s/\.wav/\.mp3/ *.wav
    rename  s/\.wav/\.mp3/ *.wav
    
    
  18.  
    #! /bin/bash
    for fil in $(find .)
    do
       if [ -f $fil ]
       then
           res=$(grep $1 $fil)
          if [ "$res" != "" ]
          then
                echo "######### Fant $1 i fil $fil i følgende linje(r):"
                grep $1 $fil
          fi
       fi
    done

  19. #! /bin/bash
    
    uname -a
    grep MHz /proc/cpuinfo | uniq
    grep MemTotal /proc/meminfo  
    grep name /proc/cpuinfo  | uniq
    grep CODENAME /etc/*release
    grep DESC /etc/*release
    
  20. (Oblig)