如何快速将寄存器中的立即数转换为字符串中存储的字符

问题描述 投票:0回答:1

我的程序中有一个计数器。我想将完成的计数器存储在缓冲区中,这样我就可以将它发送到mmio display.My问题是我需要一个数字的char表示,以便我可以将它存储在字符串缓冲区中。

assembly ascii mips mips32 mars-simulator
1个回答
0
投票

为了简化操作,您可以先在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的常量。你也许可以使用条件移动指令(movnmovz)。

您还可以定义一个包含16个十六进制数字(从'0'到'F')的字符数组,并使用digit作为索引来提取正确的字符,从而避免计算加数的所有麻烦。

© www.soinside.com 2019 - 2024. All rights reserved.