#assembly #ascii #mips #mips32 #mars-simulator
#сборка #ascii #mips #mips32 #mars-simulator
Вопрос:
У меня есть счетчик в моей программе. Я хочу сохранить готовый счетчик в буфере, чтобы я мог отправить его на дисплей mmio.Моя проблема в том, что мне нужно символьное представление числа, чтобы я мог сохранить его в строковом буфере.
Комментарии:
1. многократно делите на базу, чтобы получить каждую цифру, преобразуйте в символы ascii
2. ах, видите, итак, в моем регистре у меня 0x000000b. Как мне преобразовать их в asci? (Я подумал, что с меньшими значениями я мог бы просто добавить его в ascii для 0)
3. Немедленные существуют в потоке команд. К тому времени, когда они попадают в регистры, не имеет значения, как они туда попали. Но если ваше целое число получено из постоянной времени сборки, у вас также может быть постоянная времени сборки в байтах ASCII, например
li $t0, '1234'
(обратите внимание на одинарные кавычки, что делает его 32-битной / 4-байтовой многосимвольной ASCII-константой.) Затем вы можете просто сохранить$t0
в свой строковый буфер.4. Большое спасибо за все ответы instructivel. В итоге я использовал rem для получения цифр от наименьшего к наибольшему, затем добавил цифру к ‘0’ и сохранил в буфере. Наконец, я просто изменил содержимое буфера.
Ответ №1:
Чтобы упростить задачу, вы могли бы сначала реализовать свою логику в программе на C или C и перевести ее в ассемблерный код вручную или с помощью компилятора.
Например, перевести в шестнадцатеричное представление:
void u2hexs(unsigned n, char* buf)
{
buf = 8;
for (int i = 0; i < 8; i )
{
unsigned digit = n amp; 15;
unsigned ch = (digit < 10) ? '0' digit : 'A' digit - 10;
*--buf = ch;
n >>= 4;
}
}
Преобразуется в:
u2hexs:
b $L4
addiu $3,$5,8
$L8:
addiu $2,$2,48
addiu $3,$3,-1
sb $2,0($3)
beq $5,$3,$L9
srl $4,$4,4
$L4:
andi $2,$4,0xf
sltu $6,$2,10
bne $6,$0,$L8
nop
addiu $2,$2,55
addiu $3,$3,-1
sb $2,0($3)
bne $5,$3,$L4
srl $4,$4,4
$L9:
j $31
nop
Существует более одного способа сделать это. Вы могли бы удалить дополнительную ветвь и вместо этого вычислить константу, которая добавляется к digit
, из значения, возвращаемого sltiu
инструкцией. Возможно, вы могли бы использовать условные инструкции перемещения ( movn
и movz
).
Вы также можете определить массив символов, содержащий 16 шестнадцатеричных цифр (от ‘0’ до ‘F’) и использовать digit
в качестве индекса для извлечения правильного символа и, таким образом, избежать всех проблем с вычислением дополнения.