Architektury systemów komputerowych - Lista 8.

Załóżcie konta i piszcie co niejasne a nie chodźcie po instytucie i nie mówcie „lol na driki jest źle”, wtf?

Zadanie 1.

(XY - Z)(X + ZY) = MUL( (XY - Z), (X + ZY)) = MUL(SUB(XY,Z), ADD(X, ZY)) = MUL(SUB(MUL(X,Y),Z), ADD(X, MUL(Z,Y)))

a)

PUSH X
PUSH Y
MUL
PUSH Z
SUB      # SUB(MUL(X,Y),Z)
PUSH Z
PUSH Y
MUL
PUSH X
ADD      # ADD(X, MUL(Z,Y))
MUL
POP W

b)

LOAD X
MUL Y
SUB Z
STORE $A1  # A1 = SUB(MUL(X,Y),Z)
LOAD Z
MUL Y
ADD X
MUL $A1
STORE W

c)

MOVE $A1 X
MUL $A1 Y
SUB $A1 Z  # A1 = SUB(MUL(X,Y),Z)
MOVE $A2 Z
MUL $A2 Y
ADD $A2 X  # A2 = ADD(X, MUL(Z,Y))
MUL $A1 $A2
MOVE W $A1

d)

MUL $A1 X Y
SUB $A1 $A1 Z # $A1 = SUB(MUL(X,Y),Z)
MUL $A2 Z Y
ADD $A2 $A2 X # $A2 = ADD(X, MUL(Z,Y))
MUL W $A1 $A2

Zadanie 2.

Poprawione

W = MIN(X,Y,Z) = MIN(MIN(X,Y),Z)

        PUSH Y
        POP W       ; Tymczasowo W = Y
        PUSH X
        SUB Y
        JMPGTZ yltx ; Jump if MIN(X,Y) = Y
xlty:   PUSH X
        POP W       ; MIN(X,Y) = X
yltx:   PUSH Z
        SUB W
        JMPGTZ end
zltw:   PUSH Z
        POP W
end:

Zadanie 3.

A = A + B

10: SBN T T 20 ; T = 0
20: SBN T B 30 ; T = -B
30: SBN A T 40 ; A = A - -B = A + B

Zadanie 4.

C = A*A
A > 0
X = 1
I - iterator
B - tymczasowa wartość

      SBN B B 10   ; C = 0
10:   SBN I I 20   ; I = 0
20:   SBN Z Z 30   ; Z = 0
30:   SBN Z A 40   ; Z = -A
40:   SBN I Z 50   ; I = 0 - -A = A
50:   SBN I X loop ; I = A - 1 (bo odliczamy do -1, nie 0)
loop: SBN B A 80   ; B -= A
80:   SBN I X end  ; if(I-- < 0) goto end
      SBN P P 90   ; P = 0
90:   SBN P X loop ; goto loop
end:  SBN C C 100  ; C = 0
100:  SBN C B 110  ; C = A*A

Zadanie 5.

Poprawione

$s0 = f
$s1 = g
$s2 = h
$s3 = &A[0]
$s4 = &B[0]
g = -f + h + B[1];
sub $s7, $zero, $s0  ; $s7 = -f
add $s7, $s7, $s2    ; $s7 = -f + h
add $s1, $s7, 1($s4) ; g = $s7 + B[1]
f = A[B[g]+1];
add  $s6, $s1, $s4   ; $s6 = &B[0] + g
lw   $s6, 0($s6)     ; $s6 = B[g]
addi $s6, $s6, 1     ; $s6 = B[g] + 1
add  $s6, $s6, $s3   ; $s6 = &A[0] + B[g] + 1
lw   $s0, 0($s6)     ; f = A[B[g]+1]

Zadanie 6.

a)

if f > 1 then
        g = f + f;
        f = 0;
endif;
        g = g + 1;
$s0 = f
$s1 = g
      addi $s3, $zero, 1    ; $s3 = 1
      slt $s2, $s0, $s3     ; $s2 = (f < 1) ? 1 : 0
      bne $s2, $s3, end     ; if(!(f < 1)) goto end;
      add $s1, $zero, $zero ; g = 0
      add $s1, $s0, $s0     ; g = f + f
      add $s0, $zero, $zero ; f = 0
end:  addi $s1, $s1, 1      ; g++

b)

f = 1;
while f < 10 do
        f = f + 1;
