|
Вопрос # 5 059/ вопрос открыт / |
|
Доброго времени суток, уважаемые эксперты!
Как конвертировать число в строку и строку в число на ассемблере (х86, вин32)? Я пробовал стандартно - выделяю одну цифру (получаю остаток от деления на 10 и записываю её в строку, делю число на 10 и опять получаю остаток), сделал но проблема встала с отрицательными числами. Ну ваааще никвакую. Когда голова начала кружиться пришёл сюда. В общем, от вас нужна либо ссылка на апи функции, которые такое вытворяют, либо две процедурки (одна принимает DWORD, возвращает PBYTE, другая принимает PBYTE, возвращает DWORD), либо такой совет чтобы я прям сейчас взял да и написал эти процедурки сам.
 |
Вопрос задал: Gooddy (статус: 3-ий класс)
Вопрос отправлен: 1 марта 2011, 18:29
Состояние вопроса: открыт, ответов: 1.
|
Ответ #1. Отвечает эксперт: Вадим К
Здравствуйте, Failure!
Вот простенький код на с, который легко переводится в асм
string StringUtilities :: itos (int n) {
char * s = new char[17];
string u;
if (n < 0) { //turns n positive
n = (-1 * n);
u = "-"; //adds '-' on result string
}
int i=0; //s counter
do {
s[i++]= n%10 + '0'; //conversion of each digit of n to char
n -= n%10; //update n value
}
while ((n /= 10) > 0);
for (int j = i-1; j >= 0; j--) {
u += s[j]; //building our string number
}
delete[] s; //free-up the memory!
return u;
}
Память под строку char * s = new char[17]; можно выделить заранее.
 |
Ответ отправил: Вадим К (статус: Академик)
Время отправки: 1 марта 2011, 19:20
Оценка за ответ: 5
Комментарий к оценке: Но код для си я и сам писал =(
|
Мини-форум вопроса
Всего сообщений: 3; последнее сообщение — 1 марта 2011, 19:46; участников в обсуждении: 1.
|
Gooddy (статус: 3-ий класс), 1 марта 2011, 18:36 [#1]:
Желательно для MASM'а, но без макросов =).
Чисти код! Чисти код! Чисти код!
|
|
Gooddy (статус: 3-ий класс), 1 марта 2011, 19:40 [#2]:
уже написал асмовский код, но...
numberToString proc number:DWORD ;result:PBYTE
local result:PBYTE, count:DWORD, nowCh:DWORD
mov [count],0 ;count=0
mov eax, [number] ;eax=number
cmp eax, 0
jl ntslab1
jmp ntslab2
ntslab1:
pushd '-'-48
inc [count]
neg eax
jmp ntslab3
ntslab2:
pushd '+'-48
inc [count]
ntslab3:
mov edx, 0
mov ebx, 10
div ebx ; edx:eax/ebx
mov [nowCh],edx ; now=eax mod 10
pushd [nowCh]
inc [count]
cmp eax, 0 ;if eax==0
je ntslab3 ;then jmp 3
;create string
mov ecx, [count]
inc ecx ;прибавляем 1 для терминатора
invoke getMemory, ecx ; получаем память
mov [result], eax
mov edi, [result]
add edi, [count]
std
mov al, 0
stosb
ntslab4:
pop DWORD PTR [nowCh]
mov eax, [nowCh] ;al = байт
add eax, 48
stosb
dec [count]
cmp [count],0
jg ntslab4
mov eax, [result]
ret
numberToString endp
но работает только с 4мя символами (включая унарный знак).
Почему не знаю.
Чисти код! Чисти код! Чисти код!
|
|
Gooddy (статус: 3-ий класс), 1 марта 2011, 19:46 [#3]:
ААА.je ntslab3
а надо прыгать если ne)
всё, спасибо
Чисти код! Чисти код! Чисти код!
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|