Symbole w MIPS assemblerze

0

Witam. Potrzebuję utworzyć tego typu znaczek przy użyciu tablic w MIPS assemblerze:
Rozumiem, że skoro symbol # jest zastrzeony, to musze skorzystac z ASCII? Próbowałem znaleźć cokolwiek na ten temat w wielu książkach i w sieci, ale próżno. Może ktoś mi pomóc lub ewentualnie wskazać gdzie mógłbym na ten temat poczytać? Z góry dziękuję

##########
#
#
##########
1

Nie do końca rozumiem Twój problem. Znak '#' pisze się w dokładnie taki sam sposób jak każdy inny:

.text 
li $v0, 4
la $a0, msg
syscall
# ...

.data
msg: .asciiz   "####"

(geshi nie potrafi kolorować MIPSa chyba, szkoda)

Wypisuje poprawnie "####".

Może chodzi Ci o to że # nie może wystąpić po prostu w kodzie źródłowym, bo oznacza komentarz (czyli może próbowałeś, niepoprawnego, kodu w rodzaju msg: .asciiz ####).

0

Dzieki. A da sie ustawic to tak, aby system drukowal, np.: tablice, gdzie stringi zlozone sa wlasnie z wielu takich symboli, bez umieszczania w kodzie zrodlowym tego typu stringow:

li $v0, 4
la $a0, msg
syscall
######################################################################################################################################################################################################################################################

a jedynie przy okresleniu jaki znak system ma drukowac i ile razy? Czyli przy uzyciu:

li $v0, 4
la $a0, msg
syscall
#

i okrelesleniu, iz pojedynczy symbol "#" ma byc wydrukowany dana ilosc razy?

0

No możesz użyć pętli ;).

Przy czym wywoływanie syscalla dla każdego znaku jest dość wolne, dużo lepiej (szybciej tzn) byłoby ew. składać ten napis w pętli i dopiero wtedy wypisywać.
Ale jeśli Twoja tabelka ma stały wygląd to nie bawiłbym się w to prawdopodobnie i po prostu hardcodował odpowiedni napis, bo po co sobie dokładać roboty ;) (chyba że naprawde spore są, wtedy patrz wyżej -> pętla).

0

z ciekawosci zapytam do czego ci to potrzebne? Na studiach ucza tego?

0

@msm: niestety, ale musze to zrobic w ten wlasnie sposob. Po wielkich bólach doszedłem do czegoś takiego:

# s0=licznik, s1=wskaznik dla el., s2=wskaznik dla dugosci ciagu tablicy, s3=12 (granica ciagu tablicy)

   .data
dlugtabl        .space 12
tablica:        .word 5, 1, 4          # trzy ciągi znaków "#", pierwszy z pięcioma el., drugi z 1, trzeci z 4.
naklejka1:    .asciiz "#####"
naklejka2:    .asciiz "#"
naklejka3:    .asciiz "####"

   .text
main:
li $s0, 0                                  # ustawiam wartość licznika na 0
la $s1, tablica                          # laduje adres wskaznika
lw $s2, dlugtabl                        # przypisuję znaczenie s2
li $s3, 12                                 # ustawiam granicę tablicy dla ostatniego elementu

petla:                   
#pętla while działająca na zasadzie: while(i<s3) i++;
sll $t1, $s0, 2                          # mnożę ilość bitów x4: $t1=4*i
add $t1, $t1, $s1                     # $t1 równe jest adresowi tablicy: tablica[i]
lw $t0, 0($t1)                         # ładuję t0 przyjmującą wartość tablicy: tablica[i]
#Teraz muszę ustawić warunek przy którym pętla się zakończy jeśli t0 przekroczy wartość 12 (choć nie wiem czy koniecznie muszę skoro #nie wprowadzam żadnych danych z klawiatury)
slt $t0, $s1, $s3
bne $t0, m$s3, Exit
add $s3, $s3, 1                       # i++
j petla
Exit:

#teraz starałem się wykorzystać funkcję "if" do połączenia elementów numerycznych z tablicy z napisem symbolicznym 
beq $s1, 0, N1                       # jeśli s1=0 to idź do naklejki N1
beq $s1, 1, N2                       # jeśli s1=1 to idź do naklejki N2
beq $s1, 2, N3                       # jeśli s1=2 to idź do naklejki N3

N1: 
li v0, 4
la a0, naklejka1
syscall

N2:
li v0, 4
la a0, naklejka2
syscall

N3: 
li v0, 4
la a0, naklejka3
syscall

Nie wiem gdzie i z czym namieszałem. Niestety MIPS wraz ze swoją symboliką mnie przerasta. Nie wiem czy dasz radę się w tym połapać, ale sam pomimo czytania nie mogę tego ogranąć, a nie znam nikogo zaznajomionego z mipsem, aby mi to wytłumaczył

0

Ok. Trochę ogarnąłem ten swój bałagan i postanowiłem to zrobić w inny sposób.
Niestety pętla nie działa poprawnie i drukuje mi w nieskończoną ilość razy tą samą liczbę symboli. :/ Gdzie popełniłem błąd?

# $s0=licznik, $s1=suma, $s3=dane $s4=rozmiar(3) $s8=wskaznik

	.data

Mssg1:		.asciiz "Witam\n"

Line1:		.asciiz "*****\n"
Line2:		.asciiz "*\n"
Line3:		.asciiz "****\n"


tablica:    .word 12
wykres:	    .word Line1, Line2, Line3

	.globl main
	.text

main:
	li $s0, 0 		# licznik=0
	la $s4, tablica		# rozmiar tablicy
	la $s8, wykres		# wskaznik

	li $v0, 4 		# print_str "Witam"
	la $a0, Mssg1		
	syscall

petla:
	lw $s3, 0($s8)		# dane=tablica[wskaznik]
	add $s1, $s1, $s3	# suma=suma+dane
	
	addi $s8, $s8, 4	# i=i+1
	#add $t0, $0, $s4	# t0=s4	

	li $v0, 4
	lw $a0, wykres		# print_str 
	syscall
	
	bne $s0, $s4, petla 	# jesli mniejsza niz 3 wroc do petli 

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