Чтобы упростить задачу, вы могли бы сначала реализовать свою логику в программе на C или C ++ и перевести ее в код сборки вручную или с помощью компилятора.
Например, перевести в шестнадцатеричное представление :
void u2hexs(unsigned n, char* buf)
{
buf += 8;
for (int i = 0; i < 8; i++)
{
unsigned digit = n & 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
в качестве индекса для извлечения правильного символа и, таким образом, избежать всех трудностей при вычислении сложения.