Pomoc z programem w Asembl'erze

0

Muszę stworzyć program, który po wpisaniu jakiegoś znaku zmienia go na duży lub mały, np. po wpisaniu k musi wyświetlić się K. na razie zrobiłem tyle i nie wiem w czym mam błąd, mógłby ktoś pomóc?

	.data
str1:	.asciiz "Podaj znak: "
str2:   .asciiz "Zmieniony znak to: "

.globl main
.text 
main:	
	li $v0, 4
	la $a0, str1 #wyswietlenie napisu
	syscall
	li $v0, 8 #wczytanie znaku
	syscall
	move $s0, $v0
	subi $s0, $s0, 0x20
	andi $s0, $s0, 0xfd
	li $v0, 4
	la $a0, str2 #wyswietlenie napisu
	syscall
	li $v0, 8 #wypisanie wyniku
	move $v0, $s0
	syscall
 	li $v0, 10 #koniec programu
0

A co dokładnie nie działa? Jak odpalisz pod debugerem to powinno być widać który fragment nie działa.

0
.data
str1: .asciiz "Podaj znak: "
str2: .asciiz "Zmieniony znak to: "

.globl main
.text
main:
li $v0, 4
la $a0, str1 #wyswietlenie napisu
syscall
li $v0, 12 #wczytanie znaku
syscall
move $s0, $v0
subi $s0, $s0, 0x20
andi $s0, $s0, 0xfd
addi $s0, $s0, 0x20
ori $s0, $s0, 0x20
li $v0, 4
la $a0, str2 #wyswietlenie napisu
syscall
li $v0, 11 #wypisanie wyniku
move $a0, $s0
syscall
li $v0, 10 #koniec programu
syscall

Działa teraz z dużej litery na małą, lecz na odwrót nie jak wpisuje "a" to wyskakuje również "a", ma ktoś jakiśpomysł?

0

No dobra, ale czemu wg ciebie powinno zadziałać? Robisz tu jakieś (((c - 0x20) & 0xfd) + 0x20) | 0x20. Co dokładnie to miało dać? Raz że jest bardziej skomplikowane niż powinno a dwa że zamiana mała na dużą wymaga odwrotnej operacji niż zamiana dużej na małą...

chr(ord('A')+0x20)
'a'

vs.

chr(ord('a')-0x20)
'A'

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