Online Compiler Nasm

extern printf, scanf section .data fmt_scan db `%d`, 0 fmt_print db `%d`, 10, 0 section .bss a resd 1 section .text global main main: push edi mov edi, esp and esp, ~15 sub esp, 8 push a push fmt_scan call scanf add esp, 16 mov eax, 0 mov ecx, 1 .loop: add eax, ecx add ecx, 1 cmp ecx, [a] jle .loop .end: sub esp, 8 push eax push fmt_print call printf add esp, 16 mov esp, edi pop edi xor eax, eax ret
Этот код вычисляет сумму чисел от 1 до значения, которое вводит пользователь. Программа считывает одно целое число, затем в цикле накапливает сумму и выводит результат.

- В цикле вы используете `cmp ecx, [a]` и `jle .loop`. Обратите внимание, что `jle` означает "прыгнуть, если меньше или равно". Когда `ecx` становится равным `[a]`, вы всё ещё выполняете тело цикла, а затем проверяете снова. Подумайте, нужно ли вам выполнять итерацию для значения, равного `[a]`, или цикл должен остановиться раньше.
- После вызова `scanf` вы добавляете 16 к `esp`, но перед этим вы выделили 8 байт и положили два аргумента (каждый по 4 байта). Проверьте, сколько байт вы на самом деле выделили и сколько нужно убрать со стека после вызова.