section .data
; Входные данные
x: dq 2
y: dq 4
z: dq 6
; Формат для вывода (функция printf из C-библиотеки)
fmt: db "Result: %ld", 10, 0
section .text
global main
extern printf
main:
push rbp
mov rbp, rsp
; =========================================================
; 1. Первое слагаемое: 42 * x^2 * y * z
; =========================================================
mov rax, [x]
imul rax, [x] ; rax = x^2 (4)
imul rax, 42 ; rax = 42 * x^2 (168)
imul rax, [y] ; rax = 42 * x^2 * y (672)
imul rax, [z] ; rax = 42 * x^2 * y * z (4032)
mov rbx, rax ; Сохраняем первое слагаемое в rbx (rbx = 4032)
; =========================================================
; 2. Второе слагаемое: 30 * x * (x + 2y) / (6x - y)
; =========================================================
; Считаем числитель: 30 * x * (x + 2y)
mov rax, [y]
shl rax, 1 ; rax = 2 * y (8)
add rax, [x] ; rax = x + 2y (10)
imul rax, [x] ; rax = x * (x + 2y) (20)
imul rax, 30 ; rax = 30 * x * (x + 2y) (600)
; Считаем знаменатель: 6x - y
mov rcx, [x]
imul rcx, 6 ; rcx = 6 * x (12)
sub rcx, [y] ; rcx = 6x - y (8)
; Делим числитель на знаменатель (600 / 8)
cqo ; Расширяем rax до rdx:rax перед делением idiv
idiv rcx ; rax = rax / rcx (75)
add rbx, rax ; Прибавляем результат к общей сумме (rbx = 4032 + 75 = 4107)
; =========================================================
; 3. Третье слагаемое: (2x - y^2)
; =========================================================
mov rax, [x]
shl rax, 1 ; rax = 2 * x (4)
mov rcx, [y]
imul rcx, [y] ; rcx = y^2 (16)
sub rax, rcx ; rax = 2x - y^2 (4 - 16 = -12)
add rbx, rax ; Прибавляем к общей сумме (rbx = 4107 + (-12) = 4095)
; =========================================================
; Вывод результата
; =========================================================
mov rdi, fmt ; 1-й аргумент для printf (строка формата)
mov rsi, rbx ; 2-й аргумент для printf (значение)
xor rax, rax ; 0 векторных регистров для printf
call printf
; Завершение программы
mov rax, 0
mov rsp, rbp
pop rbp
ret