сборка распечатать n-значный номер - PullRequest
0 голосов
/ 24 апреля 2018

Я прошу прощения за каждую ошибку, которую я мог сделать с английским (это не мой родной язык).

Я пытался напечатать число больше 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)

Но это все еще создает проблемы

1 Ответ

0 голосов
/ 24 апреля 2018

Я попытался изменить регистр, используемый в качестве счетчика (ecx) с edi, и теперь он работает.Возможно, StdOut использует ecx и меняет свое значение

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...