endwhile
$s0 = f
      addi $s3, $zero, 1    ; $s3 = 1
      addi $s4, $zero, 10   ; $s4 = 10 ; lol mips
      addi $s0, $zero, 1    ; $s0 = 1
      slt $s2, $s0, $s4     ; $s2 = (f < 10) ? 1 : 0
      bne $s2, $s3, end     ; if(!(f < 10)) goto end
loop:
      addi $s0, $s0, 1      ; f++
      slt $s2, $s0, $s4     ; $s2 = (f < 10) ? 1 : 0
      neq $s2, $s3, loop    ; if(f < 10) goto loop
end:

c)

g = 0;
for f = 1 to 10 do
        g := g + f;
$s0 = f
$s1 = g
      addi $s4, $zero, 11   ; $s4 = 11
      add $s1, $zero, $zero ; g = 0
      addi $s0, $zero, 1    ; f = 1
loop:
      add $s1, $s1, $s0     ; g += f
      addi $s0, $s0, 1      ; f++
      slt $s2, $s0, $s4     ; $s2 = (f < 11) ? 1 : 0
      neq $s2, $s3, loop    ; if(f < 11) goto loop
end:

Zadanie 7.

MIPS Instruction Set
To samo na wiki
Z notatek:

  • t0 ­ t7 to rejestry 8 ­ 15
  • t8 ­ t9 to rejestry 24 ­ 25
  • s0 ­ s7 to rejestry 16 ­ 23

a)

$t0 = 8
$zero = 0
$t1 = 9
$s3 = 19
add $d, $s, $t
000000 sssss ttttt ddddd 00000100000 
add $t0, $t0, $zero
000000 01000 00000 01000 00000100000
lw $t, offset($s)
100011 sssss ttttt iiiiiiii iiiiiiii 
lw $t1, 4($s3)
100011 10011 01001 00000000 00000100

b)

0xAE0BFFFC = 10101110000010111111111111111100
sw $t, offset($s)
101011 sssss ttttt iiiiiiii iiiiiiii 
101011 10000 01011 11111111 11111100
sw $t3, -4($s0)

0x8D08FFC0 = 10001101000010001111111111000000
lw $t, offset($s)
100011 sssss ttttt iiiiiiii iiiiiiii
100011 01000 01000 11111111 11000000
lw $t0, -64($t0)

Zadanie 8.

kod MIPS

      addi $t1,    $s0,    400
LOOP: lw   $s1,    0($s0)
      add  $s2,    $s2,    $s1
      lw   $s1,    4($s0)
      add  $s2,    $s2,    $s1
      addi $s0,    $s0,    8
      bne  $t1,    $s0,    LOOP

ilość operacji

400/8 = 50 iteracji. 50 * 6 + 1.

kod C

      extern int32_t *i;
      extern int32_t result;
      extern int32_t *memarray;
      int32_t dupa;
      i = memarray + 400/sizeof(int32_t);
loop: dupa = memarray[0];
      result += dupa;
      dupa = memarray[4/sizeof(int32_t)];
      result += dupa;
      memarray += 8/sizeof(int32_t);
      if(i != memarray) 
              goto loop;

Czyli:

      extern int32_t result;
      extern int32_t *memarray;
      int i;
      for(i = 0; i < 100; i++)
              result += memarray[i];

Udowodnij równoważność programów:P

Zadanie 9.

Ten kod jest troche lepszy niz naiwne liczenie, poniewaz robi tylko tyle wywolan ile jest jedynek.

    sub $s1, $s1, $s1
for:    
    beq  $s0, $zero, endfor
    subi $t0, $s0, 1
    and  $s0, $s0, $t0
    addi $s1, $s1, 1
    j for
endfor:

Zadanie 10.

gcd:
    addi $t2, $a0, 0
    addi $t3, $a1, 0

    bne  $a0, $zero, while
    addi $v0, $a1, 0
while:
    beq  $a1, $zero, endwhile
    
    slt  $t0, $a1, $a0
    bne  $t0, $zero, blta
altb:
    sub  $a0, $a0, $a1
blta:
    sub  $a1, $a1, $a0
endcase:

    j while
endwhile:
    addi $v0, $a0, 0
lcm:

    div  $t2, $v0
    mflo $t2
    mult $t2, $t3
    mflo $v1 
 
architektury_systemow_komputerowych/lista8.txt · ostatnio zmienione: 2011/11/11 12:55 przez rejnaldo
 
Wszystkie treści w tym wiki, którym nie przyporządkowano licencji, podlegają licencji:MIT License
Recent changes RSS feed