Достъп до един знак в низ

Използвам нещо като SPIMS или MARS със syscall функции.

Чета в низ (и работи, защото мога да го отпечатам), както следва:

li $v0, 8
la $a0, string
li $a1, 256
syscall

Имам обаче проблем с достъпа до един знак от низа. Така че, ако искам да получа достъп до първия знак и да го отпечатам, опитвам това:

la $t0, string
lb $a0, ($t0)
li $v0, 4
sys call

Ако опитам нещо подобно:

la $a0, string
li $v0, 4
syscall

Това отпечатва целия низ като низ сочи към целия низ.

Ако опитам нещо като:

la $a0, string
lb $a0, ($t0)
li $v0, 4
syscall

Това ми дава грешка извън границите. Не разбирам защо обаче - знакът не е ли дълъг байт и това просто зарежда първия байт от низа в $a0?

Благодаря ти


person darksky    schedule 28.09.2011    source източник


Отговори (1)


Разглеждайки документацията за функциите на MARS syscall, можете да видите, че услугата 4 , който използвате, очаква $a0 да бъде "[адресът] на низ с нулев край за отпечатване", което обяснява поведението, което виждате.

Това, което искате, е функция 11 "print character", която отпечатва младшия байт като знак. С други думи, следното трябва да работи (не е тествано):

la $t0, string
lb $a0, ($t0)
li $v0, 11
syscall
person user786653    schedule 28.09.2011
comment
IMO винаги трябва да нулирате стойностите на регистрите, преди да изпълните LI. Никога не знаеш какво може да съдържа горната половина на думата. - person m0skit0; 29.09.2011
comment
LI е псевдооперация, която асемблерът обикновено разширява в ORI $rd,$zero, low16bits, последвано от LUI $rd, hi16bits. Пълните 32 бита на целевия регистър са правилно зададени след LI инструкция, така че няма нужда ръчно да нулирате регистъра преди LI. - person markgz; 30.09.2011