ďťż

sunsetting

photo

Bardzo proszę specjalistów tylko o sprawdzenie czy jest ok - daje plusy

Kod:
Zadanie 1

Rozważamy kod źródłowy, gdzie M oraz N są stałymi zadeklarowanymi za pomocą #define.

int mat1[M] [N];
int mat1[N] [M];

int sum_element (int i, int j)
{
return mat1[i] [j] + mat2[i] [j] ; 
}

Zakładamy, że ów kod spowodował wygenerowanie następującego kodu w asemblerze:

sum_element:
               pushl %ebp
               movl %esp,%ebp
               movl 8(%ebp),%eax
               movl 12(%ebp),%ecx
               sall $2,%ecx
               leal 0(,%eax,8),%edx
               addl %eax,%edx
               leal (%eax,%eax,4),%eax
               movl mat2(%ecx,%eax,4),%eax
               addl mat1(%ecx,%edx,4),%eax
               movl %ebp,%esp
               popl %ebp
               ret

Jakie są wartości M oraz N?

Odp.:

M = 5

N = 7

Kod: Zadanie 2

Załóżmy, ze a oraz b są zmiennymi całkowitymi ze znakiem i że komputer wykorzystuje reprezentacje uzupełnieniową do dwóch. Zakładamy też, że MAX_INT jest największa liczba
tego typu, a MIN_INT - najmniejsza; ponadto W to długość słowa pomniejszona o jeden (np. W = 31, jeśli rozważana reprezentacja jest 32-bitowa).

Dopasować kod po prawej stronie do opisów po lewej, wpisując odpowiednią literę (a), (b), lub (i) przy każdej z liczb (1), (2), (3), (4) i (5).

(1) a                            (a) ~ ( ~ a | (b ^ (MIN_INT + MAX_INT)))
             Odp.: B
                            (b) ((a ^ b) & ~b) | (~(a ^ b) & b)
(2) a & b
             Odp.: A                    (c) 1 + (a << 3) + ~a
                           
(3) a * 7                        (d) (a << 4) + (a << 2) + (a << 1)
             Odp.: C
                            (e) ((a < 0) ? (a + 3) : a) >> 2
(4) a / 4
             Odp.: I                    (f) a ^ (MIN_INT + MAX_INT)

(5) (a < 0) ? 1 : -1                      (g) ~ ((a | (~a + 1)) >> W) & 1
             Odp.: H       
                            (h) ~ ((a >> W) << 1)

                            (i) a >> 2

Kod: Zadanie 3

Rozważmy następujący kod asemblerowy wygenerowany dla pętli for w języku C:

loop:
    pushl  %ebp
    movl  %esp,%ebp
    movl  8(%ebp),%ecx
    movl  12(%ebp),%edx
    xorl  %eax,%eax
    cmpl  %edx,%ecx
    jle  .L4
.L6:
    decl  %ecx
    incl  %edx
    incl  %eax
    cmpl  %edx,%ecx
    jg  .L6
.L4:
    incl  %eax
    movl  %ebp,%esp
    popl  %ebp
    ret

Uzupełnić brakujące fragmenty kodu źródłowego na podstawie kodu asemblerowego.
Uwaga: Można używać nazw zmiennych x, y oraz result, natomiast nie można używać
nazw rejestrów.

Odp.:

int loop(int x, int y)
{
  int result;
  for (result = 0; x > y; result++) {
    x--;
    y++;
  }
  result++;
  return result;
}

Kod: Zadanie 4

Rozważmy następujący kod asemblerowy wygenerowany dla funkcji foo, zawierającej pętlę for:

foo:
    pushl  %ebp
    movl  %esp,%ebp
    pushl  %ebx
    movl  8(%ebp),%ebx
    leal  2(%ebx),%edx
    xorl  %ecx,%ecx
    cmpl  %ebx,%ecx
    jge  .L4
.L6:
    leal  5(%ecx,%edx),%edx
    leal  3(%ecx),%eax
    imull  %eax,%edx
    incl  %ecx
    cmpl  %ebx,%ecx
    jl  .L6
