Online Compiler Nasm

section .data fmt_in db '%d %d %d %d %d %d', 0 fmt_out db '%d', 0 section .bss N resd 1 M resd 1 K resd 1 D resd 1 X resd 1 Y resd 1 section .text global main extern scanf, printf main: push ebp mov ebp, esp ; ---------- ВВОД ---------- push Y push X push D push K push M push N push fmt_in call scanf add esp, 28 ; ---------- УРОЖАЙ ---------- mov eax, [N] imul eax, [M] imul eax, [K] mov ebx, [D] xor edx, edx div ebx ; eax = total / D, edx = total % D ; ---------- КОРОБКИ: total / D + (edx > 0 ? 1 : 0) ---------- ; edx = остаток, превращаем в 1 если >0, иначе 0 neg edx sbb edx, edx ; edx = -1 если остаток >0, иначе 0 neg edx ; edx = 1 если остаток >0, иначе 0 add eax, edx mov ecx, eax ; ecx = всего коробок ; ---------- ВРЕМЯ ---------- mov eax, [X] imul eax, 60 add eax, [Y] sub eax, 6*60 ; 360 минут = 6:00 sar eax, 31 ; eax = 0 если >=6, -1 если <6 not eax and eax, 1 ; eax = 1 если ночь, 0 если день mov edx, eax ; ---------- ЗАДЕРЖАННЫЕ ---------- ; всего коробок ecx, номера 0..ecx-1 ; кратные 3: 0,3,6,... → количество = (ecx + 2) / 3 mov eax, ecx add eax, 2 xor edx, edx mov ebx, 3 div ebx ; eax = (ecx + 2) / 3 ; если ночь → задержанные 0 mov ebx, eax mov eax, [X] sub eax, 6 sar eax, 31 not eax and eax, 1 xor eax, 1 ; eax = 1 если день, 0 если ночь imul ebx, eax ; ebx = задержанные (0 если ночь) ; ---------- ПРОПУЩЕННЫЕ ---------- sub ecx, ebx ; ---------- ВЫВОД ---------- push ecx push fmt_out call printf add esp, 8 xor eax, eax mov esp, ebp pop ebp ret
1) Этот код вычисляет количество пропущенных коробок на конвейере. Программа считывает шесть чисел: N, M, K, D, X, Y. Затем вычисляет общий урожай, количество коробок, определяет, день сейчас или ночь (сравнивая время X:Y с 6:00), находит количество задержанных коробок (каждая третья, но только днём) и выводит количество пропущенных (всего коробок минус задержанные).

2) Подсказки:
- Обрати внимание на инструкции `sar eax, 31` и последующие операции — это распространённый приём для получения значения 0 или -1 в зависимости от знака числа, который затем преобразуется в логический флаг (0 или 1).
- В части расчёта задержанных коробок используется формула `(ecx + 2) / 3` для подсчёта количества чисел, кратных 3, в диапазоне от 0 до ecx-1. Убедись, что понимаешь, почему это работает.