Нужно написать код, который выводит количество чисел с нечётным количеством цифр. Но мой код ничего не выводит на экран. Помогите, пожалуйста
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 почитайте.