I can not understand how I can output a number not included in ASCII . For example, if I have the number 5, then I just translate it into ASCII and output it, but what if the number is 99992 (on clean, without any macros and buns)?

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 

I use NASM, I launch on linux

  • Break the characters and translate in ASCII. So will not work? - Bogdan Gudyma
  • one
    What kind of assembler? Which processor? It is necessary to write a converter from hex to ascii, a certain analogue of itoa() . Or somewhere to find ready and not suffer. - tum_
  • Yes, and it would be possible to squeeze this super program into the question. - MolbOrg
  • @ A.Toumantsev ready) - Nick Volynkin
  • What is the axis? If Venda - you can use itoa. - Vladimir Martyanov

1 answer 1

Here, as an 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