我的程序中有一个计数器。我想将完成的计数器存储在缓冲区中,这样我就可以将它发送到mmio display.My问题是我需要一个数字的char表示,以便我可以将它存储在字符串缓冲区中。
为了简化操作,您可以先在C或C ++程序中实现逻辑,然后手动或在编译器的帮助下将其转换为汇编代码。
For example, translate to hex representation:
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
作为索引来提取正确的字符,从而避免计算加数的所有麻烦。