אני לא נוהג לפרסם יותר מדי דברים טכניים גיקים פה, אבל הפעם אני אחרוג מכיוון ששברתי את הראש עד 3 ומשהו בבוקר אתמול בשביל לסיים את התוכנית הזאת. זה מה שקורה שדוחים לרגע האחרון ומתחילים ב10 בלילה להכין את העבודה שצריך להגיש למחרת, זה התרגיל האחרון של אותה עבודה. תוכנית ב MIPS (סוג של שפת סף) שלוקחת מספר בבסיס הקסה דצימלי וממירה אותו למספר עשרוני. יש לציין שלמדתי מיפס לצורך הגשת העבודה, כלומר זו פיסת הקוד השניה שאני נאלץ לכתוב, הקוד לא מושלם, בטח גם לא מרשים, אפילו מכוער, אבל עובד כמו נינג'ה.
.data str1:.asciiz "\nInsert a number in hexadecimal: " str2:.asciiz "\nDecimal value: " newline:.asciiz "\n" hex: .space 33 strsize: .word 0 .text .globl main main: li $v0,4 #prints str1 la $a0,str1 syscall li $v0,8 #reads string la $a0,hex li $a1,32 syscall li $v0,4 #prints str2 la $a0,str2 syscall jal fixstr #replace \n with \0 jal converthex #converts to decimal move $a0,$v0 li $v0,1 syscall li $v0,4 #prints newline la $a0,newline syscall li $v0,10 #exit syscall fixstr: la $t0,hex li $t1,0 li $t3,10 # new line \n loop: lb $t2,($t0) beq $t2,$t3,foundnewline addi $t0,$t0,1 addi $t1,$t1,1 j loop foundnewline: sb $zero,($t0) sw $t1,strsize jr $ra hexchar2dec: li $t0,47 blt $a0,$t0,terminate li $t0,70 bgt $a0,$t0,terminate li $t0,57 ble $a0,$t0,ok li $t0,65 blt $a0,$t0,terminate ok: #between 48...57 or 65...70 = 0-9 or A-F li $t0,58 blt $a0,$t0,number addi $v0,$a0,-55 jr $ra number: addi $v0,$a0,-48 jr $ra terminate: li $v0,-1 jr $ra power: move $t0,$a0 beqz $t0,ret1 li $t1,1 li $t2,16 p_loop: mul $t1,$t1,$t2 addi $t0,$t0,-1 beqz $t0,done j p_loop done: move $v0,$t1 jr $ra ret1: li $v0,1 jr $ra converthex: la $t0,hex li $t1,0 lw $t3,strsize addi $t3,$t3,-1 li $t4,-1 li $t6,0 #sum c_loop: lb $t1,($t0) beqz $t1,finish move $a0,$t1 addi $sp,$sp,-8 sw $ra,0($sp) sw $t0,4($sp) jal hexchar2dec lw $ra,0($sp) lw $t0,4($sp) addi $sp,$sp,8 beq $v0,$t4,badstring move $t5,$v0 # save current char move $a0,$t3 # pos addi $sp,$sp,-16 sw $ra,0($sp) sw $t0,4($sp) sw $t1,8($sp) sw $t2,12($sp) jal power # 16^pos lw $ra,0($sp) lw $t0,4($sp) lw $t1,8($sp) lw $t2,12($sp) addi $sp,$sp,16 mul $t5,$t5,$v0 add $t6,$t6,$t5 # sum += currentchar^16^pos addi $t3,$t3,-1 # pos-1 addi $t0,$t0,1 # next char j c_loop badstring: li $v0,-1 jr $ra finish: move $v0,$t6 jr $ra
