• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Asembler pod architekture MIPS w programie MARS

0 głosów
867 wizyt
pytanie zadane 23 listopada 2023 w Assembler przez hutsalo1998 Użytkownik (540 p.)

Czy ktoś ogarnia asemblera w środowisku MARS. Obecnie na studiach przerabiam architekture MIPS i robie zadania w środowisku Mars. Jedno z tych zadań jest następujące:

Napisz program MIPS, który prosi użytkownika o wpisanie swojego imienia, a następnie wypisuje „Czesc”, a następnie imienia wprowadzonego przez użytkownika.

Napisałem coś takiego:

.data
myWord: .space 20
hello: .asciiz "Czesc: \n"
str1: .asciiz   "Jak sie nazywasz?: \n"
str2: .asciiz "Nazywam sie: \n"
.text

main:
	li $v0, 4
	la $a0, hello
	syscall 
	li $v0, 4
	la $a0, str1
	syscall 
	
	li $v0, 4
	la $a0, str2
	syscall 
	
	la $a0, myWord
	li $a1, 8
	
	li $v0, 8
	syscall 
	
	li $v0, 10
	syscall 

tylko nie działa dla dłuższych Imion. Przykładowo. Jak chce wyświetlić imie Przemysław to mi ucina do Przemys

komentarz 23 listopada 2023 przez reaktywny Nałogowiec (46,230 p.)
Możesz napisać Przemek ;)
komentarz 25 listopada 2023 przez Oscar Nałogowiec (29,360 p.)

@hutsalo1998, Nie znam tego środowiska ani assemblera, ale przez analogie. Domyślam się, że syscall 4 to print a 8 to read.  Stąd trochę masz dziwną kolejność operacji - najpierw wypisujesz 3 teksty a potem czytasz imie. W rejestrze a1 przy czytaniu masz 8 (linia 21) - to jest chyba maksymalna długość wczytywanego tekstu (imienia). Natomiast miejsce masz zarezerwowane na 20 znaków (linia 2 - w sumie to 19 znaków bo jeszcze zero). Tak więc w linii 21 możesz wpisać więcej, ale powyżej 19 trzeba jeszcze zwiększyć miejsce w linii 2.

komentarz 25 listopada 2023 przez hutsalo1998 Użytkownik (540 p.)

@Oscar: No też mnie to dziwi. Ale może wątpliwości rozwieje ten przykład nadesłany przez prowadzącego:

dlaczego jest tak, że  najpierw jest drukowanie czyli li $v0, 4 czyli linia 8,  a dopiero potem jest pobieranie danych od użytkownika li $v0, 5 czyli linia 11. Przecież kod jest wykonywany z góry do dołu. No chyba, że w asemblerze jest inaczej?

komentarz 25 listopada 2023 przez Oscar Nałogowiec (29,360 p.)

Sam fakt, że najpierw się coś pisze a potem czyta to normalne - trzeba najpierw wypisać pytanie. Tylko dlaczego w pierwotnym kodzie masz od razu wypisanie wszystkich 3 tekstów?

Kolejna uwaga - jak się wypisuje pytanie to zwykle (zwyczajowo) nie kończy się tego nową linią, tylko pozwala się użytkownikowi pisać dalej w tej samej linii - a każdy tekst w kodzie kończy się \n czyli nową linią. No i słowo cześć i imię użytkownika na być napisane w 1 linii - czyli albo zabawa z tekstami (by je skleić w pamięci) albo kilka oddzielnych print-ów z kawałkami - pierwszy raz "Cześć", potem imie i potem sama nowa linia.

 

Widziałby to jakoś tak (przeróbka twojego kodu, ale nie sprawdzona, nie mam jak)

.data
username:   .space 20
hello:      .asciiz "Czesc "
prompt:     .asciiz  "Jak sie nazywasz?: "
newline:    .asciiz "\n"
.text
 
main:
    li $v0, 4
    la $a0, prompt
    syscall 

    li $v0, 8
    la $a0, username
    li $a1, 19
    syscall 

    li $v0, 4
    la $a0, hello
    syscall 
     
    li $v0, 4
    la $a0, username
    syscall 
     
    li $v0, 4
    la $a0, newline
    syscall 
     
    li $v0, 10
    syscall

 

komentarz 25 listopada 2023 przez hutsalo1998 Użytkownik (540 p.)
Działa. Dzięki bardzo.
komentarz 25 listopada 2023 przez reaktywny Nałogowiec (46,230 p.)
Można ten kod sprawdzić gdzieś on-line?
1
komentarz 25 listopada 2023 przez hutsalo1998 Użytkownik (540 p.)
Online to nie wiem, ale ja osobiście korzystam z MARSA na komputerze. Udało się znaleźć coś takiego https://www.csfieldguide.org.nz/en/interactives/mips-assembler/ jeśli chodzi o online
komentarz 25 listopada 2023 przez reaktywny Nałogowiec (46,230 p.)
Dzięki. Twój link służy do otrzymania kodu maszynowego. Odpalić kod można w symulatorze, ta sama strona trochę inny link:

