Assembler mips?

0

Witam,
Miałam do napisania program w assemblerze mips liczacy pola figur trójkata prostokata i koła, tylko cos mi nie działa, czy ktoś pomoże

.data

starter: .asciiz "Witamy, wybierz co chcesz obliczac: \n1.Trójkat \n2.Prostokat \n3.Kolo\n"
pierwsza: .asciiz "Podaj wysokosc, bok i promien\n"
druga: .asciiz "Podaj druga wysokosc, bok i promien\n"
wynik: .asciiz "Pole to:\n"
jeden: .word 1
dwa: .word 2
trzy: .word 3

.text

main:
	li $v0, 4				
	la $a0, starter			
	syscall
	li $v0, 5			
	syscall
	move $t0, $v0						
	lw $a0, jeden			
	move $t1, $a0
	beq $t0, $t1, trojkat		
	lw $a1, dwa			
	move $t2, $a1
	beq $t0, $t2, prostokat
	jal kolo 
	syscall

trojkat:
	la      $a0,  	starter
	li      $v0,  4			
	syscall 			
	li      $v0,  7  		
	syscall 			
	mov.d   $f2,  $f0		
	la      $a0,  pierwsza		
	li      $v0,  4			
	syscall 			
	li      $v0,  7  		
	syscall 			 
	li      $t1,  0x40000000	
	li      $t0,  0x00000000	
	mtc1.d  $t0,  $f4		
	mul.d   $f0,  $f0, $f2		
	div.d   $f12, $f0, $f4		
	la      $a0,  wynik	
	li      $v0,  4			
	syscall				
	li      $v0,  3			
	syscall				
	jal exit	
	
prostokat:
	la $a0, pierwsza	
	li $v0, 4
	syscall
	li $v0, 5		
	syscall
	move $t0, $v0		
	la $a0, druga		
	li $v0, 4
	syscall
	li $v0, 5		
	syscall
	move $t1, $v0		
	
		mul $t2, $t0, $t1	
		la $a0, wynik		
		li $v0, 4
		syscall
		li $v0, 1
		add $a0, $zero, $t2	
		syscall
		jal exit
		
kolo:	la      $a0,  pierwsza	
	li      $v0,  4			
	syscall				
	li      $v0,  7  		
	syscall 			
	li      $t1,  0x400921f9	
	li      $t0,  0xf01b866e	
	mtc1.d  $t0,  $f2		
	mul.d   $f0,  $f0, $f0		
	mul.d   $f12, $f0, $f2		
	la      $a0,  wynik		
	li      $v0,  4			
	syscall				
	li      $v0,  3			
	syscall				
	jal exit		
	exit:
		li $v0, 10		
		syscall
0

Aha, coś ci nie działa, spoko.
Gdy przychodzisz do lekarza to także mówisz panie, coś mnie boli?

0

Tuż pod label-em trojkat ładujesz do rejestru $a0 adres stringa pod label-em starter, czyli pytanie o wybór figury, a następnie go wyświetlasz. Oprócz tego zamiast zwykłego jump-a (j) stostujesz skok ze śladem (jal), co jest w tym wypadku bez sensu. Ogólnie jest bardzo dużo do poprawy w tym kodzie.

0

Poprawienie pytań sprowadza się do:

  1. Dodać napisy z pytaniami o odpowiednie wartości do sekcji .data:
trojkat_podstawa: .asciiz "Podaj długosc podstawy: "
trojkat_wysokosc: .asciiz "Podaj wysokosc: "
  1. Poprawić pytania pod label-em trojkat. Zamiast:
la      $a0,      starter
li      $v0,  4            
syscall             
li      $v0,  7          
syscall             
mov.d   $f2,  $f0        
la      $a0,  pierwsza        
li      $v0,  4            
syscall             
li      $v0,  7          
syscall

Powinno być:

la $a0, trojkat_podstawa
li $v0, 4
syscall
li $v0, 7
syscall
mov.d $f2, $f0
la $a0, trojkat_wysokosc
li $v0, 4
syscall
li $v0, 7
syscall

Po tych zmianach ten kawałek kodu (nie testowałem go) ma szansę zacząć działać. Nie zmienia to jednak faktu, że są tu takie błędy jak:

  • Wartości pod label-ami jeden, dwa, trzy nie są wyrównane do 4 bajtów, a jest to wymagane (należy dodać przed nimi .align 2)
  • Komunikaty wyświetlane dla prostokąta i koła też raczej nie są tymi, które są oczekiwane.
  • Używanie jal zamiast j. Skok ze śladem (jal) zmienia zawartość rejestru $ra, a to raczej nie jest oczekiwane. Zazwyczaj jal używa się do wywoływania funkcji.
  • Większość stałych powinna być zdefiniowana dyrektywą .eqv NAZWA WARTOSC, tak by było widać jaki jest ich sens (konieczna jest sensowna nazwa).

Pewnie jest coś jeszcze, czego na pierwszy rzut oka nie widać.

1 użytkowników online, w tym zalogowanych: 0, gości: 1