Здравствуйте ALL
Я могу объяснить.
Итак,
допустим, что используется конвенция stdcall
Перепишем выражение...
a1.f1(z1(), 1).f2(z2(), 2).f3(z3(), 3)
-- для наглядности переименовал ++z и f
a2 = f1(z1(), 1)
a3 = f2(z2(), 2)
a4 = f3(z3(), 3)
а теперь - будем хранить временные значения (а2, а3) на стеке
команда стек
===============+==================
push 3 | 3
push & call z3 | z3 3
pubh 2 | 2 z3 3
push & call z2 | z2 2 z3 3
push 1 | 1 z2 2 z3 3
push & call z1 | z1 1 z2 2 z3 3
push a1 | a1 z1 1 z2 2 z3 3 -- наконец-то! можем положить a
call f1 | a2 z2 2 z3 3
call f2 | a3 z3 3
call f3 | a4
Вот так вот, любители cin/cout!
Для паскаля, кстати, (где другая конвенция), все не так ужасно
push a1 | a1
push & call z1 | z1 a1
push 1 | 1 z1 a1
call f1 | a2
push & cll z2 | z2 a2
push 2 | 2 z2 a2
call f2 | a3
etc...
Если бы компилятор думал своей головой и создал временную локальную переменную, то можно было бы и stdcall соблюсти:
mov temp, a1 | | a1
push & call z1 | z1 | a1
push 1 | 1 z1 | a1
push temp | a1 1 z1 | a1
call f1 | a2 | a1
pop temp | | a2
etc...
Но для дебага жизнь кажется более простой, у него есть дерево выражения, которое надо перевести в операции push и call