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],ecxmov eax, 4
mov ebx, 1
mov ecx, value
mov edx, 5
int 80hmov 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, ecxconvert:
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