sunsetting
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