Перейти к содержанию

Конвертировать ASCII в Hex (Ассемблер)


Antonshka

Рекомендуемые сообщения

Привет, помогите пожалуйста с преобразованием числа ASCII в Hex число.

Например, в памяти приложения есть строка, - Player12. Задача, - взять число 12, стоящее после Player, и преобразовать его в Hex, то есть в C. Сделать это нужно на ассемблере.

Число 12, в виде строки, записывается в памяти как 3132, в Hex.

 

Можно воспользоваться следующим способом преобразования:

1) регистр RAX = 0;

2) RAX  *  10  +  (31 - 30);  // (RAX теперь равен 1)

3) RAX  *  10  +  (32 - 30);  // (RAX теперь равен 12)

 

Но проблема в том, что на выходе мы имеем число 12, а не C, в регистре RAX.

Добраться до 12 в Player12, - не проблема. Вычесть 30, умножить на 10, сложить, - тоже не проблема. Проблема в том, как преобразовать в Hex.

 

FPU сопроцессор имеет для преобразования числа 12 (которое уже в RAX),  в C (Hex),  специальную команду - fbld.

Например:

1) mov [memory],rax

2) fbld [memory] //загружаем 12

3) fistp [memory] //выгружаем уже C (Hex)

Но у меня такой способ не работает, выгружает всегда 8000 (если fistp word ptr).

 

 

Ссылка на комментарий
Поделиться на другие сайты

6 часов назад, Garik66 сказал:

А если так попробовать:

1) mov [memory],rax

2) fld [memory] 

3) fbstp [memory]

fbstp как раз таки преобразовывает Hex в String. Мне нужно наоборот, - String в Hex.

 

Hex в String

Спойлер

fild [memory] //загружаем 12 (Integer) или C (Hex)
fbstp [memory] //выгружаем 12 (String)

 

String в Hex

Спойлер

fbld [memory] //загружаем 12 (String)
fistp [memory] //выгружаем 12 (Integer) или C (Hex)

 

 

Разобрался почему не работал способ с fbld. Нужно было перед инструкцией обнулить значение следующего адреса.

Спойлер

mov qword ptr [memory+8],0
fbld [memory] //загружаем 12 (String)
fistp [memory] //выгружаем 12 (Integer) или C (Hex)

 

 

Спасибо @Xipho  за наводку. Вызов Atoi работает как надо

Спойлер

alloc(TextValue,100)
registersymbol(TextValue)
alloc(IntValue,100)
registersymbol(IntValue)

...
lea rcx,[TextValue]
call atoi
mov [IntValue],rax
...

TextValue:
db '154'

 

 

Также в том первом способе что я написал выше, ошибка была в том, что нужно было умножать не на 10, а на 0A

Спойлер

GetAddress://GetAddress
//Здесь был код, который сохранял в R12 адрес начала строки
xor rax,rax
call Begin
ret


Begin://Begin
movzx rsi, byte ptr [r12]
test rsi,rsi //Проверка конца строки. Конец строки будет там, где будет байт 00.
jz End
//--------
sub rsi,30
imul rax,0A
add rax,rsi
inc r12
jmp Begin
//--------
End://End
ret

 

 

Изменено пользователем Antonshka
  • Плюс 1
Ссылка на комментарий
Поделиться на другие сайты

×
×
  • Создать...

Важная информация

Находясь на нашем сайте, Вы автоматически соглашаетесь соблюдать наши Условия использования.