Печать Int (или Int в строку)
Я ищу способ напечатать целое число на ассемблере (компилятор, который я использую - NASM для Linux), однако после некоторых исследований я не смог найти действительно жизнеспособного решения. Мне удалось найти описание базового алгоритма для этой цели, и на основе этого я разработал этот код:
global _start
section .bss
digit: resb 16
count: resb 16
i: resb 16
section .data
section .text
_start:
mov dword[i], 108eh ; i = 4238
mov dword[count], 1
L01:
mov eax, dword[i]
cdq
mov ecx, 0Ah
div ecx
mov dword[digit], edx
add dword[digit], 30h ; add 48 to digit to make it an ASCII char
call write_digit
inc dword[count]
mov eax, dword[i]
cdq
mov ecx, 0Ah
div ecx
mov dword[i], eax
cmp dword[i], 0Ah
jg L01
add dword[i], 48 ; add 48 to i to make it an ASCII char
mov eax, 4 ; system call #4 = sys_write
mov ebx, 1 ; file descriptor 1 = stdout
mov ecx, i ; store *address* of i into ecx
mov edx, 16 ; byte size of 16
int 80h
jmp exit
exit:
mov eax, 01h ; exit()
xor ebx, ebx ; errno
int 80h
write_digit:
mov eax, 4 ; system call #4 = sys_write
mov ebx, 1 ; file descriptor 1 = stdout
mov ecx, digit ; store *address* of digit into ecx
mov edx, 16 ; byte size of 16
int 80h
ret
C # версия того, чего я хочу добиться (для наглядности):
static string int2string(int i)
{
Stack stack = new Stack();
string s = "";
do
{
stack.Push((char)((i % 10) + 48));
i = i / 10;
} while (i > 10);
stack.Push((char)(i + 48));
foreach (char c in stack)
{
s += c;
}
return s;
}
Проблема в том, что он выводит символы в обратном порядке, поэтому для4238
, выход8324
, Сначала я подумал, что мог бы использовать стек x86 для решения этой проблемы, вставить цифры, вытащить их и распечатать в конце, однако, когда я попытался реализовать эту функцию, она провалилась, и я больше не мог получить выход.
В результате я немного озадачен тем, как я могу реализовать стек в этом алгоритме для достижения моей цели, то есть печати целого числа. Я также был бы заинтересован в более простом / лучшем решении, если оно доступно (так какЭто одна из моих первых программ на ассемблере).