# (C) 2006 Martin Sloup, A04372 # E-mail: msloup@students.zcu.cz # Vytvoreno v ramci semestralni prace z KIV/UPA # Kod prevadi Signed integer na jeho reprezentaci v ASCII, napr 0xB2 -> "178" .data # datovy segment OVSTUP: .asciiz "Zadej cislo: " #vstupni textova hlaska ODPOVED: .asciiz "Cislo v ASCII: " #vystupni textova hlaska .text .globl main # deleni 10, zbytek se ulozi do $v1, quocient do $v0 DELENI: #dvou parametrove div mi nechtelo fungovat, tak se to muselo napsat takhle: div $v0, $a0, 10 # provedeme deleni deseti, v $v1 je zbytek, v $v0 quocient mul $t0, $v0, 10 sub $v1, $a0, $t0 jr $ra #vratime se zpet do hlavniho programu nop main: move $s0, $ra #ulozime si navratovou pozici programu # tiskni "Zadej cislo:" li $v0, 4 la $a0, OVSTUP syscall #vstup cisla z klavesnice li $v0, 5 syscall #hodime cislo z vystupu do $t0 move $t0, $v0 #pamatovak na znamenko nastavime na 0 li $t1, 0 #nejprve zjistime znamenko bgezal $t0, BEZZN # if $t0 >= 0 then goto BEZZN nop #pokud je cislo zaporne, provedeme negaci a pricteni jednicky not $t0, $t0 add $t0, $t0, 1 #ulozime pamatovak na znamenko li $t1, 1 BEZZN: #promenou na cyklus nastavime na 5 li $t2, 5 nop DALD: #pokud probehl cyklus 5x skocime na PODEL blez $t2, PODEL nop #provedeme subrutinu deleni, jako parametr vstpuje delenec move $a0, $t0 jal DELENI # deleni nop #jako vystup vyleza $v0 pro quocient a $v1 jako zbytek #ulozime zbytek do zasobniku addi $sp, $sp, -1 sb $v1, ($sp) nop #do $t0 nastavime quocient move $t0, $v0 #snizime pocitadlo cyklu subu $t2, 1 # a provedem dalsi cyklus j DALD nop PODEL: #vyhodime text odpovedi li $v0, 4 la $a0, ODPOVED syscall # predelani na text # nejprve znamenko, pokud bylo zadane cislo zaporne beqz $t1, BTEXTZN nop #zobrazime minus li $v0, 11 # misto 11 napsat jen 1, pokud vypisovat jako integer li $a0, '-' syscall #odkomentovat, pokud psat carku # li $v0, 11 # li $a0, ',' # syscall BTEXTZN: #promenou na cyklus nastavime na 5 li $t2, 5 #pamatovak, zda uz bylo nulove cislo nastavime na 0 li $t1, 0 PLOOP: #pokud cyklus probehl 5x skocime na ONULY blez $t2, ONULY nop #naceteme cislo ze zasobniku lb $t0, ($sp) addi $sp, $sp, 1 nop #snizime cislo cyklu subu $t2, 1 #pokud jiz bylo cislo nenulove, skocime na tisk cisla bgtz $t1, TISK nop #je-li cislo nulove pokracujeme na dalsi beqz $t0, PLOOP nop #je-li nenulove, nastavime pamatovak, ze se tak stalo li $t1, 1 TISK: #tisk cisla #pricetem k cislu ascii hodnotu znaku nuly add $t0, $t0, '0' #vypiseme na obrazovku li $v0, 11 # misto 11 napsat jen 1, pokud vypisovat jako integer move $a0, $t0 syscall #odkomentovat, pokud psat carku # li $v0, 11 # li $a0, ',' # syscall #skocime na dalsi cislo j PLOOP nop ONULY: #nyni osetrime, pokud bylo zadano nulove cislo, to pozname tak, ze se z haldy nacetla sama nulova cisla bnez $t1, KONEC nop li $v0, 11 # misto 11 napsat jen 1, pokud vypisovat jako integer li $a0, '0' syscall KONEC: #novej radek na konec li $v0, 11 li $a0, 0x0A syscall #nastavime spadky $ra move $ra, $s0 jr $ra nop