Mips, как я могу преобразовать символ в двоичный файл? - PullRequest
1 голос
/ 27 мая 2010

Моя проблема в получении 64-битного ключа от пользователя. Для этого мне нужно получить 16 символов в виде строки, которая содержит шестнадцатеричные символы (123456789ABCDEF). Я получил строку от пользователя, и я достиг символов с кодом ниже. Но я не знаю, как преобразовать символ в двоичные 4 бита. в

.data 


insert_into: 
    .word 8 

Ask_Input:  
    .asciiz "Please Enter a Key which size is 16, and use hex characters : " 


key_array: 
    .space 64

.text
.globl main


main: 

    la $a0, Ask_Input 

    li $v0, 4 
    syscall 

    la $a0, insert_into 
    la $a1, 64 
    li $v0, 8
    syscall

    la $t0, insert_into
    li $t2, 0
    li $t3, 0
  loop_convert:
        lb $t1, ($t0)
        addi $t0, $t0, 1 

        beq $t1, 10, end_convert

# Now charcter is in $t1 but 
  #I dont know how to convert it to 4 bit binary and storing it


        b loop_convert

    end_convert:        

    li $v0, 10  # exit
    syscall

Ответы [ 2 ]

0 голосов
/ 31 июля 2013

Я не думаю, что маскирование с 0x15 как мнение @ Joelmob является правильным решением, потому что

'A' = 0x41 → 0x41 & 0x15 = 0
'B' = 0x42 → 0x42 & 0x15 = 0
'C' = 0x43 → 0x43 & 0x15 = 1
'D' = 0x44 → 0x44 & 0x15 = 4
'E' = 0x45 → 0x45 & 0x15 = 5
'F' = 0x46 → 0x46 & 0x15 = 4

, который не выдает никаких соответствующих двоичных значений

Самый простой способ - вычитать нижний предел диапазона из значения символа . Я дам идею в C, вы можете легко преобразовать ее в MIPS asm

if ('0' <= ch && ch <= '9')
{
    return ch - '0';
}
else if ('A' <= ch && ch <= 'F')
{
    return ch - 'A' + 10;
}
else if ('a' <= ch && ch <= 'f')
{
    return ch - 'a' + 10;
}

Еще один способ реализации:

if ('0' <= ch && ch <= '9')
{
    return ch & 0x0f;
}
else if (('A' <= ch && ch <= 'F') || ('a' <= ch && ch <= 'f'))
{
    return (ch & 0x0f) + 9;
}

Однако это может быть дополнительно оптимизировано для одного сравнения с использованием методики, описанной в следующих вопросах

Теперь чеки можно переписать, как показано ниже

if ((unsigned char)(ch - '0') <= ('9'-'0'))
if ((unsigned char)(ch - 'A') <= ('F'-'A'))
if ((unsigned char)(ch - 'a') <= ('f'-'a'))

Любой современный компилятор может выполнить такую ​​оптимизацию, вот пример вывода

hex2(unsigned char):
        andi    $4,$4,0x00ff     # ch, ch
        addiu   $2,$4,-48      # tmp203, ch,
        sltu    $2,$2,10         # tmp204, tmp203,
        bne     $2,$0,$L13
        nop
        andi    $2,$4,0xdf       # tmp206, ch,
        addiu   $2,$2,-65      # tmp210, tmp206,
        sltu    $2,$2,6  # tmp211, tmp210,
        beq     $2,$0,$L12         #, tmp211,,
        andi    $4,$4,0xf        # tmp212, ch,

        j       $31
        addiu   $2,$4,9        # D.2099, tmp212,

$L12:
        j       $31
        li      $2,255                  # 0xff   # D.2099,

$L13:
        j       $31
        andi    $2,$4,0xf        # D.2099, ch,
0 голосов
/ 28 мая 2010

Посмотрите на эту ASCII таблицу . Вы увидите, что шестнадцатеричный код для чисел от 9 и ниже - 0x9, а для заглавных букв - от 0x41 до 0x5A. AZ определяет, является ли его число или символ, Вы видите, что число вполне готово, если бы это была маска символов с 0x15, чтобы получить четыре бита.

Если вы хотите включить строчные буквы, выполните ту же процедуру с маскировкой и определите, является ли ее символ от 0x61 до 0x7A

...