.L4:
    movl  %edx,%eax
    popl  %ebx
    mov  l%ebp,%esp
    popl  %ebp
    ret

Uzupełnić brakujące fragmenty tak, by otrzymać kod odpowiadający powyższemu.

Odp.:

int foo(int a)
{
  int i;
  int result= a + 2;
  for (i = 0; i < a; i++) {
    result = result + i+5; // result += i+5;
    result = result * (i+3); // result *= i+3;
  }
  return result;
}

Kod: Zadanie 5

Rozważmy następujący fragment kodu dla procesora z serii IA32:

0x400446e3 <malloc+7>:   call  0x400446e8  <malloc+12>
0x400446e8 <malloc+12>:  popl %eax

Jaką wartość będzie zawierał rejestr %eax po wykonaniu się instrukcji popl? Wartość
podać szesnastkowo.

Odp.:
%eax  = 0x400446e8



Co do 3 to result nie jest zmienna lokalna, poniewaz nigdzie nie ma deklaracji pamieci na nia, wiec musi byc globalna, w 4 podobnie tez nie widze zmiennych lokalnych.
5 masz dobrze napewno.

Tak tylko zerknalem na te zadania, wiec moga byc jeszcze jakies bledy oraz 1 i 2 nie chcialo mi sie czytac nawet
Co do 3 to result nie jest zmienna lokalna, poniewaz nigdzie nie ma deklaracji pamieci na nia, wiec musi byc globalna, w 4 podobnie tez nie widze zmiennych lokalnych.

"lokalna przeciez jest INT RESULT wiec nie moze byc globalna a w ASM i tak wszystko na koncu jest ladowane do %EAX i to jest zwracana wartoscia"
int result nie jest zmienna lokalna tej funkcji, sa tylko wykonywane na niej operacje w funkcji.

@up
Jesli mialaby byc to zmienna lokalna to byloby po ustawieniu ramki stosu:
Kod: subl $0x4, %esp - 0x4 poniewaz to typ int

Przed wywolaniem funkcji w trzecim przykladzie na stos jest wrzucana wartosc y, a nastepnie x, eip i wywolanie funkcji.
Potem to co widzimy, czyli cialo funkcji, mamy ustawienie ramki i skopiowanie dwoch parametrow ze stosu do ecx i edx, a eax jest zerowane, czyli jest to licznik petli, moze byc result, ale jesli result bylo wczesniej zadeklarowane, a nie w ciele funkcji.


to jakie sugerujesz rozwiązanie? - proszę pomóż, ja jutro o 10.00 mam z tego egzamin :/
Wszystko w trzecim masz dobrze poza tym, ze result jest zmienna globalna, czyli tak powinno byc:
Kod:
int result;
int loop(int x, int y)
{
        for(result = 0; y > x; result++) {
                x--;
                y++;
        }
        result++;
        return result;
}

Nie dawaj mi pochwal za to, poniewaz wedlug mnie glupio miec z jednego tematu kilka pochwal
ok poprawiłem trzecie i czwarte, jeszcze jak byś mi na zadanie 2 rzucił okiem to wogóle byłbym ci super wdzięczny
Co do drugiego to mozesz na kalkulatorze zrobic wystarczy je zrozumiec, wiec tak:
1) a i b liczby calkowite
2) reprezentacja uzupelnieniowa do dwoch, wiec procesor 16 bitowy, poniewaz procesory 32 bitowe wykorzystuja dopelnienie do czterech.
3) skoro 16 bitowy to a i b beda typu signed int, poniewaz typ int ma rozmiar zalezny od architektury, a signed bo maja byc ze znakiem
4) MAX_INT bedzie +32767, a MIN_INT -32768, czyli signed int na 16 bitowym procku lub signed short int na 32 bitowym
5) W bedzie rowne 15, poniewaz 16bit minus 1 wynosi 15

Zostalo tylko podstawic jakies liczby za a i b i liczyc na kalkulatorze
ok - wielkie dzięki - plusa już nie daje
  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • kazimierz.htw.pl