Конечно. Директива .ascii - это не что иное, как директива .byte, ориентированная на хранение текста ASCII
.ascii "PP"
похоже на
.byte 80,80
Вы можете использовать .space
, чтобы освободить место для вашей строки ASCII, а затем использовать буфер при преобразовании из целого числа в ASCII, если вы подразумеваете это как "sw into .ascii директива" из целого числа. Следующий код преобразует «двоичное число» в строку ASCII, используя itoa, и печатает его (только для тестирования) с помощью print_string. Функция использует буфер и возвращает указатель на первую цифру ASCII, используемую для печати. Это может быть использовано в качестве первой вспомогательной функции для реализации функции, подобной sprintf.
.data
buffer:
.space 32
.text
# the main supposes env. like spim or MARS
main:
li $a0, 1234 # a number
jal itoa
move $a0, $v0
li $v0, 4 # print_string
syscall
li $v0, 10
syscall # exit
itoa:
la $t0, buffer # load buf
add $t0, $t0, 30 # seek the end
sb $0, 1($t0) # null-terminated str
li $t1, '0'
sb $t1, ($t0) # init. with ascii 0
slt $t2, $a0, $0 # keep the sign
li $t3, 10 # preload 10
beq $a0, $0, iend # end if 0
neg $a0, $a0
loop:
div $a0, $t3 # a /= 10
mflo $a0
mfhi $t4 # get remainder
add $t4, $t4, $t1 # convert to ASCII digit
sb $t4, ($t0) # store it
sub $t0, $t0, 1 # dec. buf ptr
bne $a0, $0, loop # if not zero, loop
addi $t0, $t0, 1 # adjust buf ptr
iend:
beq $t2, $0, nolz # was < 0?
addi $t0, $t0, -1
li $t1, '-'
sb $t1, ($t0)
nolz:
move $v0, $t0 # return the addr.
jr $ra # of the string
После того, как у вас в основном $ v0, lb R, ($v0)
выбирает «1», lb R, 1($v0)
выбирает вторую цифру (2) и т. Д .; помните, что строка заканчивается нулем, поэтому, если вы выберете 0 (числовой), вы должны остановить