Uke 7 - Assembly og Shell-scripting

Oppgaver til mandag 10. - fredag 14. feb

  1. (Oblig)
    mov memvar, %rbx # rbx = memvar = 10
    add %rbx, svar   # svar = svar + rbx = 32 + 10 = 42
    mov svar, %rax   # Returnerer svar = 42 i rax
    
  2. (Oblig) enlinje.c

     
    int enlinje()
    {
       int svar=32;
       int memvar=10;
       
       svar = svar + memvar;
       return(svar);
    }


    en.s

     
        .file    "enlinjeFunk.c"
        .text
        .globl    enlinje
        .type    enlinje, @function
    enlinje:
    .LFB0:
        .cfi_startproc
        pushq    %rbp
        .cfi_def_cfa_offset 16
        .cfi_offset 6, -16
        movq    %rsp, %rbp
        .cfi_def_cfa_register 6
        movl    $32, -8(%rbp)
        movl    $10, -4(%rbp)
        movl    -4(%rbp), %eax
        addl    %eax, -8(%rbp)
        movl    -8(%rbp), %eax
        popq    %rbp
        .cfi_def_cfa 7, 8
        ret
        .cfi_endproc
    .LFE0:
        .size    enlinje, .-enlinje
        .ident    "GCC: (Ubuntu 4.8.4-2ubuntu1~14.04.3) 4.8.4"
        .section    .note.GNU-stack,"",@progbits

    Den ene linjen leder til de fire linjene
      movl    $32, -8(%rbp)
      movl    $10, -4(%rbp)
      movl    -4(%rbp), %eax
      addl    %eax, -8(%rbp)
    
    hvor -8(%rbp) er adressen i RAM som tilsvarer variabelen svar (basepointer minus 8) og -4(%rbp) er adressen til memvar. memvar (10) flyttes til eax i tredje instruksjon og så legges denne verdien til svar.
  3.  
    .globl iftest 
    # C-signatur:int iftest ()

    iftest:        # Standard start av funskjon

    # Returnerer 1 hvis svar > 0
    # Returnerer -1 hvis svar < 0
    # Returnerer ellers 0

    cmp  $0, svar   # compare
    jg  greater     # Jump Greater, hvis svar > 0

    je  equal       # Jump equal, hvis svar = 0

    mov $-1, %rax   # < 0 hvis her
    jmp return

    equal:
    mov $0, %rax
    jmp return

    greater:
    mov $1, %rax

    return:
    ret  # Verdien i rax returneres

    .data
    svar:  .quad -4   # deklarerer variabelen svar i RAM

  4. Fibonacci-tall nr 46: 1836311903
    
    C-løsning:

     
    #include <stdio.h>

    int last = 46; /* global */

    int fibo()
    {
       int i;
       int a=1,b=1,c;
       /* Har allerede de første to */
       for(i=3;i <= last;i++)
           {
          c = a;      /* b skal etterpå få denne */
          a = a + b;  /* Neste tall */
          b = c;      /* b forstat nest siste tall */
           }
       return(a);
    }


    int main (void) {

    int f;
    printf("Kaller fibo()...\n");
    f = fibo();
    printf("Fibonacci-tall nr %d: %d\n",last, f);
    }


    Assembly-rutine:

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

    fibo:                # Standard start av procedure/metode

    mov   $46, %rcx      # Tallet i rekken som skal regnes ut, minimum 3
    mov   $1, %rbx       # 1 -> rbx, første fibonacci-tall
    mov   $1, %rax       # 1 -> rax, siste tall så langt i fibonacci-rekken
    mov   $2, %rdx       # 2 -> rdx, teller, har allerde de to første

    # løkke
    start:          # label
    mov %rax, %r8   # Kopierer verdien av rax til r8 (r8-r15) er ekstra 64 bits registere
    add %rbx, %rax  # rax = rax + rbx, rax er nå siste tall i rekken
    mov %r8, %rbx   # rbx får den lagrede verdien fra r8 og er nest siste tall igjen
    inc %rdx

    cmp  %rcx, %rdx # compare, har teller rdx blitt lik max?
    jne  start      # Jump Not Equal til start:

    ret  # Verdien i rax returneres

    NÃ¥r man regner ut tall nr 47 skjer dette:
    Fibonacci-tall nr 47: -1323752223
    
    fordi tallet er for stort til å lagres med en 32 bit int. Om man bruker 64 bit long long, kan man regne ut nr 92 som er 7540113804746346429. Om man prøver å regne ut nr 93 blir tallet for stort til å lagre med 64 bit. 2^64 ~ 1.8 10^19.
  5. (Oblig)
  6.  
    #! /bin/bash

    hash='$6$AB.f/K06$IsV3oABaBO4UEBertVwViFgqFcuRvPfBDBVojDJkwg43AlPlgfD.y8nCpjnb01EgwwrVaxpYRzYjgT5G1g4lw.'

    salt=$(echo $hash | cut -d$ -f 3)
    h=$(echo $hash | cut -d$ -f 4)

    for pord in {a..z}{a..z}{a..z}
    do
       gen=$(echo $pord | mkpasswd -m sha-512 -s -S $salt)
       if [ "$hash" = "$gen" ]
       then
          echo "Passordet er \"$pord\" for hash nr $i: $hash"
          exit
       fi
    done


  7. (Oblig)
  8. (Oblig)
    find ~ -type f -newermt "30 Jan 2023 00:00" ! -newermt "30 Jan 2023 23:59" -ls
      
  9. (Oblig)
    cat fil.txt | sed s/stud.hioa.no/oslomet.no/ > nyfil.txt
    
  10. cat fil.txt | awk '{print $(NF-2)}' | sed s/stud.hioa.no/oslomet.no/ > nyfil.txt
    
  11. (Oblig) ls -l /etc/ | sort -nrk 5 | head -n 10
  12.  
    IFS=:
    while read  brnavn x ID GR NAVN HOME SHELL 
    do
       if [ "$SHELL" = "/bin/false" ]
       then
          unset IFS
          ps aux | while read name pid x
          do 
             if [ "$brnavn" = "$name" ]
         then
            echo "$brnavn har pid=$pid"
         fi
          done
          IFS=:
       fi
    done < /etc/passwd
    unset IFS

  13.  
    #! /bin/bash

    brukere=`cat /etc/passwd | wc -l `
    grupper=`cat /etc/group  | wc -l `

    echo "Du har brukernavn $USER og kjører scriptet $0 med PID = $$ "
    echo "på maskinen `hostname` som kjører operativsystemet `uname`"
    echo "Oversikt over din hjemmekatalog ${HOME}:"
    pwd=`pwd`
    cd ~
    /iu/nexus/private/teaching/courses/SO135A/excercises/fasit/count.bash  
    # eller hvor det måtte ligge
    cd $pwd
    echo "Ditt default shell er $SHELL og du befinner deg i "
    echo "katalogen $pwd"
    echo "Totalt $brukere brukere er oppført i passordfilen og det er definert $grupper grupper"
    echo "Oversikt over dine grupper:"
    groups $USER

  14.  
    #! /bin/bash

    for i in $(seq 1 5)
    do
       read IP host rest
       ip[$i]="$IP"
       navn[$i]="$host"
    done < /etc/hosts

    echo Totalt: ${#navn[@]}
    echo Array 3: ${ip[3]} ${navn[3]}

  15.  
    #! /bin/bash

    declare -A ip
    for i in $(seq 1 5)
    do
       read IP host rest
       ip[$host]="$IP"
    done < /etc/hosts

    echo Totalt: ${#ip[@]}
    for i in "${!ip[@]}"
    do
       echo "$i sin IP er ${ip["$i"]}"
    done

  16. (Oblig)
  17.  
    #! /bin/bash
    declare -A event

    while read line ; do
       time=$(echo $line | awk '{print $3}')
       ((event[$time]++))
    done
    echo "Size of evnt ${#event[@]}"

    for time in "${!event[@]}"; do
       echo "$time ${event[$time]}"
    done | sort -nrk 2

  18. (Oblig)