Доброго дня.
Вчера, пока писал, обратил внимание на нюанс, и поэтому хочу задать вопрос: кто должен сохранять актуальные значения регистров? Функция, которую вызывают? Или вызывающая сторона?
Может я уже подзабыл, но сам всегда сохранял внутри функции те регистры, которые использовал, чтобы была прозрачность для программы.
print_digit:
    push      eax
    push      ecx; Вот это было добавлено, так как >>
    mov       eax, DWORD line
    add       eax, edx
    push      DWORD 0
    push      DWORD written
    push      DWORD 1
    push      eax
    push      DWORD [stdout]
    call      _WriteConsoleA@20; >> здесь изменяется ecx.
    pop       ecx; А здесь я восстанавливаю его прежнее значение, чтобы
                 ; не сбить вызывающую программу.
    pop       eax
    ret