Как быстро преобразовать немедленное в регистре в символы для хранения в строке

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