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 - минимальное значение