Как быстро преобразовать немедленный в регистре в символы для хранения в строке - PullRequest
0 голосов
/ 05 апреля 2019

У меня есть счетчик в моей программе. Я хочу сохранить законченный счетчик в буфере, чтобы я мог отправить его на дисплей mmio. Моя проблема в том, что мне нужно представление числа в виде символа, чтобы я мог сохранить его в строковом буфере.

1 Ответ

0 голосов
/ 05 апреля 2019

Чтобы упростить задачу, вы могли бы сначала реализовать свою логику в программе на 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 в качестве индекса для извлечения правильного символа и, таким образом, избежать всех трудностей при вычислении сложения.

...