https://www.csfieldguide.org.nz/en/interactives/mips-simulator/

3 odpowiedzi

+1 głos
odpowiedź 25 listopada 2023 przez hutsalo1998 Użytkownik (540 p.)

Mam jeszcze do zrobienia 3 zadania z mipsa. Kolejne to jest mini kalkulator. Mam pobrać liczbe od użytkownika i podwojić jej wartość. Dotychczasowy kod:

	.data
str1: .asciiz  "Podaj liczbe \n"
str2: .asciiz  "Wprowadzona liczba: "
result: .asciiz "Result"
	.text
main:
	li $v0, 4
	la $a0, str1
	syscall 
	
	li $v0, 5
	syscall 
	move $t0, $v0
	
	li $v0, 4
	la $a0, str2
	syscall 
	
	add $t0, $t0, 3
	
	li $v0, 4
	la $a0, result
	syscall 
	
	li $v0, 1
	move $a0, ($t0)
	syscall 
	
	li $v0, 10
	syscall 

musze użyć instrukcji add

0 głosów
odpowiedź 25 listopada 2023 przez hutsalo1998 Użytkownik (540 p.)

Generalnie program już działa tylko dane wyjściowe nie bardzo. Jak wprowadze coś z klawiatury i wyświetla mi sie w patologiczny sposób:

0 głosów
odpowiedź 27 listopada 2023 przez hutsalo1998 Użytkownik (540 p.)

Mam do napisania jescze 2 programy:

Pierwszy:

Zmodyfikuj ponownie program pokazany na rysunku 3.4. Zapytaj użytkownika, czy chce powtórzyć program: „\ nPowtorzyc [t / n]?”. Użyj kodu serwisowego 12, aby odczytać znak i rozgałęziającą instrukcję do powtarzania głównej funkcji, jeśli wprowadzony przez użytkownika znak to „t”.

tutaj dotychczasowy kod:

	.data
str1: .asciiz "Podaj liczbe:"
str2: .asciiz "Otrzymana liczba to: \n"
repeat: .asciiz "\ nPowtorzyc [t/n]?"
	.text 
main:
	li $v0, 4
	la $a0, str1
	syscall 
	
	li $v0, 5
	syscall 
	move $s0, $v0
	
	li $v0, 4
	la $a0, str2
	syscall
	 
	
	li $v0, 1
	move $a0, $s0
	syscall 
	
	li $v0, 4
	la $a0, repeat
	syscall
	
	li $v0, 10
	syscall 

a tu drugi:

Napisz program MIPS, który wprowadza dwie wartości całkowite. Program powinien generować komunikat: „sa rowne”, jeśli dwie liczby całkowite są równe. W przeciwnym razie generuje komunikat „nie sa rowne”. Skorzystaj z instrukcji sterujących podanych w instrukcji, aby sprawdź równość.

kodu jeszcze nie ma.

komentarz 27 listopada 2023 przez hutsalo1998 Użytkownik (540 p.)

Można by powiedzieć, że ten program:

Zmodyfikuj ponownie program pokazany na rysunku 3.4. Zapytaj użytkownika, czy chce powtórzyć program: „\ nPowtorzyc [t / n]?”. Użyj kodu serwisowego 12, aby odczytać znak i rozgałęziającą instrukcję do powtarzania głównej funkcji, jeśli wprowadzony przez użytkownika znak to „t”.

w pewnym sensie już mi działa, jeśli użytkownik wciśnie n

kłopot jest tylko gdy wcisne t

komentarz 27 listopada 2023 przez hutsalo1998 Użytkownik (540 p.)

Napisałem taki program, który pyta użytnika co wybrałeś t/n, Ale nie wiem czy to jest dobrze:

	.data
msg: .asciiz "Co wybierasz [t/n]?"
msg3: .asciiz "Wybrales"
	.text
main:

	li $v0, 4
	la $a0, msg
	syscall 
	

	li, $v0, 12
	la, $a0, msg
	syscall
	
	
	beq $a0, $a1 numbersEqual
	
	
numbersEqual:
	li $v0, 4
	la $a0, msg3
	syscall
	
	li $v0, 10
	syscall 

 

Podobne pytania

0 głosów
1 odpowiedź 862 wizyt
pytanie zadane 30 maja 2017 w Assembler przez Robert92 Nowicjusz (160 p.)
0 głosów
0 odpowiedzi 189 wizyt
pytanie zadane 1 grudnia 2023 w Assembler przez hutsalo1998 Użytkownik (540 p.)
0 głosów
1 odpowiedź 715 wizyt
pytanie zadane 9 listopada 2019 w Assembler przez julka97 Nowicjusz (120 p.)

93,608 zapytań

142,531 odpowiedzi

323,002 komentarzy

63,099 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Kursy INF.02 i INF.03
...