• 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

Object Storage Arubacloud
0 głosów
222 wizyt
pytanie zadane 23 listopada 2023 w Assembler przez hutsalo1998 Użytkownik (520 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 (41,050 p.)
Możesz napisać Przemek ;)
komentarz 25 listopada 2023 przez Oscar Nałogowiec (29,320 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 (520 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,320 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 (520 p.)
Działa. Dzięki bardzo.
komentarz 25 listopada 2023 przez reaktywny Nałogowiec (41,050 p.)
Można ten kod sprawdzić gdzieś on-line?
1
komentarz 25 listopada 2023 przez hutsalo1998 Użytkownik (520 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 (41,050 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 (520 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 (520 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 (520 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 (520 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 (520 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ź 756 wizyt
pytanie zadane 30 maja 2017 w Assembler przez Robert92 Nowicjusz (160 p.)
0 głosów
0 odpowiedzi 36 wizyt
pytanie zadane 1 grudnia 2023 w Assembler przez hutsalo1998 Użytkownik (520 p.)
0 głosów
1 odpowiedź 620 wizyt
pytanie zadane 9 listopada 2019 w Assembler przez julka97 Nowicjusz (120 p.)

92,579 zapytań

141,429 odpowiedzi

319,657 komentarzy

61,962 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.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...