Online Compiler Nasm

section .data ; Формат ввода: 6 чисел через пробел input_fmt db "%d %d %d %d %d %d", 0 ; Формат вывода: одно число и новая строка output_fmt db "%d", 10, 0 section .bss ; Переменные для хранения количества шаров ; A, B, C - первая корзина ; D, E, F - вторая корзина a resd 1 b resd 1 c resd 1 d resd 1 e resd 1 f resd 1 section .text global main extern scanf extern printf main: ; --- Пролог (настройка стека) --- push ebp mov ebp, esp ; Сохраним регистр ebx, так как будем его использовать (callee-saved) push ebx ; --- Ввод данных --- ; scanf("%d %d %d %d %d %d", &a, &b, &c, &d, &e, &f) ; Аргументы в стек кладутся в обратном порядке push f push e push d push c push b push a push input_fmt call scanf add esp, 28 ; Очистка стека: 7 аргументов * 4 байта = 28 ; --- Логика решения --- ; Формула: (A+B+C)*(D+E+F) - (A*D + B*E + C*F) ; 1. Считаем "плохие" пары (одинакового цвета) ; Красные: A * D mov ecx, [a] imul ecx, [d] ; ecx = A * D ; Синие: B * E mov eax, [b] imul eax, [e] ; eax = B * E add ecx, eax ; ecx = (A*D) + (B*E) ; Зеленые: C * F mov eax, [c] imul eax, [f] ; eax = C * F add ecx, eax ; ecx теперь хранит сумму ВСЕХ пар одинакового цвета ; 2. Считаем общее количество комбинаций ; Сумма шаров в 1-й корзине (A+B+C) mov eax, [a] add eax, [b] add eax, [c] ; eax = Сумма1 ; Сумма шаров во 2-й корзине (D+E+F) mov ebx, [d] add ebx, [e] add ebx, [f] ; ebx = Сумма2 ; Всего комбинаций: Сумма1 * Сумма2 imul eax, ebx ; eax = Общее число пар ; 3. Вычитаем "плохие" из общего sub eax, ecx ; eax = Ответ ; --- Вывод результата --- push eax push output_fmt call printf add esp, 8 ; Очистка стека: 2 аргумента * 4 байта = 8 ; --- Эпилог (выход) --- xor eax, eax ; return 0 pop ebx ; Восстанавливаем ebx mov esp, ebp pop ebp ret
1) Этот код на NASM32 вычисляет количество способов выбрать два шара разного цвета из двух корзин. В первой корзине есть шары трёх цветов (A, B, C), во второй — тоже трёх цветов (D, E, F). Программа считывает шесть чисел, вычисляет общее количество пар (A+B+C)*(D+E+F) и вычитает из него количество "плохих" пар одинакового цвета (A*D + B*E + C*F). Результат выводится на экран.

2) Подсказки:
- Обрати внимание на порядок аргументов для `scanf`: адреса переменных передаются в обратном порядке, а форматная строка — последней в стеке перед вызовом.
- При вычислениях используй регистры `eax`, `ebx` и `ecx` для промежуточных результатов, как показано в коде, чтобы не потерять данные.