MIPS: как манипулировать строками, хранящимися в аргументах программы?

#assembly #memory-management #mips

#сборка #управление памятью #mips

Вопрос:

Таким образом, в основном входные данные программы представляют собой 2 отдельные строки в разделе аргументы программы. Они могут быть либо 0x … (шестнадцатеричными), либо 0b … (двоичными). Код, который у меня есть на данный момент, является :

 li $v0, 36
lw $t1, ($a1)
lb $t2, 2($t1)
syscall

li $v0, 36
lw $t3, 4($a1)
lb $t4, 2($t3)
syscall
  

li $v0, 36 Это просто отпечатки, чтобы проверить, получил ли я значение.
Основная проблема заключается в том, что $t1 и $t3 имеют правильный адрес памяти. Я вижу, что в $a1 адресе памяти хранятся два отдельных адреса памяти для расположения строки. $t1 и $t3 содержат их, в то время как $t2 и $t4 должны сдвигаться и считывать второй символ.

По какой-то причине, независимо от того, какие входные данные вводятся в аргументы программы, это всегда выводит 2. Если я изменю системный вызов на 34, он будет печатать 0x00000002 , а если я изменю его на 11 для печати символа, как обычно, он будет печатать поле. Мне просто нужно определить, является ли это x для шестнадцатеричного или b для двоичного кода, чтобы я мог соответствующим образом редактировать входные данные. Любая помощь была бы замечательной.

РЕДАКТИРОВАТЬ: даже если я выполняю системный вызов 11 либо в 2, либо в 1 смену, он выводит поле. Например, [] вместо фактического символа.

Комментарии:

1. системный вызов 36 выводит целое число в $ a0, верно? Но вы не показываете, что находится в $ a0. (Может быть, это argc?)

2. lb $ t2, 2($t1) загружает третий символ строки. 1 ($ t1) — это второй символ, а 0 ($ t1) — первый.