Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 5 059

Раздел: Ассемблер
/ вопрос открыт /

Доброго времени суток, уважаемые эксперты!
Как конвертировать число в строку и строку в число на ассемблере (х86, вин32)? Я пробовал стандартно - выделяю одну цифру (получаю остаток от деления на 10 и записываю её в строку, делю число на 10 и опять получаю остаток), сделал но проблема встала с отрицательными числами. Ну ваааще никвакую. Когда голова начала кружиться пришёл сюда. В общем, от вас нужна либо ссылка на апи функции, которые такое вытворяют, либо две процедурки (одна принимает DWORD, возвращает PBYTE, другая принимает PBYTE, возвращает DWORD), либо такой совет чтобы я прям сейчас взял да и написал эти процедурки сам.

Gooddy Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: 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

Gooddy (статус: 3-ий класс), 1 марта 2011, 18:36 [#1]:

Желательно для MASM'а, но без макросов =).
Чисти код! Чисти код! Чисти код!
Gooddy

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

Gooddy (статус: 3-ий класс), 1 марта 2011, 19:46 [#3]:

ААА.je ntslab3
а надо прыгать если ne)
всё, спасибо
Чисти код! Чисти код! Чисти код!

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:42
Выполнено за 0.04 сек.