Antonshka Опубликовано 11 февраля, 2021 Поделиться Опубликовано 11 февраля, 2021 Привет, помогите пожалуйста с преобразованием числа 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). Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 11 февраля, 2021 Поделиться Опубликовано 11 февраля, 2021 2 часа назад, Antonshka сказал: Например: А если так попробовать: 1) mov [memory],rax 2) fld [memory] 3) fbstp [memory] Ссылка на комментарий Поделиться на другие сайты Поделиться
Xipho Опубликовано 11 февраля, 2021 Поделиться Опубликовано 11 февраля, 2021 Выбирай на свой вкус и не изобретай велосипед 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
Antonshka Опубликовано 11 февраля, 2021 Автор Поделиться Опубликовано 11 февраля, 2021 (изменено) 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 Изменено 11 февраля, 2021 пользователем Antonshka 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения