Нужно написать код, который выводит количество чисел с нечётным количеством цифр. Но мой код ничего не выводит на экран. Помогите, пожалуйста

default rel

section .data
    nums        db 12, 45, 67, 89
    nums_len    equ $ - nums
    out_msg     db "Number of elements with odd digits: ", 0
    out_len     dq ($ - out_msg)  ; Правильно сохраняем длину строки out_msg
    formatStr   db "%d", 10, 0    ; Форматная строка для wsprintf с новой строкой

section .bss
    handle      resq 1
    count       resd 1
    buffer      resb 64

section .text
    extern GetStdHandle
    extern WriteConsoleA
    extern wsprintfA
    extern ExitProcess

    global main

main:
    sub     rsp, 40                  ; Выделение места для shadow space

    ; Получение дескриптора стандартного устройства вывода
    mov     ecx, -11                 ; STD_OUTPUT_HANDLE
    call    GetStdHandle
    mov     [handle], rax

    ; Подсчет чисел с нечетным количеством цифр
    lea     rsi, [nums]
    mov     ecx, nums_len
    xor     edi, edi

count_loop:
    movzx   rax, byte [rsi]
    test    rax, rax
    jz      next_number              ; Пропуск, если число нулевое
    mov     ebx, 10
    xor     rdx, rdx

count_digits:
    div     rbx
    inc     rdx                      ; Инкремент счетчика цифр
    test    rax, rax
    jnz     count_digits

    test    rdx, 1
    jnz     increment_count
    jmp     short next_number

increment_count:
    inc     edi

next_number:
    inc     rsi
    loop    count_loop

    ; Форматирование и вывод количества
    mov     [count], edi
    lea     rcx, [buffer]
    mov     rdx, formatStr
    mov     r8d, [count]
    call    wsprintfA

    ; Вывод сообщения
    mov     rcx, [handle]
    lea     rdx, [out_msg]
    mov     r8, qword [out_len]      ; Исправленный доступ к длине строки
    lea     r9, [rsp+28]
    call    WriteConsoleA

    ; Вывод числа
    lea     rdx, [buffer]
    mov     r8, qword 64             ; Максимальный размер буфера
    lea     r9, [rsp+28]
    call    WriteConsoleA

    add     rsp, 40                  ; Возврат выделенного места
    xor     ecx, ecx                 ; Код выхода 0
    call    ExitProcess

Ответы (1 шт):

Автор решения: viki

Программа составлена не по правилам Windows API. x64 calling convention почитайте.

→ Ссылка