Mam do przeanalizowania program napisany w procesorze MIPS. Jego zadaniem jest zamiana ciągu małych liter na duże. W komentarzach (po #) napisałem co według mnie robi dana linia kodu. Niestety nie jestem pewien czy dobrze to wszystko rozumiem. Przede wszystkim nie wiem do czego służy syscall(wywołanie funkcji systemowych?) oraz ogólnej ideii tego programu, tzn. dlaczego robi faktycznie to co robi.

W moich rozważaniach korzystałem głównie z tego: http://en.wikipedia.org/wiki/MIPS_architecture

 
  .data #kolejne dane umieszczane w segmencie danych, (deklaracja segmentu z danymi), (otworzenie sekcji danych)
buffer: .space 64 #alokacja pamieci
 
  .text #kolejne instrukcje będą wykonywane w pierwszej lepszej komorce pamieci (otworzenie sekcji kodu)
 
main:
    la $a0, buffer #adres lancucha, w $a0 mamy etykietę adresu
    li $a1, 64 #li Load Immediate, $rd = 32 bit Immediate value, czyli w $a1 mamy zapisana liczbe 64 na 32 bitach?
    li $v0, 8 # podobnie jak wyzej w $v0 mamy 8 zapisana na 32 bitach?
    syscall #wywolanie funkcji systemowej o numerze wskazywanej przez $v0? Skad się dowiedzieć co to za funkcja?
 
    la $t0, buffer #w $t0 adres bufora
    li $t2, 0x20 #0x20=20 w systemie heksadecymalnym, czyli 0010 0000 w binarnym co jest rowne 2^5=32 i te wartosc zapisujemy na 32 bitach w $t2
loop:
    lb $t1, 0($t0) #lb - load byte, ładuje bajt ( w $t1 mamy pierwszy element tablicy wskazywanej przez $t0?)
    beq $t1, $zero, exit #jesli wartosc w $t1 jeste zerem (czyli np. gdy skonczylismy wpisywac ciag znakow?) wychodzimy z funkcji
 
    beq $t1, $t2, skip #jesli $t1=$t2 idziemy do etykiety skip
 
    xor $t1, $t1, $t2 #w $t1 wynik logicznego xora na rejestrach $t1 i $t2. Po co to robimy?
    sb $t1, 0($t0) #sb Store byte, w $t1 zapisuje pierwszy element tablicy wskazywanej przez $t0 
 
skip:
 
    addi $t0, $t0, 1 #$t0+=1;
 
    j loop #bezwarunkowy skok do etykiety loop
 
exit:
    li $v0, 4
    la $a0, buffer
    syscall
 
    li $v0, 10
    syscall