преабразовать число в строку

Тема в разделе "WASM.BEGINNERS", создана пользователем trust, 30 янв 2008.

  1. trust

    trust New Member

    Публикаций:
    0
    Регистрация:
    18 янв 2008
    Сообщения:
    49
    Подскажите пожалуйста как преобразовать число в строку. т.е. нпример число 1 в строку "1"? С помощью какой функции? Заранее спасибо.
     
  2. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    Функция itoa.
     
  3. PaCHER

    PaCHER New Member

    Публикаций:
    0
    Регистрация:
    25 мар 2006
    Сообщения:
    852
    sprintf
    wsprintf

    MSDN or WASM SEARCH
     
  4. twgt

    twgt New Member

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    1.494
    Добавить 30h :)
     
  5. Nikankin

    Nikankin New Member

    Публикаций:
    0
    Регистрация:
    17 янв 2008
    Сообщения:
    16
    В книге П. И. Рудаков, К. Г. Финогенов ЯЗЫК АССЕМБЛЕРА: УРОКИ ПРОГРАММИРОВАНИЯ в Статья 13. Преобразование чисел в символьную форму есть алгоритм
     
  6. rudik

    rudik Руденко Артём

    Публикаций:
    0
    Регистрация:
    6 дек 2006
    Сообщения:
    302
    Адрес:
    г. Харьков
    Код (Text):
    1.     Procedure_UBIN2STRDEC:
    2.         push ebp
    3.         mov ebp,esp
    4.         push eax
    5.         push edi
    6.         mov eax,[ebp+8]
    7.         mov edi,[ebp+12]
    8.         push edx
    9.         push ebx
    10.         test eax,eax
    11.         jnz @f
    12.         mov ax,"0"
    13.         stosw
    14.         jmp Procedure_BIN2STRDEC_ZERO
    15.  
    16.         @@:
    17.         cmp eax,1000000000
    18.         jnc Procedure_UBIN2STRDEC1000000000
    19.         cmp eax,100000000
    20.         jnc Procedure_UBIN2STRDEC100000000
    21.         cmp eax,10000000
    22.         jnc Procedure_UBIN2STRDEC10000000
    23.         cmp eax,1000000
    24.         jnc Procedure_UBIN2STRDEC1000000
    25.         cmp eax,100000
    26.         jnc Procedure_UBIN2STRDEC100000
    27.         cmp eax,10000
    28.         jnc Procedure_UBIN2STRDEC10000
    29.         cmp eax,1000
    30.         jnc Procedure_UBIN2STRDEC1000
    31.         cmp eax,100
    32.         jnc Procedure_UBIN2STRDEC100
    33.         cmp eax,10
    34.         jnc Procedure_UBIN2STRDEC10
    35.         jmp Procedure_UBIN2STRDEC1
    36.  
    37.         Procedure_UBIN2STRDEC1000000000:
    38.  
    39.         xor edx,edx
    40.         mov ebx,1000000000
    41.         div ebx    
    42.         add al,0x30
    43.         stosb
    44.         mov eax,edx
    45.         Procedure_UBIN2STRDEC100000000:
    46.         xor edx,edx
    47.         mov ebx,100000000
    48.         div ebx    
    49.         add al,0x30
    50.         stosb
    51.         mov eax,edx
    52.         Procedure_UBIN2STRDEC10000000:
    53.         xor edx,edx
    54.         mov ebx,10000000
    55.         div ebx    
    56.         add al,0x30
    57.         stosb
    58.         mov eax,edx
    59.         Procedure_UBIN2STRDEC1000000:
    60.         xor edx,edx
    61.         mov ebx,1000000
    62.         div ebx    
    63.         add al,0x30
    64.         stosb      
    65.         mov eax,edx
    66.         Procedure_UBIN2STRDEC100000:
    67.         xor edx,edx
    68.         mov ebx,100000
    69.         div ebx    
    70.         add al,0x30
    71.         stosb
    72.         mov eax,edx
    73.         Procedure_UBIN2STRDEC10000:
    74.         xor edx,edx
    75.         mov ebx,10000
    76.         div ebx    
    77.         add al,0x30
    78.         stosb      
    79.         mov eax,edx
    80.         Procedure_UBIN2STRDEC1000:
    81.         xor edx,edx
    82.         mov ebx,1000
    83.         div ebx    
    84.         add al,0x30
    85.         stosb
    86.         mov eax,edx
    87.         Procedure_UBIN2STRDEC100:
    88.         xor edx,edx
    89.         mov ebx,100
    90.         div ebx    
    91.         add al,0x30
    92.         stosb
    93.         mov eax,edx
    94.         Procedure_UBIN2STRDEC10:
    95.         xor edx,edx
    96.         mov ebx,10
    97.         div ebx    
    98.         add al,0x30
    99.         stosb
    100.         mov al,dl
    101.             Procedure_UBIN2STRDEC1:
    102.         add al,0x30
    103.         stosb
    104.         mov al,0
    105.         stosb
    106.  
    107.         Procedure_BIN2STRDEC_ZERO:
    108.         pop ebx
    109.         pop edx
    110.         pop edi
    111.         pop eax
    112.         pop ebp
    113.         ret
     
  7. Mikl_

    Mikl_ New Member

    Публикаций:
    0
    Регистрация:
    14 ноя 2006
    Сообщения:
    907
    rudik
    Можно проще, например перевожу 64-битное число в строку (в edx старшая половина, в eax -- младшая)
    Код (Text):
    1. .data
    2. Data_Int64   dq ?;64-разрядное число
    3. Data_BCD     dt ?;число в BCD-формате
    4. .code
    5. ...
    6. IntToStr proc
    7.             or edx,edx      ;число 64-разрядное?
    8.     jnz b1
    9.     cmp eax,10  ;число меньше 10?
    10.              jae b0
    11.     add al,30h
    12.     stosb
    13.              ret
    14. b0: cmp eax,100    ;число меньше 100?
    15.     jae b1
    16.     aam
    17.     add ax,3030h
    18.     xchg ah,al
    19.     stosw
    20.     ret
    21. b1: push ecx
    22.     mov dword ptr Data_Int64,eax;младшая часть 64-разрядного числа
    23.     mov dword ptr Data_Int64+4,edx;старшая часть 64-разрядного числа
    24.     fninit          ;сброс сопроцессора
    25.     fild Data_Int64     ;загрузить число в двоичном коде
    26.     fbstp Data_BCD      ;извлечь число в коде BCD
    27.     mov ecx,9               ;в десятом байте информация о знаке числа
    28. b2:     cmp byte ptr [ecx-1+Data_BCD],0
    29.     jnz b3        
    30.     loop b2         ;пропускаем незначащие (нулевые) разряды слева
    31. b3:    mov al,byte ptr [ecx-1+Data_BCD];загружаем первую значащую пару разрядов
    32.         cmp al,9  ;если в старшей тетраде 0 - пропустить старшую тетраду
    33.     ja b4
    34.     add al,30h      ;младшую тетраду переводим в ASCII
    35.     stosb
    36.     dec ecx
    37. b4:     mov ah,byte ptr [ecx-1+Data_BCD];распаковываем остальные разряды числа
    38.     shr ax,4            ;выделяем старшую и младшую тетрады
    39.     shr al,4
    40.     add ax,3030h        ;переводим в ASCII-код
    41.     xchg ah,al
    42.     stosw
    43.     loop b4
    44.     pop ecx
    45.              ret
    46. IntToStr    endp
     
  8. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    а or круче test'a ?
    afair количество тактов одинаково у них.
     
  9. Mikl_

    Mikl_ New Member

    Публикаций:
    0
    Регистрация:
    14 ноя 2006
    Сообщения:
    907
    n0name
    Можно использовать OR, AND, TEST, SUB REG,0, XOR REG,0 ADD REG,0 -- чтобы узнать есть ли нуль в регистре. Цели оптимизировать по скорости не было, скорее -- получение компактного кода. Но я думаю что три операции fninit/fild/fbstp выполнятся быстрее чем деление в цикле на 10 в результате преобразования 64-битного числа в строку, хотя деление можно заменить умножением на "Magic Number"
     
  10. Mikl_

    Mikl_ New Member

    Публикаций:
    0
    Регистрация:
    14 ноя 2006
    Сообщения:
    907
    Преобразование числа в строку
    сорц и ехе в аттаче
     
  11. Mikl_

    Mikl_ New Member

    Публикаций:
    0
    Регистрация:
    14 ноя 2006
    Сообщения:
    907
    Нашел еще одну интересную реализацию
    Код (Text):
    1.     mov ebx,10
    2.     mov edi,offset Строка
    3.     mov eax,Число
    4.     mov esi,esp
    5.     sub esp,16
    6.     xor ecx,ecx
    7. a1: dec esi
    8.     xor edx,edx
    9.     div ebx
    10.     add dl,"0"
    11.     mov [esi],dl
    12.     inc ecx
    13.     test eax,eax
    14.     jnz a1
    15.     rep movsb
    16.     add esp,16
     
  12. device

    device Reflection

    Публикаций:
    0
    Регистрация:
    26 апр 2007
    Сообщения:
    1.198
    Адрес:
    RF
    Код (Text):
    1.     .text
    2.     .globl main
    3.  
    4. main:
    5.  
    6.    
    7.     pushl $1234567890
    8.     pushl $fmode
    9.     call printf
    10.     popl %ebx
    11.     popl %edx
    12.    
    13.    
    14.     .data
    15. fmode:
    16. .ascii "%d\n"