Загрузка данных


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