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 (сдвиг на 2 = умножение на 4)
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 := x^2+4xy+y
mov rbx,rdx ; y := x+y
jmp g2
g1: mov rax,rdx ; x > y: y - минимум, x := x+y
mov rbx,rcx ; y := x^2+4xy+y
g2: mov [x],rax ; сохраняем новое x
mov [y],rbx ; сохраняем новое y
pop rbx
ret ; в rax - новое x (его и выведет программа)