Преобразование шестнадцатеричного символа в десятичный эквивалент в MIPS - PullRequest
1 голос
/ 04 мая 2009

Как мне взять один символ ASCII и преобразовать его в десятичный эквивлант в MIP?

Нужно ли просто иметь некоторые условия, чтобы вычесть определенное количество из кода ascii, чтобы сделать его десятичным представлением?

Ответы [ 3 ]

2 голосов
/ 04 мая 2009

Вот упрощенная реализация того, что написал Пакс (предполагается, что шестнадцатеричные цифры - от A до F всегда в верхнем регистре)

Файл hextodec.c

#include <stdio.h>

/*
*Converts an ASCII char to its decimal equivalent.
*Returns -1 on error.
*
*/
extern int hextodec(char* c);

int main(int argc,char **argv){
        int i=0;
        char digits[]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','F'};

        for (;i<16;i++){
                printf("%c\t%d\n",digits[i],hextodec(digits+i));
        }
        return 0;
}

Файл hextodec.S

#include <mips/regdef.h>

/* int hextodec(char* c) 
 *  first (and only) argument is set in register a0.
 *  return value is set in register v0.
 *  function calling convention is ignored.
 */
        .text
        .globl hextodec
        .align 2
        .ent hextodec


hextodec:

        lbu     t0,0(a0)        #load byte from argument

        li      t1,0X30
        li      t2,0x39

        andi    t1,t1,0x000000ff #Cast to word for comparison.
        andi    t2,t2,0x000000ff

        bltu    t0,t1,ERROR     #error if lower than 0x30
        bgt     t0,t2,dohex     #if greater than 0x39, test for A -F

        addiu   t0,t0,-0x30     #OK, char between 48 and 55. Subtract 48.
        b       return

dohex:  li      t1,0x41
        li      t2,0x46

        andi   t1,t1,0x000000ff #Cast to word for comparison.
        andi   t2,t2,0x000000ff

        /*is byte is between 65 and 70?*/

        bltu    t0,t1,ERROR     #error if lower than 0x41
        bgt     t0,t2,ERROR     #error if greater than 0x46

ishex:  addiu   t0,t0,-0x37     #subtract 55 from hex char ('A'- 'F')
        b       return

ERROR:  addiu   t0,zero,-1      #return -1.

return: move    v0,t0           #move return value to register v0

        jr      ra
        .end    hextodec

тестовый прогон

root@:~/stackoverflow# ./hextodec 
0       0
1       1
2       2
3       3
4       4
5       5
6       6
7       7
8       8
9       9
A       10
B       11
C       12
D       13
E       14
F       15
root@:~/stackoverflow# 
1 голос
/ 04 мая 2009

Следует проверить один шестнадцатеричный символ, если он находится в диапазоне

  • '0' до '9' (48–57),
  • 'A' до 'F' (65–70) или
  • 'a' через 'f' (от 97 до 102).

Все остальное является ошибкой. Если он попадает в один из этих диапазонов, выполните следующее:

  • Отнимите 48 (доведет '0' до '9' до 0-9).
  • Если оно по-прежнему больше 9, вычтите 7 (переводит 'A' - 'F' в 10-15).
  • Если оно все еще больше 15, вычтите 32 (переводит 'a' - 'f' в 10-15).

Если вы уверены, что символ всегда будет в верхнем регистре для недесятичных цифр, вы можете пропустить третий шаг в каждом из перечисленных выше списков, но для этого не требуется много дополнительного кода.

0 голосов
/ 04 мая 2009

Да, вычесть 48 из значения ASCII, вероятно, будет проще всего.

...