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


global PrintValue
section .note.GNU-stack
section .data
x dq 1
y dq 2
section .text
PrintValue:
        push rbx
        mov rax,[x]        ; rax = x
        mov rbx,[y]        ; rbx = y

        ; rcx = x^2 + 4xy + y  (по исходным x, y)
        mov rcx,rax
        imul rcx,rax       ; rcx = x*x
        mov rdx,rax
        imul rdx,rbx       ; rdx = x*y
        shl rdx,2          ; rdx = 4*x*y
        add rcx,rdx        ; rcx = x^2 + 4xy
        add rcx,rbx        ; rcx = x^2 + 4xy + y

        ; rdx = x + y
        mov rdx,rax
        add rdx,rbx

        cmp rax,rbx        ; сравниваем исходные x и y
        jg g1              ; если x > y -> переход
        mov rax,rcx        ; x <= y: x := x^2+4xy+y
        mov rbx,rdx        ;         y := x+y
        jmp g2
g1:     mov rax,rdx        ; x > y:  x := x+y
        mov rbx,rcx        ;         y := x^2+4xy+y
g2:     mov [x],rax        ; сохраняем новое x
        mov [y],rbx        ; сохраняем новое y

        ; выводим минимум из новых x и y
        cmp rax,rbx
        jle g3             ; если rax <= rbx, в rax уже минимум
        mov rax,rbx        ; иначе минимум в rbx
g3:     pop rbx
        ret                ; в rax - минимальное значение