Cancellation of number



  • I can't figure out how I'm gonna get this number out. ASCII♪ Like, if I have a number five, I'm just transferring it. ASCII And I'm pulling out, what if the number 99992 is clean, no macroes and plugs?

    section .data                            
    value db 5
    

    section .text
    global _start

    _start:

    mov ecx, [value]
    add ecx,0x30
    mov [value],ecx

    mov eax, 4
    mov ebx, 1
    mov ecx, value
    mov edx, 5
    int 80h

    mov eax, 1
    mov ebx, 0
    int 80h

    Using NASM, starting on linux.



  • Here's the option:

    sub esp, 12      ; создаём буфер под строку на 10 цифр
    mov edi, esp       ; (по числу 10-ичных разрядов в 32-битном числе) 
    add edi, 11          ; + знак (для чисел со знаком)
    mov byte ptr[edi], 0  ; + /0 на конце, чтобы обозначить конец строки 
    

    mov eax, value ; value - исходное число

    ; для беззнаковых чисел вся эта часть (до метки convert) не нужна
    mov esi, eax ; в esi будет храниться знак
    shr esi, 31
    test esi, esi ; проверяем является ли число отрицательным
    jz convert ; если нет - переходим сразу к конвертации
    mov ecx, 0 ; если да - делаем его положительным
    sub ecx, eax
    mov eax, ecx

    convert:
    mov ecx, 10
    loop_begin:
    sub edi, 1 ; запись идёт с конца, поэтому указатель сдвигается к началу
    xor edx, edx
    div ecx ; делим value на 10, в остатке получаем младший разряд
    add edx, '0' ; конвертируем его в цифру
    mov byte ptr[edi], dl ; записываем цифру в буфер
    cmp eax, 0 ; проверяем все ли разряды вычислены
    jg loop_begin ; для беззнаковых - ja

    ; добавляем знак "-", если нужно (только для чисел со знаком)
    test esi, esi
    jz done
    sub edi, 1
    mov byte ptr[edi], '-'

    done:
    ; строка готова , указатель на неё в edi
    ; в этом месте должен быть вывод на экран

    ; потом удаляем буфер, когда он уже не нужен
    add esp, 12


Log in to reply
 


Suggested Topics

  • 2
  • 2
  • 2
  • 2
  • 2
  • 2
  • 2
  • 2
  • 2
  • 2
  • 2
  • 2
  • 2
  • 2
  • 2