Online Compiler Nasm

extern io_get_dec, io_print_dec, io_newline section .bss x resd 1 y resd 1 z resd 1 ;место для окончательного 96битного произведения section .text global main main: call io_get_dec ;в eax первое число a mov ebx, eax ;переложили a в ebx call io_get_dec ;eax второе число b mul ebx ;помножили a и b - результат 64 бита mov esi, edx ;старшие mov edi, eax ;младшие call io_get_dec mov ebx, eax ;берем чиселку c mov eax, esi ;вытаскиваем старшие биты произведения mul ebx ;множим - получаем еще 64 бита (но типо старшие) mov [z], edx ;кладем старшие биты mov [y], eax ; и средние mov eax, edi mul ebx ;тащим младшую часть произведения предыдущего и перемножаем add [y], edx mov [x], eax ;учитываем переполнение adc [z], 0 call io_get_dec mov ebx, eax ; читаем делитель mov edx, 0 mov eax, [z] ;тянем старший бит произведения div ebx mov eax, [y] div ebx mov eax, [x] div ebx io_print_dec xor eax, eax ret
1) Этот код считывает четыре 32-битных числа, вычисляет произведение первых трёх чисел (как 96-битное значение), затем делит это произведение на четвёртое число и выводит результат деления.

2) Подсказки:
- Обрати внимание на порядок обработки частей 96-битного произведения при делении: операция `div` использует пару `edx:eax`, поэтому важно, чтобы в `edx` был правильный остаток от предыдущего деления.
- После умножения `mul ebx` в строке 34 результат находится в `edx:eax`, но сложение `add [y], edx` может вызвать переполнение — для его учёта используется `adc [z], 0`.