Mihail писал(а):
Мне трудно разобраться с твоей программой, но здесь я вижу присвоение
глобальным ячейкам. (Почему-то оптимизатор не сработал.)
Я не могу назвать причину - времени, серьезно разбираться, нет.
... может оптимизатор не любит перескоков указателя компиляции назад по памяти?
вот Михаил тебе для понимания того, как формируется код локально-именованных слов
( и в том числе локально-именованных переменных - на самом деле они конечно глобальны,
но из-за локального их именования доступа к ним как к глобальным переменным - нет)
Код:
\ диагональ треугольника по катетам
: diag ( a b -- d)
b! a!
^2( DUP * ) \ квадрат числа
sqrt( $ -4 @P=A $ -4 0=@P \ квадр. корень числа
0SQRT
$ -4 @P=0- $ -4 A=@P )
a ^2 b ^2 + sqrt ;
STARTLOG
lcode DIS
SEE diag
123 456 diag
лог
Код:
5AF574 8945FC MOV FC [EBP] , EAX \ параметр b положить на стек из ячейки памяти
5AF577 A1ACF55B00 MOV EAX , 5BF5AC ( ldata+5 )
5AF57C 8D6DFC LEA EBP , FC [EBP]
5AF57F C3 RET NEAR
5AF580 8905ACF55B00 MOV 5BF5AC ( ldata+5 ) , EAX \ параметр b снять со стека и положить в ячейку
5AF586 8B4500 MOV EAX , 0 [EBP]
5AF589 8D6D04 LEA EBP , 4 [EBP]
5AF58C C3 RET NEAR
5AF58D 8945FC MOV FC [EBP] , EAX \ параметр a положить на стек из ячейки памяти
5AF590 A1B0F55B00 MOV EAX , 5BF5B0 ( ldata+9 )
5AF595 8D6DFC LEA EBP , FC [EBP]
5AF598 C3 RET NEAR
5AF599 8905B0F55B00 MOV 5BF5B0 ( ldata+9 ) , EAX \ параметр a снять со стека и положить в ячейку
5AF59F 8B4500 MOV EAX , 0 [EBP]
5AF5A2 8D6D04 LEA EBP , 4 [EBP]
5AF5A5 C3 RET NEAR
5AF5A6 F7E8 IMUL EAX \ квадрат числа
5AF5A8 C3 RET NEAR
5AF5A9 8945FC MOV FC [EBP] , EAX \ кв. корень числа
5AF5AC DB45FC FILD DWORD FC [EBP]
5AF5AF D9FA FSQRT
5AF5B1 DB5DFC FISTP DWORD FC [EBP]
5AF5B4 8B45FC MOV EAX , FC [EBP]
5AF5B7 C3 RET NEAR
CODE diag
5D0283 8905ACF55B00 MOV 5BF5AC ( ldata+5 ) , EAX
5D0289 8B4500 MOV EAX , 0 [EBP]
5D028C 8D6D04 LEA EBP , 4 [EBP]
5D028F 8905B0F55B00 MOV 5BF5B0 ( ldata+9 ) , EAX
5D0295 8B4500 MOV EAX , 0 [EBP]
5D0298 8D6D04 LEA EBP , 4 [EBP]
5D029B 8945FC MOV FC [EBP] , EAX
5D029E A1B0F55B00 MOV EAX , 5BF5B0 ( ldata+9 )
5D02A3 8D6DFC LEA EBP , FC [EBP]
5D02A6 E8FBF2FDFF CALL 5AF5A6 ( lcode+37 )
5D02AB 8945FC MOV FC [EBP] , EAX
5D02B3 8D6DFC LEA EBP , FC [EBP]
5D02B6 E8EBF2FDFF CALL 5AF5A6 ( lcode+37 )
5D02BB 034500 ADD EAX , 0 [EBP]
5D02BE 8D6D04 LEA EBP , 4 [EBP]
5D02C1 E8E3F2FDFF CALL 5AF5A9 ( lcode+3A )
5D02C6 C3 RET NEAR
END-CODE
( 68 bytes, 18 instructions )
Ok ( 472 )
ps.
1. В область lcode компилируется код локально-именованных слов и переменных,
инлайнер часть этого кода тащит в словарь, часть кода идет в виде CALL addr.
2. Данные лок-именованных переменных лежат в области ldata,
указатель ldhere по мере введения таких переменных ползет в сторону больших адресов.