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