המרה מהקסה לעשרוני במיפס – Convert from hexadecimal to decimal in mips

אני לא נוהג לפרסם יותר מדי דברים טכניים גיקים פה, אבל הפעם אני אחרוג מכיוון ששברתי את הראש עד 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

כתיבת תגובה