Я прошу прощения за каждую ошибку, которую я мог сделать с английским (это не мой родной язык).
Я пытался напечатать число больше 9. Я разделил его на каждую цифру, а затем я печатаю их одну за другой.
Код работает, но он также печатает другие символы, прежде чем выдавать ошибку и перестать работать.
Вот код:
.386
.model flat,stdcall
option casemap:none
include \masm32\include\windows.inc
include \masm32\include\user32.inc
includelib \masm32\lib\user32.lib
include \masm32\include\kernel32.inc
includelib \masm32\lib\kernel32.lib
include \masm32\include\masm32.inc
includelib \masm32\lib\masm32.lib
.data
textNum dd "c",0 ;variable i use to display every single digit (initialized with a casual character)
num dd 25678 ;number to print
divisor dd 10
.code
start:
mov eax, num
xor ecx,ecx ;ecx is the digits counter
lea esi, textNum ;mov in esi the adress of textNum
ciclo:
cmp eax,0 ;when the dividend is 0 exit
jbe print
xor edx,edx ;reset edx to take the remainder
div divisor
push edx ;push the remainder
add cl,1 ;increase digits counter
jmp ciclo
print:
cmp cl,0 ;since the counter is greater than 0
jbe return
xor eax,eax
pop eax ;pop in eax the digit i want to print
add eax,48 ;add 48 (ascii value)
mov [esi], eax ;move the digit inside the variable
invoke StdOut, addr textNum ;print the variable
sub cl, 1 ;dec counter
jmp print
return:
invoke ExitProcess, 0
end start
Вот скриншот
Номер правильный, но после этого есть еще много всего ... Почему это происходит и как я могу избежать этого?
EDIT:
Я также пытался использовать массив без изменения остальной части кода. Первый элемент - это тот, который я изменяю, а второй - символ-терминатор (всегда 0):
;textNum dd "c",0 ;variable i use to display every single digit (initialized with a casual character)
textNum dd 2 dup(0)
Но это все еще создает проблемы